前言
在进行嵌入式开发学习中,大部分人都使用过MDK-ARM开发软件,由于陌生的英文界面,不知道有那些实用功能,使得开发过程走弯路。工程是基于HAL建立,下面是博主在使用此软件的一些经验,希望对大家有用。
MDK软件的使用可以分为4个步骤
新建工程------工程设置-------程序编译和下载--------程序调试
一,新建工程
文件结构
在CubeMX的文件夹下,自动生成了名为“text15.3(用户自命名)”的文件夹。在 text15.3文件夹下,生成了如图所示的相关文件和文件夹。
文件夹中图标为蓝色MX的文件是由 CubeMX软件生成的 CubeMX 工程文件。如果用户需要修改之前的设置,如引脚分配和外设配置等,就可以直接点击,启动 CubeMX 软件来完成相关的设置。
工程文件中还生成了四个文件夹,分别是 Drivers、Inc、MDK-ARM 和 Src。(bsp文件为我自己选择添加,只是为了方便存储用户自己建立的文件而设立,不属于软件生成文件结构)
1.Drivers 文件夹
存放与驱动相关的文件,里面包含两个子文件夹:
1)CMSIS 子文件夹
Cortex-M 内核微控制器的软件接口标准。
2)STM32F4xx HAL Driver 子文件夹
STM32F4 系列微控制器的 HAL库驱动文件。
2.Inc 文件夹
存放用户头文件,包含以下3个文件:
1)emain.h
用户主程序的头文件。
2)stm32f4xx hal conf.h
HAL库配置头文件。该文件主要用于对 HAL库的裁剪。例如,修改外部晶振的频率,使能或禁能相应的片内外设。
3)estm32f4xx it.h
中断服务程序的头文件。
3.MDK-ARM 文件夹
存放 MDK 软件的工程文件,里面比较重要的是两个文件
Demo.uvprojx
MDK 软件的工程文件。
estarlup_stm32f411xe.s
芯片启动代码,主要功能是配置系统堆和栈的大小以及初始化中断向量表。
4.Src 文件夹
存放用户源文件,包含以下4个文件:
main.c :
用户主程序。
stm32f4xx_hal_msp.c
与目标 MCU 相关的片内外设初始化程序,
stm32f4xx it.c
中断服务程序,定义了常用的中断服务函数。
system_stm32f4xx.c
系统初始化代码,主要完成系统初始化操作。
点击 MDK-ARM 文件夹下面的 Demo.uvprojx文件,就可以启动MDK软件,并打开对应的工程文件。MDK 软件的主界面可以分成5部分
二,工程配置
完成工程的建立后,我们需要配置工程的开发环境。在 MDK 软件主界面的工具栏中点击 魔术棒 按钮,进入工程配置界面(Options for Target'Demo')。在工程配置界面中,一共有十个标签页。
1.Device(器件)标签页
用于选择微控制器的型号。一般情况下,在新建工程时已经选择好了芯片型号。如果用户需要更改芯片型号,可以在 Device 标签页中进行修改。
2.Target(目标)标签页
用于硬件配置,一般使用默认配置即可,其中几个重要的设置选项如下:
Xtal( MHz )
用于设置外接晶振的频率,如图所示。用户需要根据实际情况进行修改,该值主要用于软件仿真。
ARM Compiler
用于选择进行程序编译的编译器,如图所示。MDK 软件提供了 V5 和V6 两种编译器。利用 CubeMX 软件所生成的 MDK 工程,默认使用的是 V5 编译器。而直接利用 MDK 软件新建工程时,默认使用的是 V6 编译器。由于 V6 编译器对 HAL,库的支持还不太完善,直接编译时会出现一些警告和错误,因此建议初学者使用 V5 编译器
Use Micro LIB
使用微库,如图所示。为了适应 MCU 存储空间较小的情况,Keil 公司专门开发了一套小型的C语言标准库函数,比普通C语言的标准库函数代码量更小。例如,我们使用 printf()函数时就会调用微库。用户调用C语言的标准库函数时,需要勾选该选项。
Read/Only Memory Areas 和 Read/Write Memory Areas
设置片内和片外存储器的起始地址和大小,包括 ROM 和 RAM,如图 所示。对于 Cortex-M内核微控制器而言,一般不用进行片外存储器的扩展,只使用片内存储器。存储器的起始地址和大小会根据芯片型号自动分配。
对于 STM32F411RET芯片而言,片内ash的起始地址为0x8000000,大小为 512 KB。
片内 SRAM 的起始地址为 0x20000000,大小为 128 KB。
3:Output(输出)标签页
用于设置编译过程中输出的中间文件的存放路径,如图5-7所示,一般采用默认配置即可,其中几个重要的设置选项如下:
Select Folder for Objects
用于选择编译过程中输出的中间文件的存放路径。利用CubeMX软件生成的MDK工程将自动设置该路径为 MDK-ARM 文件夹下与工程名同名的文件夹。
Name of Executable
生成的可执行文件名称,默认和工程名一致。
Create Executable
该选项默认选中。它包含三个子选项:
1)Debug Information
生成调试信息。
2)Create HEX File
生成 HEX 格式的编程文件。
Browse Information生成浏览信息,如查看程序中定义的变量和函数等。三个子选项默认为选中状态,以便生成详细的调试信息和浏览信息以及 Hex格式的编程文件。
3)Create Library
生成Lb 文件(库文件)。如果用户希望隐藏自己的程序源码时,可以选中该选项,样就可以以库文件的形式提供程序,而不必公开源代码。
4.Listing(列表)标签页
用于生成列表文件。列表文件中包含了生成代码的详细信息,如代码大小、变量所。
用的存储器地址等,如图所示,一般使用默认配置即可。
5.User(用户)标签页
用于设置在编译之前或编译之后运行的一些用户命令,比如拷贝文件或删除文件等批处理操作,如图所示,一般使用默认配置即可。
6.C/C++ 标签页
用于在C或者 C++程序中设置预定义的宏、程序优化等级以及头文件路径,如图 5-10所示,其中几个重要的设置选项如下:
Define
用于设置预定义的宏,其作用与在程序中用 defne 关键字定义的宏一样。如果利用CubeMx 软件生成的 MDK工程,已经默认添加了两个预定义的宏:USE HAL DRIVER 和STM32F411xE,如图 中序号①所示。如果是手动建立工程,则需要用户自行添加。
USE HAL DRIVER
表示使用 HAL库。定义这个宏之后,才会包含“stm32f4xx_hal.h”头文件,才能使用HAL库中的接口函数。
STM32F411xE
表示使用的芯片型号。定义这个宏之后,才会包含“stm32f431xx.h”,才能访问芯片内部的寄存器。
Optimization
用于设置程序的优化等级,默认的优化等级是 Level3,如图 中所示。建议初学者选择1emd0,也就是不进行程序优化,这样可以使于观察程序中全部变量以及设置断点。如果配置成Lewd13,在硬件伤真时,可能会由于程序的优化而无法察觉,无法在某些代码行设置断点以及单步调试时出现代码运行不连续
Include Paths
用于添加头文件路径,如图中所示。如果利用CubeMx软件生成MDK工程,会自动添加所需的头文件路径。如果直接利用 MDK 软件建立工程或着用户在当前工程的基础上添加了新的文件,则需要用户手动添加对应的头文件路径。头路径没有正确添加时,编译将会报错。
7.Asm 标签页
用于在汇编程序中设置预定义的宏和文件的包含路径等,功能与C/C++标签页类如图 所示,一般使用默认配置即可。
8.Linker(链接器)标签页
用于设置程序的链接地址和分散加载文件,如图 所示,一般使用默认配置即可。
9.Debug(调试)标签页
用于程序仿真方式的设置,如图 所示。
MDK 软件支持软件仿真和硬件仿真,软件仿真主要用于验证算法和程序的流程是否正确。在实际工程中,一般采用硬件仿真进行程序的调试和错误的排查。
使用硬件仿真时,首先要选择所使用的仿真器:如果使用官方开发板(如Nucee开发板),板上集成了ST-Lnk 仿真器,则选择ST-Link Debuesr。如果是用户设计的电路则需要根据所使用的仿真器类型来选择。MDK软件所支持的仿真器类型如图中所所示。
选择好仿真器后,还需要进行仿真器设置。点击仿真器右边的“Setlings”按钮,如图所示,将进入仿真器设置窗口。
仿真器设置窗口分成了 Debug、Trace 和 Flash Download 三个子标签页,如图 所示。一般情况下,只需要设置 Debug 子标签页和 Fash Download 子标签页。
Debug 子标签页
用于显示仿真器的名称、序列号、硬件版本号和固件版本号等基本信息,如图所示。
如果仿真器连接正确,并且用户的电路板设计正确。电路板上电后,在SW Device 窗口中将显示芯片的ID号,如图 所示。如果无法显示仿真器的相关信息,可以检意传真器是否插紧,仿真器的驱动程序是否安装。如果无法显示芯片的ID号,先检查是否上电。如果电路板已经上电则考虑微控制器的最小系统电路问题,可以通过检查时钟电路、复位电路和调试电路来排查错误。
Flash Download 子标签页
用于下载程序的配置,如图所示,一般使用默认配置即可。如果希望程序下载完毕后自动运行,则需要勾选“Reset and Run”选项,如图所示。如果不选该选项,则下载程序后,需要按一下电路板上的复位按钮,程序才能运行。
在 Programming Algorithm(编程算法)部分可以设置MCU片内Flash 的编程算法,片内 Fash 的编程算法会根据芯片型号自动添加,如图 所示。
10.Utilities(工具)标签页
用于选择 MDK软件中没有支持的第三方仿真器以及对第三方仿真器的配置,如图所示。大多数情况下我们会选择 MDK 软件中支持的仿真器,因此在该标签页中不做任何修改,使用默认配置即可。