MDK5新建⼯程MDK5使⽤技巧STM32F4在线调试
建⽴相关⽂件夹如图所⽰
FWLIB放官⽅固件库⽂件,HARDWARE放⾃⼰编写的.C,.H⽂件,USER放主函数⽂件,⼯程,启动⽂件等。
1,⾸先,打开 MDK(以下将 MDK5 简称为 MDK)软件。然后点击 Project---New uVision Project ,然后保存在USER⽂件夹下,⼯程名⾃取。
2,选择 STMicroelectronics--STM32F4 Series--STM32F407--STM32F407ZGT6(如果使⽤的是其他系列的芯⽚,选择相应的型号就可以了,特别注意:⼀定要安装对应的器件 pack
才会显⽰这些内容哦!!)。
3,点击 OK, MDK 会弹出 Manage Run-Time Environment 对话框。这是 MDK5 新增的⼀个功能,在这个界⾯,我们可以添加⾃⼰需要的组件,从⽽⽅便构建开发环境,不过这⾥我们
不做介绍。所以在图 3.2.4 所⽰界⾯,我们直接点击 Cancel,即可。得到如图所⽰界⾯:
4,到这⾥,我们还只是建了⼀个框架,还需要添加启动代码,以及.c ⽂件等。这⾥我们先介绍⼀下启动代码:启动代码是⼀段和硬件相关的汇编代码。是必不可少的!这代码主要作⽤如
下:
1、堆栈(SP)的初始化;
2、初始化程序计数器(PC);
3、设置向量表异常事件的⼊⼝地址;
4、调⽤ main 函数。感兴趣的朋友可以⾃⼰去分析这部分代码。
ST 公司为 STM32F40x 和 STM32F41x 系列的 STM32F4 提供了⼀个共同的启动⽂件,名字为: startup_stm32f40_41xxx.s。我们开发板
使⽤的是 STM32F407ZGT6,属于 STM32F40x 系列
⾥⾯的,所以直接使 startup_stm32f40_41xxx.s 这个启动⽂件即可。不过这个启动⽂件,我们做了⼀点点修改,具体是 Reset_Handler 函数,该函数修改后代码如下:
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
;IMPORT SystemInit ;寄存器代码,不需要在这⾥调⽤ SystemInit 函数,
;故屏蔽掉,库函数版本代码,可以留下
;不过需要在外部实现 SystemInit 函数,否则会报错.
IMPORT __main
LDR R0, =0xE000ED88 ;使能浮点运算 CP10,CP11
LDR R1,[R0]
ORR R1,R1,#(0xF << 20)
STR R1,[R0]
;LDR R0, =SystemInit ;寄存器代码,未⽤到,屏蔽
;
BLX R0 ;寄存器代码,未⽤到,屏蔽
LDR R0, =__main
BX R0
在线代码运行器ENDP
这段代码,我们主要加⼊了开启 STM32F4 硬件 FPU 的代码,以使能 STM32F4 的浮点运算单元。其中, 0xE000ED88 就是协处理器控制寄存器(CPACR)的地址,该寄存器的第 20~23
位⽤来控制是否⽀持浮点运算,这⾥我们全设置为 1,以⽀持浮点运算。关于 CPACR 寄存器的详细描述,见《STM32F3 与 F4 系列Cortex M4 内核编程⼿册.pdf》第 4.6.1 节。另外,寄存器
版本,我们还屏蔽了 SystemInit 函数的调⽤,如果是库函数版本,可以取消这个函数的注释,并在外部实现 SystemInit 函数。
特别注意:我们在汇编代码⾥⾯使能了 FPU,所以在 MDK ⾥⾯,我们也要设置使⽤ FPU,否则可能代码会⽆法运⾏,设置⽅法如下:选择 Options for Target ‘Target1’ ,打开 Target 选
项卡,在 Code Generation ⾥⾯,选择 Use FPU,如图所⽰:
这样, MDK 编译⽣成的代码,就可以直接使⽤硬件 FPU 了,其实就 2 个步骤: 1,设置CPACR 寄存器 20~23 位全为 1,使能硬件FPU。 2,设置 MDK 选型,选择 Use FPU。另外,
图中, MDK 默认 STM32F4 外部晶振为 12M,我们板⼦⽤的 8M,所以这⾥设置为 8Mhz。修改后的这个启动⽂件
startup_stm32f40_41xxx.s 拷贝到刚刚新建的USER⽂件夹⾥⾯。
5,在图中,我们到 Target1--Source Group1--双击--设置打开⽂件类型为 Asm Source file--选择 startup_stm32f40_41xxx.s--点击 Add,如图所⽰:
添加完后,我们得到如图所⽰的界⾯:
⾄此,我们就可以开始编写⾃⼰的代码了。
由于上⾯我们还没有任何代码在⼯程⾥⾯,这⾥我们把系统代码 COPY 过来(即 SYSTEM⽂件夹的代码,该⽂件夹由 ALIENTEK 提供,可以在光盘任何⼀个实例的⼯程⽬录下到,不过不要
拷贝错了!不要把库函数代码的系统⽂件夹拷贝到寄存器代码⾥⾯⽤,反之亦然!这些代码在任何 STM32F40x/STM32F41x 的芯⽚上都是通⽤的,可以⽤于快速构建⾃⼰的⼯程)。
SYSTEM ⽂件夹下包含了 delay、 sys、 usart 等三个⽂件夹。分别包含了 delay.c、 sys.c、 usart.c及其头⽂件。通过这 3 个 c ⽂件,可以快速的给任何⼀款 STM32F4 构建最基本的框架。使⽤
起来是很⽅便的。具体可以百度学习⼀下。
6,然后在 Target ⽬录树上点击右键--Manage Project Items,弹出如图所⽰对话框:
在上⾯对话框的中间栏,点新建(⽤红圈标出)按钮(也可以通过双击下⾯的空⽩处实现),新建 USER 和 SYSTEM 两个组。然后点击Add Files 按钮,把 SYSTEM ⽂件夹三个⼦⽂件夹⾥
⾯的: sys.c、 usart.c、 delay.c 加⼊到 SYSTEM 组中。注意:此时 USER 组下还是没有任何⽂件,得到如图所⽰的界⾯:
点击 OK,退出该界⾯返回 IDE。这时,我们在 Target1 树下发现多了 2 个组名,就是我们刚刚新建的 2 个组。如图所⽰:
7,接着,我们新建⼀个 test.c ⽂件,并保存在 USER ⽂件夹下。然后双击 USER 组,会弹出加载⽂件的对话框,此时我们在 USER ⽬录下选择 test.c ⽂件,加⼊到 USER 组下。得到如图
所⽰的界⾯:
⾄此,我们就可以开始编写我们⾃⼰的代码了。我们在 test.c ⽂件⾥⾯输⼊如下代码:
#include "sys.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
u8 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++;
}
}
如果我们此时编译的话,⽣成的过程⽂件,还是会存放在 USER ⽂件夹下,所以,我们先设置输出路径,再编译。点击(Options for Target 按钮),弹出 Options for Target’ Target 1’
对话框,选择 Output 选项卡--选中 Create Hex File(⽤于⽣成 Hex ⽂件,后⾯会⽤到)--点击Select Folder for Objects--到 OBJ ⽂件夹--点击 OK。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论