1. 前期准备
1.1 下载 STM32Cube 固件包
1.1.1 ST官网搜索STM32Cube
首先进入ST官网,在搜索栏输入 STM32Cube
找到 STM32CubeF4 点击进去
在这里可以选择版本进行下载,这里我选择1.26.0(后续不使用官方的因为太冗杂了,这里只是作演示用)
选择ACCEPT(若点击后直接开始下载了,则不用管后面的步骤,直接解压即可)
输入自己真实的邮箱地址,然后点击下载
我们可以在邮件中收到这样的一封邮件,然后点击下载
下载完成后解压
1.1.2 正点原子资料
A 盘→8,STM32 参考资料→1,STM32CubeXX固件包
1.2 搭建开发环境
2. 新建寄存器版本MDK工程
首先新建一个文件夹作为项目的根目录,文件夹名字可以自定义,我使用 Template 作为名字,
如图所示
2.1 新建工程文件夹
需要新建下面 5 个文件夹
文件夹名称 | 作用 |
---|---|
Drivers | 存放与硬件相关的驱动层文件 |
Middlewares | 存放中间层文件 |
Output | 存放工程编译输出文件 |
Projects | 存放 MDK 工程文件 |
User | 存放 HAL 库用户配置文件、main.c、中断处理文件,以及分散加载文件等 |
也可以新建一个 readme.txt,最后层级结构如下图所示
2.1.1 Drivers
文件夹名称 | 作用 |
---|---|
BSP | 存放开发板板级支持包驱动代码,如各种外设驱动 |
CMSIS | 存放 CMSIS 底层代码,如启动文件(.s文件)等 |
SYSTEM | 存放正点原子系统级核心驱动代码,如 sys.c、delay.c 和 usart.c 等 |
BSP文件夹需要自己新建,CMSIS 和 SYSTEM 通过拷贝得到,最后的文件夹目录如下图所示
CMSIS 和 SYSTEM 我们可以随便打开一个正点原子的例程(注意是寄存器版本)拷贝过来,这里就不做演示了
2.1.2 Middlewares
该文件夹用于存放正点原子和其他第三方提供的中间层代码(组件/Lib 等), 如: USMART、MALLOC、 TEXT、 FATFS、 USB、 LWIP、各种 OS、各种 GUI 等
2.1.3 Output
该文件夹用于存放编译器编译工程输出的中间文件,比如: .hex、 .bin、 .o 文件等
2.1.4 Projects
该文件夹用于存放编译器(MDK、 IAR 等)工程文件,我们主要用 MDK,为了方便区分, 我们在该文件夹下新建: MDK-ARM 文件夹,用于存放 MDK 的工程文件
2.1.4 User
该文件夹用于存放用户编写的代码,如: main.c 等
2.2 新建工程框架
2.2.1 新建工程
打开 Keil5 ,在上面的工具栏中找到 Project ,然后按照下图操作
然后选择刚刚新建的工程文件夹的 Projects 目录,输入项目名然后保存
2.2.2 选择主控型号
在选择型号的地方选择 STM32F407ZG ,如果这里没有这个型号说明开发环境没有搭建好(没有安装 STM32F4 的 Pack )
这里是让配置一些东西,我们不需要配置直接点击 Cancel
2.2.3 删除文件夹
我们打开之前新建工程的 Projects 目录,发现 Keil5 新建了很多的文件夹/文件
文件夹名称 | 作用 |
---|---|
DebugConfig | 用于存放调试设置信息文件(.dbgconf),不可删除! |
Listings | 用于存放编译过程产生的链接列表等文件 |
Objects | 用于存放编译过程产生的调试信息、.hex、预览、.lib文件等 |
Listings和Objects在后面需要设置到Output文件夹中,所以在这里给删掉,删掉后如下图所示
2.3 添加文件
2.3.1 设置工程名和分组名
点击下图红框中的按钮
在弹出来的窗口中,按照下图的方式设置好工程名字和分组名
然后在 Startup 分组中点击 Add Files
2.3.2 添加启动文件
在下图的层级结构中找到 startup_stm32f407xx
如果打开文件夹没有发现 startup_stm32f407xx ,则在文件类型的地方选择 All files
然后我们可以在左侧看到添加进来的启动文件
我们用不到编译器的内存管理函数,为节省内存,将 Heap_Size 改成 0,如下图
寄存器代码不需要调用SystemInit函数,因此修改Reset_Handler函数,去掉SystemInit调用,如下图(如果是复制正点原子例程的 CMSIS 则不需要修改,因为他已经修改好了)
2.3.3 添加 SYSTEM源码
最后的工程结构如下(readme是顺手加进去的)
2.4 魔术棒设置
为避免编写代码和编译报错,我们需要通过魔术棒对 MDK 工程进行相关设置。在 MDK主界面点击下图红框中的图标(魔术棒图标,即 Options for Target按钮),进入工程设置对话框,我们将进行如下几个选项卡的设置。
Target | 设置使用的编译器版本、外部晶振频率 |
---|---|
Output | 设置Objects输出文件夹、生成.hex文件、输出浏览信息 |
Listing | 设置Listing输出文件夹 |
C/C++ | 设置全局宏定义、优化等级、C99 Mode、设置头文件包含路径 |
Debug | 设置使用的仿真器类型、选择的下载接口等 |
Utilities | 设置下载功能、下载算法、下载算法起始地址和大小等 |
2.4.1 Target
按照下图的方式操作
- 点击魔术棒,选择
Target
选项卡 - 设置外部晶振为
8Mhz
(是灰色就不用管) - 使用
AC5
编译器
下面是 AC5
和 AC6
的对比
对比项 | AC5 | AC6 | 说明 |
---|---|---|---|
中文支持 | 较好 | 较差 | AC6 对中文支持极差,goto definition 无法使用,误报等 |
代码兼容性 | 较好 | 较差 | AC6 对某些代码优化可能导致运行异常,需慢慢调试 |
编译速度 | 较慢 | 较快 | AC6 编译速度比 AC5 快 |
语法检查 | 一般 | 严格 | AC6 语法检查非常严格,代码严谨性较好 |
由于 AC5 对中文支持比较好,且兼容性相对好一点, 我们使用 AC5编译器 。正点原子的源码绝大部分也支持 AC6 编译器,不过在选项卡设置上稍有差异,具体差异如下
对比项 | AC5 | AC6 | 说明 |
---|---|---|---|
Target | 选择 AC5 编译器 | 选择 AC6 编译器 | 选择对应的编译器 |
C/C++ | Misc Controls 无需设置 | Misc Controls 设置:-Wno-invalid-source-encoding | AC6 需设置编译选项以关闭对汉字的错误警告,AC5 则不要 |
2.4.2 Output
按照下图的方式操作
- 选择
Output
选项卡 - 选择 Object 输出文件夹
- 选择输出到我们建立的 Output 文件夹
- 设置生成 .hex 文件,并且设置输出浏览信息(勾选:Browse Information,用于输出浏览信息,这样就可以使用 go to definition 查看函数 /变量的定义,对我们后续调试代码比较有帮助,如果不需要调试代码,则可以去掉这个勾选,以提高编译速度)
2.4.3 Listing
按照下图的方式操作
- 选择
Listing
选项卡 - 选择 Listing 输出文件夹
- 选择输出到我们建立的 Output 文件夹
经过 Output 和 Listing 这两步设置,原来存储在 Objects 和 Listings 文件夹的内容(中间文件)就都改为输出到 Output 文件夹了
2.4.4 C/C++
按照下图的方式操作
- 选择
C/C++
选项卡 - 设置全局宏定义
STM32F407xx
- 设置了优化等级为
-O0
,可以得到最好的调试效果,当然为了提高优化效果提升性能并降低代码量,可以设置-O1~-O3
,数字越大效果越明显,不过也越容易出问题。注意:当使用AC6
编译器的时候,这里推荐默认使用-O1
优化 - 设置
C99模式
,即使用C99
C 语言标准 - 点击设置头文件包含路径,如下图
上图中我们设置了 4 个头文件包含路径(和正点原子官方设置的路径不一样,因为我新建的 Project 文件夹没有 ARM-MDK 这一层,所以会比正点原子的少了一层,具体路径依自己情况而定),其中 3 个在 Drivers 文件夹下,一个在 User 文件夹下。为了避免频繁设置头文件路径,这里使用了相对路径,看不懂的可以查看这一篇博客:相对路径
2.4.5 Debug
按照下图的方式操作
- 选择
Debug
选项卡 - 设置
ST-Link Debugger
(我连接的是ST-Link
,具体情况根据自己的来定) - 点击
Setting
- 选择
Debug
选项卡 - 选择
ST-LINK/V2
- 选择
SW
- 开发板上电,连接上
ST-Link
可以在这里看到设备信息,说明连接成功
不同的仿真器具体步骤可能有差异
2.4.6 Utilities
按照下图的方式操作
- 选择
Utilities
选项卡 - 使用和
Debug
一样的仿真器 - 点击
Setting
- 选择
Flash Download
选项卡 - 全部勾选
Flash
下载算法,是 MDK 默认添加的,如果这里下载算法,则点击⑦处按钮,添加下载算法即可(名字和⑥处的算法名字一样 )- 如果有必要可以添加其他的下载算法
到这里魔术棒的设置就全部完成了,记得保存设置
2.5 添加main.c编写代码
按照下图的方式操作
- 点击保存
- 选择 User 文件夹
- 文件名重命名为 main.c 然后保存
- 编写(复制)以下的代码
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
int main(void)
{
uint8_t t=0;
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(84, 115200); /* 串口初始化为115200 */
while (1)
{
printf("t:%d\r\n", t);
delay_ms(500);
t++;
}
}
然后把 main.c
添加到工程文件中去,如下图
- 点击这个按钮
- 找到
User
组 - 添加
main.c
- 保存修改
- 然后编译查看输出,如下图,
0 Error(s), 0 Warning(s) 😃
3. 下载验证
连接好仿真器,按照下图的方式操作
- 点击下载
- 出现这样的字样说明下载完成
开发板实物设置,因为要使用到串口 1 ,所以需要按图示短接 USART1 的跳线帽,使用 USB 连接如图的 USB 接口
打开串口调试助手
- 设置好对应的串口号
- 设置好对应的停止位、数据位、校验位
- 打开串口
每 0.5s 会出现一个字符,并且数字依次增加,与我们编写的代码一致,新建工程到此结束