一、准备工作
由于本人采用的是正点原子探索版开发板,所以文案都以此开发板为基础书写,读者需自行斟酌。本文内容需提前安装 MDK5 ,并下载STM32官方固件库(F4系列 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0)。
二、文件分类
一个好的程序员一定有着良好的编程习惯,要养成良好的编程习惯,首先就要学会将一个工程项目文件进行合理分类,一个清晰明了的项目分类才能给人耳目一新。
在这里我将献上自己的文件分类方式,以供大家参考学习。
初始模板文件分为 5 个文件夹:
- Core文件夹下存放了与STM32内核相关的驱动文件和启动文件,以及一些官方代码中的系统文件。
- Driver文件夹存放的是用户自己编写的用于驱动外设的相关 .c 文件和 .h 文件。
- MDK文件夹是工程项目文件夹,存放了跟工程项目相关的生成文件,非工程源码。
- StdLib文件夹下存放的是官方固件库源码,src 存放的是固件库的 .c 文件, inc 存放的是对应的 .h 文件。
- User文件夹属于用户文件夹,主要存放的是用户自我编写,非官方文件也非外设驱动程序且常用文件,如main.c、以及后续讲到的有关串口和延时的文件。
三、工程模板制作
1、文件准备工作
-
将官方固件库下 \Libraries\STM32F4xx_StdPeriph_Driver 文件夹中的 src 文件夹和 inc 文件夹复制到工程文件夹 StdLib 下;
-
将 \Libraries\CMSIS\Device\ST\STM32F4xx\Include 目录下的 stm32f4xx.h 和system_stm32f4xx.h 文件拷贝到 Core 文件夹下;
-
将 \Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates目录下的system_stm32f4xx.c文件拷贝到Core文件夹下;
-
将 \Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm 下startup_stm32f40_41xxx.s 启动文件拷贝到 Core 文件夹下;
-
将 \Libraries\CMSIS\Include 下 core_cm4.h、core_cmFunc.h、core_cmInstr.h、core_cmSimd.h 4个文件拷贝到 Core 文件夹下。
-
将 \Project\STM32F4xx_StdPeriph_Templates 文件夹下 stm32f4xx_conf.h、stm32f4xx_it.c、stm32f4xx_it.h、main.c 4个文件拷贝到 User 文件夹下。
-
给 Driver 文件夹下新建 src文件夹和 inc 文件夹。
此时 Core 目录下文件情况如下:
此时 User 目录下文件情况如下:
2、新建工程
打开 MDK5 软件,选择 新建工程 ,创建工程位置选择 MDK , Device界面选择相应型号芯片,MDK5会弹出 Manage Run-Time Environment 对话框,直接点 取消 即可。
3、添加工程文件
接下来便是添加工程文件了,右键点击 Target1,选择 Manage Project Items,或点击快捷工具栏 Manage Project Items 按钮,进入 Manage Project Items 页面。更改名称,按照文件目录规格添加分组和相应文件。要特别注意不要遗漏 startup_stm32f40_41xxx.s 启动文件。
4、添加头文件 .h文件
右键点击 Template,选择 Options for Target ‘Template’,或点击快捷工具栏 Options for Target ‘Template’ 按钮(魔术棒),进入 Options for Target ‘Template’ 页面。选择 C/C++ 选项,点击 Include Paths 右侧 … 按钮添加相应头文件 .h 路径。
5、编译改错
将 main.c 文件内容完全删除,只留下 main 函数本身。点击编译按钮进行工程编译(可能需要一定时间)。
编译之后出现几个错误,定位到第一个错误,双击即可定位到错误在文件中位置。根据错误信息可知没有选择芯片类型。通过观察错误代码以上部分内容也可知其含义。为了不修改官方代码,我们在 Options for Target ‘Template’ 页面 C/C++ 选项中 Define 栏填入 STM32F40_41xxx,再编译。
再定位到第一个错误,由于我没有使用 main.h 文件,所以直接删除该代码,同理也删除在 stm32f4xx_it.c 中使用的函数 TimingDelay_Decrement() 代码。再编译。
发现大量警告,且都是说 "assert_param"未声明,官方固件库代码 “assert_param” 是在 stm32f4xx_conf.h 中声明的,我们会发现,工程中并没有添加 stm32f4xx_conf.h 文件,定位到 stm32f4xx.h 文件12027行,我们发现需要额外定义 USE_STDPERIPH_DRIVER ,与前面相同,我们将其定义到 Options for Target ‘Template’ 中,注意两者之间要添加英文 ‘,’ 隔离。再编译。没错误没警告。
6、修改参数
修改 system_stm32f4xx.c 文件的只读权限,定位到371行,将 PLL_M 参数设置为 8,同时修改 stm32f4xx.h 文件的只读权限,定位到144行,将 HSE_VALUE 参数设置为 8000000 ,因为我采用了 外部时钟8MHz,系统时钟168MHz。然后将文件修改为只读权限,以防止后期不注意修改了官方文件。
7、程序测试
至此,工程模板算是基本建立完成,可以编写一个基本代码测试一番。