STM32F4新建寄存器版本MDK(Keil5)工程(正点原子)

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

按照下图的方式操作
在这里插入图片描述

  1. 点击魔术棒,选择 Target 选项卡
  2. 设置外部晶振为 8Mhz(是灰色就不用管)
  3. 使用 AC5 编译器

下面是 AC5AC6 的对比

对比项AC5AC6说明
中文支持较好较差AC6 对中文支持极差,goto definition 无法使用,误报等
代码兼容性较好较差AC6 对某些代码优化可能导致运行异常,需慢慢调试
编译速度较慢较快AC6 编译速度比 AC5 快
语法检查一般严格AC6 语法检查非常严格,代码严谨性较好

由于 AC5 对中文支持比较好,且兼容性相对好一点, 我们使用 AC5编译器 。正点原子的源码绝大部分也支持 AC6 编译器,不过在选项卡设置上稍有差异,具体差异如下

对比项AC5AC6说明
Target选择 AC5 编译器选择 AC6 编译器选择对应的编译器
C/C++Misc Controls 无需设置Misc Controls 设置:-Wno-invalid-source-encodingAC6 需设置编译选项以关闭对汉字的错误警告,AC5 则不要
2.4.2 Output

按照下图的方式操作
在这里插入图片描述

  1. 选择 Output 选项卡
  2. 选择 Object 输出文件夹
  3. 选择输出到我们建立的 Output 文件夹
  4. 设置生成 .hex 文件,并且设置输出浏览信息(勾选:Browse Information,用于输出浏览信息,这样就可以使用 go to definition 查看函数 /变量的定义,对我们后续调试代码比较有帮助,如果不需要调试代码,则可以去掉这个勾选,以提高编译速度)
2.4.3 Listing

按照下图的方式操作
在这里插入图片描述

  1. 选择 Listing 选项卡
  2. 选择 Listing 输出文件夹
  3. 选择输出到我们建立的 Output 文件夹

经过 Output 和 Listing 这两步设置,原来存储在 Objects 和 Listings 文件夹的内容(中间文件)就都改为输出到 Output 文件夹了

2.4.4 C/C++

按照下图的方式操作
在这里插入图片描述

  1. 选择 C/C++ 选项卡
  2. 设置全局宏定义 STM32F407xx
  3. 设置了优化等级为 -O0,可以得到最好的调试效果,当然为了提高优化效果提升性能并降低代码量,可以设置 -O1~-O3,数字越大效果越明显,不过也越容易出问题。注意:当使用 AC6 编译器的时候,这里推荐默认使用 -O1 优化
  4. 设置C99模式,即使用 C99 C 语言标准
  5. 点击设置头文件包含路径,如下图
    在这里插入图片描述

上图中我们设置了 4 个头文件包含路径(和正点原子官方设置的路径不一样,因为我新建的 Project 文件夹没有 ARM-MDK 这一层,所以会比正点原子的少了一层,具体路径依自己情况而定),其中 3 个在 Drivers 文件夹下,一个在 User 文件夹下。为了避免频繁设置头文件路径,这里使用了相对路径,看不懂的可以查看这一篇博客:相对路径

2.4.5 Debug

按照下图的方式操作
在这里插入图片描述

  1. 选择 Debug 选项卡
  2. 设置 ST-Link Debugger (我连接的是 ST-Link,具体情况根据自己的来定)
  3. 点击 Setting
  4. 选择 Debug 选项卡
  5. 选择 ST-LINK/V2
  6. 选择 SW
  7. 开发板上电,连接上 ST-Link 可以在这里看到设备信息,说明连接成功

不同的仿真器具体步骤可能有差异

2.4.6 Utilities

按照下图的方式操作
在这里插入图片描述

  1. 选择 Utilities 选项卡
  2. 使用和 Debug 一样的仿真器
  3. 点击 Setting
  4. 选择 Flash Download 选项卡
  5. 全部勾选
  6. Flash 下载算法,是 MDK 默认添加的,如果这里下载算法,则点击⑦处按钮,添加下载算法即可(名字和⑥处的算法名字一样 )
  7. 如果有必要可以添加其他的下载算法

到这里魔术棒的设置就全部完成了,记得保存设置

2.5 添加main.c编写代码

按照下图的方式操作
在这里插入图片描述
在这里插入图片描述

  1. 点击保存
  2. 选择 User 文件夹
  3. 文件名重命名为 main.c 然后保存
  4. 编写(复制)以下的代码
#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 添加到工程文件中去,如下图
在这里插入图片描述

  1. 点击这个按钮
  2. 找到 User
  3. 添加 main.c
  4. 保存修改
  5. 然后编译查看输出,如下图,

在这里插入图片描述
0 Error(s), 0 Warning(s) 😃

3. 下载验证

连接好仿真器,按照下图的方式操作
在这里插入图片描述

  1. 点击下载
  2. 出现这样的字样说明下载完成

开发板实物设置,因为要使用到串口 1 ,所以需要按图示短接 USART1 的跳线帽,使用 USB 连接如图的 USB 接口
在这里插入图片描述
打开串口调试助手
在这里插入图片描述

  1. 设置好对应的串口号
  2. 设置好对应的停止位、数据位、校验位
  3. 打开串口

在这里插入图片描述
每 0.5s 会出现一个字符,并且数字依次增加,与我们编写的代码一致,新建工程到此结束

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天地神仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值