通过前面的学习,我们对 STM32 有了个比较清晰的了解,本次我们将讲解新建寄存器库版本 MDK 工程的详细步骤。后期我们基于固件库开发,借助Keil5的环境配置助手界面RTE,不需要进行文件移植,本节的寄存器版本,作为了解内容,学习整个新工程的创建过程。
目录
一、新建一个工程框架
二、添加文件
2.1 添加启动代码
2.2 添加SYSTEM文件
2.3 在工程中建立同名称的分组
三、魔术棒设置
3.1.设置Target选项卡
3.2.设置Output选项卡
3.3.设置Listing选项卡
3.4.设置C/C+ +选项卡
3.5.设置Debug选项卡
3.6.设置Utilities选项卡
四、在test.c中编写代码,编译
一、新建一个工程框架
首先,打开 MDK(以下将 MDK5 简称为 MDK)软件。然后点击 Project→New uVision Project 如图 3.2.1 所示:
弹出如图 3.2.2 所示界面:
在桌面新建一个 TEST 的文件夹,然后在 TEST 文件夹里面新建 USER 文件夹,将工程名字设为 test,保存在这个 USER 文件夹里面,之后,弹出选择器件的对话框,如图 3.2.3 所示。 因为 ALIENTEK 探索者 STM32F4 开发板所使用的 STM32 型号为 STM32F407ZGT6,所以在 这里我们选择 STMicroelectronics→STM32F4 Series→STM32F407→STM32F407ZGT6(如果使 用的是其他系列的芯片,选择相应的型号就可以了,特别注意:一定要安装对应的器件 pack 才会显示这些内容哦!!(我使用的是Keil.STM32F4xx_DFP.1.0.8.pack 这个安装包)
点击 OK,MDK 会弹出 Manage Run-Time Environment 对话框,如图 3.2.4 所示:
这是 MDK5 新增的一个功能,在这个界面,我们可以添加自己需要的组件包括:内核文件(CORE)、启动文件(startup)、以及需要用到的外设,从而方便新建工程,(后面的库函数版本将使用这种方式创建工程,更加方便快捷,如果使用这种方式后,会自动生成一个RTE文件夹)不过这里我们不做介绍。所以在图 3.2.4 所示界面,我们直接点击 Cancel,即可, 得到如图 3.2.5 所示界面:
到这里,我们还只是建了一个框架,还需要添加启动代码,以及.c 文件等,接下来就是添加文件
二、添加文件
启动代码:启动代码是一段和硬件相关的汇编代码。是必不可少的!这代码主要作用如 下:1、堆栈(SP)的初始化;2、初始化程序计数器(PC);3、设置向量表异常事件的入口地 址;4、调用 main 函数。
2.1 添加启动代码
ST 公司为 STM32F40x 和 STM32F41x 系列的 STM32F4 提供了一个共同的启动文件,名字为:startup_stm32f40_41xxx.s。我们开发板使用的是 STM32F407ZGT6,属于 STM32F40x 系列 里面的,所以直接使 startup_stm32f40_41xxx.s 这个启动文件即可。不过这个启动文件,我们做 了一点点修改,具体是 Reset_Handler 函数,该函数修改后代码如下:
这段代码,我们主要加入了开启 STM32F4 硬件 FPU 的代码,以使能 STM32F4 的浮点运 算单元。其中,0xE000ED88 就是协处理器控制寄存器(CPACR)的地址,该寄存器的第 20~23位用来控制是否支持浮点运算,这里我们全设置为 1,以支持浮点运算。另外,寄存器版本,我们还屏蔽了 SystemInit 函数的调用,如果是库函数版本,可以取消这个函数的注释, 并在外部实现SystemInit 函数。
特别注意:我们在汇编代码里面使能了 FPU,所以在 MDK 里面,我们也要设置使用 FPU, 否则可能代码会无法运行,设置方法如下:选择 Options for Target ‘Target1’,打开 Target 选 项卡,在 Code Generation 里面,选择 Use FPU,如图 3.2.6 所示:
这样,MDK 编译生成的代码,就可以直接使用硬件 FPU 了,其实就 2 个步骤:1,设置 CPACR 寄存器 20~23 位全为 1,使能硬件 FPU。2,设置 MDK 选型,选择 Use FPU。另外, 图 3.2.6 中,MDK 默认 STM32F4 外部晶振为 12M,我们板子用的 8M,所以这里设置为 8Mhz。至此,启动文件修改完成设置完成。接下来把这个 startup_stm32f40_41xxx.s 拷贝到刚刚新建的 USER 文件夹里面。 在图 3.2.5 中,我们找到 Target1→Source Group1→双击→设置打开文件类型为 Asm Source file→选择 startup_stm32f40_41xxx.s→点击 Add,如图 3.2.7 所示:
这里看到的 2 个文件夹:Listings 和 Objects,是 MDK5 自行创建的,用于保存编译过程中 生成的一些文件,后续会介绍。添加完后,我们得到如图 3.2.8 所示的界面:
至此,我们就可以开始编写自己的代码了。不过,在此之前,我们先来做两件事:第一件, 先编译一下,看看什么情况?编译后如图 3.2.9 所示:
图 3.2.9 中 1 处为编译当前目标按钮;2 处为全部重新编译按钮(工程大的时候,编译耗时 较久,建议少用)。出错和警告信息在下面的 Bulilt Output 对话框中提示出来了。因为工程中没 有 main 函数,所以报错了。 接下来,第二件事,让我们看看存放工程的文件夹有什么变化?打开我们刚刚建立的TEST\USER 文件夹,可以看到里面多了 2 个文件夹:Listings 和 Objects,如图 3.2.10 所示:
在 USER 文件夹下,startup_stm32f40_41xxx.s(启动文件)和 test.uvprojx(MDK5 工程文 件)是我们必须用到的 2 个文件,然后 Listings 和 Objects 文件夹是 MDK5 自动生成的,如果打开 Listings 和 Objects 文件夹,就可以看到里面多了一些文件,这就是 MDK 编译过程产生的 中间文件,如果工程量大,产生的文件更多(多的可达 100 MB 以上!!)。 MDK5.14 已经默认将这些文件生成在了 Listings 和 Objects 文件夹里面,但是 MDK5.11A 及之前版本是不会自动生成这两个文件夹的,所有中间文件都是生成在工程同面目录下,也就 是 USER 文件夹下,这样会显得比较混乱。 这里,我们不用 MDK5 自己生成的这两个文件夹来存放中间文件,而是在 TEST 目录下新 建一个新的 OBJ 文件夹来存放这些中间文件。这样,USER 文件夹专门用来存放启动文件 (startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,而 OBJ 则用来存放 这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)。然后把 Listings 和 Objects 文件夹里面的东西全部移到 OBJ 文件夹下(当然要先关闭 MDK 软件)。整理后效果 如图 3.2.11 所示:
2.2 添加SYSTEM文件
由于上面我们还没有任何代码在工程里面,这里我们把系统代码 COPY 过来(即 SYSTEM 文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到,不过不要拷贝错了!不要把库函数代码的系统文件夹拷贝到寄存器代码里面用,反之亦然!这些代码在任何 STM32F40x/STM32F41x 的芯片上都是通用的,可以用于快速构建自己的工程,后面会有详细介绍)。完了之后,TEST 文件夹下的文件如图 3.2.12 所示:
2.3 在工程中建立同名称的分组
接下来,便是在工程中建立两个同名称的分组:USER、SYSTEM,我们在 USER 文件夹下面找到 test.uvproj,打开它,然后在 Target 目录树上点击右键 →Manage Project Items,弹出如图 3.2.13 所示对话框:
在上面对话框的中间栏,点新建(用红圈标出)按钮(也可以通过双击下面的空白处实现), 新建 USER 和 SYSTEM 两个组。然后点击 Add Files 按钮,把 SYSTEM 文件夹三个子文件夹里 面的:sys.c、usart.c、delay.c 加入到 SYSTEM 组中。注意:此时 USER 组下还是没有任何文件,得到如图 3.2.14 所示的界面:
点击 OK,退出该界面返回 IDE。这时,我们在 Target1 树下发现多了 2 个组名,就是我们
刚刚新建的 2 个组。如图 3.2.15 所示:
接着,我们新建一个 test.c 文件,并保存在 USER 文件夹下(相当于main.c)。得到如图 3.2.16 所示的界面:
三、魔术棒设置
为避免编写代码和编译报错,我们需要通过魔术棒对 MDK 工程进行相关设置。在 MDK 主界面,点击: (魔术棒图标,即 Options for Target 按钮),进入工程设置对话框,我们将进行如下几个选项卡的设置。
3.1.设置Target选项卡
在魔术棒→Target 选项卡里面,我们进行如图所示设置,下图中,我们设置芯片所使用的外部晶振频率为 8Mhz,选择 ARM Compiler 版本为:Use default compiler version 5(即 AC5 编译器)。
3.2.设置Output选项卡
在魔术棒→Output 选项卡里面,进行如图 所示设置:
注意,我们勾选:Browse Information,用于输出浏览信息,这样就可以使用 go to definition 查看函数/变量的定义,对我们后续调试代码比较有帮助,如果不需要调试代码,则可以去掉这个勾选,以提高编译速度。
3.3.设置Listing选项卡
在魔术棒→Listing 选项卡里面,进行如图 6.1.4.3 所示设置:
经过 Output 和 Listing 这两步设置,原来存储在 Objects 和 Listings 文件夹的内容(中间文 件)就都改为输出到 OBJ文件夹了。
3.4.设置C/C+ +选项卡
在魔术棒→C/C++选项卡里面,进行如图3.2.21 所示设置:因为引入的头文件模块,都需要包含路径,不然编译器无法找到头文件,自然会报错。
在1处设置了全局宏定义:STM32F40_41xxx,用于定义所用 STM32 型号,在 stm32f4xx.h 里 面会用到该宏定义。 在2处设置了优化等级为-O0,可以得到最好的调试效果,当然为了提高优化效果提升性能 并降低代码量,可以设置-O1~-O3,数字越大效果越明显,不过也越容易出问题。注意:当使用 AC6 编译器的时候,这里推荐默认使用-O1 优化。 勾选 C99 模式,即使用 C99 C 语言标准。 图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项, 可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代 码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。在4处,我们可以进行头文件包含路径设置,点击此按钮,进行如图所示设置:在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件 夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后 面会经常用到)。如图 3.2.22 所示:
至此,我们一个完整的 STM32F4 开发工程在 MDK5 下建立了。接下来我们就可以进行调试的配置,然后进行代码下载和验证调试了。
3.5.设置Debug选项卡
在魔术棒→Debug 选项卡里面,进行如图 6.1.4.7 所示设置:
图中,我们选择使用:CMSIS-DAP 仿真器,使用 SW 模式,并设置最大时钟频率为 10Mhz, 以得到最高下载速度。当我们将仿真器和开发板连接好,并给开发板供电以后,仿真器就会找 到开发板芯片,并在 SW Device 窗口显示芯片的 IDCODE、Device Name 等信息(图中⑤处), 当无法找到时,请检查供电和仿真器连接状况。
3.6.设置Utilities选项卡
在魔术棒→Debug 选项卡里面,进行如图 6.1.4.8 所示设置:
这里 MDK5 会根据我们新建工程时选择的目标器件,自动设置 flash 算法。我们使用的是 STM32F407ZGT6,FLASH 容量为 1M 字节,所以 Programming Algorithm 里面默认会有 1M 型 号的 STM32F4xx FLASH 算法。特别提醒:这里的 1M flash 算法,不仅仅针对 1M 容量的 STM32F4,对于小于 1M FLASH 的型号,也是采用这个 flash 算法的。最后,选中 Reset and Run 选项,以实现在编程后自动运行,其他默认设置即可。设置完成之后,如图所示。在设置完之后,点击 OK,然后再点击 OK,回到 IDE 界面。
四、在test.c中编写代码,编译
至此,我们就可以开始编写我们自己的代码了。我们在 test.c 文件里面输入如下代码:
#include "sys.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
uint8_t =0;
Stm32_Clock_Init(336,8,2,7);//初始化时钟为 168Mhz
delay_init(168); //初始化延时函数
uart_init(84,115200); //串口初始化为 115200
while(1)
{
printf("t:%d\r\n",t); //需要重定向到串口
delay_ms(500);
t++;
}
}
进行编译的话,下载到开发板,我们打开串口调试助手选择 COM3(得根据你的实际情况选择),设置波特率为 115200,会发现从探索者 STM32F4 开发板发回来的信息,如图 4.1.8 所示:
接收到的数据和我们期望的是一样的,证明程序没有问题。至此,说明我们下载代码成功 了,并且从硬件上验证了我们代码的正确性。至此,新建寄存器版本 MDK 工程完成。
可以看出,寄存器版本的工程创建起来还算简单,移植的文件比较少,但是到了库函数就会有大量需要移植的文件,这种方式配置文件环境便不合适,下一节我们正式讲解如何利用RTE助手配置库函数版本工程环境,将会大大降低复杂度。
以上便是STM32 新建工程—寄存器版的全部内容,如有兴趣,感谢点赞、关注、收藏,若有不正地方,还请各位大佬多多指教!