本文介绍MCU开发神器Keil MDK,从下载->安装->工程搭建->编译->仿真->调试全流程。- StandardPeriphDriver:标准外设驱动
- CMSIS:Cortex Microcontroller Software Interface Standard
- ST:STMicroelectronics(意法半导体公司)
- 下载:描述如何下载Keil MDK,芯片的DSP,芯片的外设驱动
1. 网址:https://www.keil.com/- 包含Keil Studio,uVersion IDE,ARM C/C++编译器,中间件
3. 点击下载“Dowloads”,选择MDK-Arm- C166:C166,XC166,XC2000 MCU
5. 点击MDK,进行下载。由于网络限制,下载比较慢,但是为了用到正品软件,这种等待还是值得的1. 选择MCU芯片型号,下载DFP(Device Family Pack),双击安装DFP。DFP中包含了芯片的启动文件(startup_xxx.s),系统配置文件(system_xxx.c),外设驱动,系统Flash编程算法(FLM文件),调试用的SVD文件(System View Description)(1)网址:https://www.keil.arm.com/devices/(3)双击安装:安装的地址可以在uVersion IDE中的Pack Installer进行设置(Pack Installer->File->Settings)2. 选择MCU芯片型号,下载芯片的外设驱动库。芯片外设驱动库中包含外设驱动,已经外设驱动的使用示例。示例对于学习外设驱动非常有帮助。(1)网址:https://www.st.com.cn/zh/embedded-software/stm32-standard-peripheral-libraries.html(4)选择下载方式:登陆账号或访客下载。建议注册账号,并记录账号密码(避免忘记)。下载完成后, 进行解压,内部资源如图所示。3. 下载ARMC5:下载Arm V5 Compiler。下载的最新的Keil MDK并没有该编译器,需要从官网下载。下载该编译器的目的是:如果下载的外设固件包并不是最新的,使用最新的编译器编译老的Cortex-M内核定义文件,可能会出现编译报错(内核定义文件中定义的寄存器在新编译器中不存在)(1)网站:https://developer.arm.com/downloads/view/ACOMP5
(2)下载,安装。安装地址和ARM Compiler V6放在同一个路径下。
(3)配置
1. 设计项目结构,添加必要文件。设计项目目录结构主要用于管理整个项目的资源。简单的项目主要由以下几个部分组成:Doc存放项目介绍,Libraries存放依赖库,Project存放工程文件,User存放用户代码。(如果需要设计自动化编译脚本,还可以增加Build目录,存放编译脚本;增加Output目录,存放生成文件)。(1)把前置资源下载好的“外设驱动库”中的"CMSIS"和“STM32F4xx_StdPeriph_Driver”目录复制到Libraries中(2)添加必要文件。把前置资源下载好的“外设驱动库”中Project/STM32F4xx_StdPeriph_Templates中的stm32f4xx_conf.h(声明了外设驱动库头文件,定义了assert_param宏,该宏在众多标准外设库中都有使用),stm32f4xx_it.c(用于定义中断函数),stm32f4xx_it.h复制到User目录中。2. 打开uVersion IDE,顶部菜单栏选择Project->New uVersion Project->设置项目名称(选择上述创建号的Project目录)->Select Device for Target(选择MCU型号)->点击OK->点击OK4. 明确目录结构设计。MCU程序由以下几个部分组成:Cortex-M内核文件,芯片启动文件,系统配置文件,外设驱动库,应用程序文件,中间件。按照这个逻辑设计目录结构。如下图所示,CMSIS用于存放内核文件,Startup用于存放启动文件和系统配置文件,FirmwareLib用于存放外设驱动库,App用于存放应用程序文件,Middleware用于存放中间件文件(1)Startup:添加startup_stm32f40xx.s,添加system_stm32f4xx.c。选中目录,右键添加已存在文件(2)添加外设库文件。这里把所有外设都添加上,主要用于后续学习。选中Libraries/STM32F4xx_StdPeriph_Driver/src下的所有文件(3)添加应用程序文件:main.c,stm32f4xx_it.c。在User目录下创建一个main.c文件,把main.c和stm32f4xx_it.c都添加到App中6. 设置目标选项:Options for Target->Target;Options for Target->C/C++。主要用于选择编译器,定义宏,设置编译时的头文件查找目录(与使用gcc编译时指定-I变量是一样的)。(2)设置头文件查找目录。前面添加了哪些头文件,就需要添加对应的头文件目录。主要包括CMSIS/Include(Cortex-M寄存器定义和操作目录),CMSIS/Device/ST/STM32F4xx/Include(系统配置接口声明),STM32F4xx_StdPeriph_Driver/inc(外设库头文件目录),User/(包含头文件stm32f4xx_conf.h,stm32f4xx_it.h)(1)添加3个很重要的头文件到目录中:stm32f4xx.h(外设寄存器定义头文件,位于Libraries\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h),stm32fxx_conf.h(外设库接口头文件,位于D:\MCU-User\stm32f4xx_conf.h),stm32fxx_it.h(中断函数头文件,位于User\stm32f4xx_it.h)(2)增加宏定义:STM32F40_41xxx,USE_STDPERIPH_DRIVER。STM32F40_41xxx(使用型号STM32F407,在stm32fxx_conf.h中存在该编译器宏),USE_STDPERIPH_DRIVER(使用标准外设库,在stm32f4xx.h中存在该条件编译宏)(1)为了避免大量的warning造成干扰,可以在Options for Target->C/C++配置No Warnings(2)报错1:error: unknown register name 'vfpcc' in asm。这个报错的含义是汇编不支持vfpcc这个寄存器,本质就是编译器不支持,无法识别者编译器。这里编译器我们选择是“Use default compiler version 6”,使用"V5.06 update 7"可以解决该问题。如果找不到"V5.06 update 7",可以参考## 前置资源. 3. 解决(在“品”图标->Folders/Extensions中进行配置)(3)其他报错:其他报错均为文件缺失之类的报错,比较容易解决1. Objects中的可执行文件:xxx.axf。二进制机器码+完整调试信息,可直接调试。相比于.hex和.bin文件,更大。.hex包含地址信息+机器码,烧录无需指定地址;.bin仅包含机器码,烧录需要指定地址,主要用于OTA升级,Bootloader,以及量产。可通过ARM编译器工具链中的fromelf程序,把xxx.axf文件转换成xxx.bin文件:fromelf --bin -o xxx.bin xxx.axf;同样也可以使用fromelf程序进行反汇编,把xxx.axf转换成反汇编程序,用于排查问题:fromelf -c xxx.axf -o xxx.txt2. Listings中的映射文件:xxx.map。描述程序的地址映射信息,描述程序中指令和数据的映射地址。同时也描述了指令和数据的空间分布和占用。3. Objects中的调用栈信息文件:xxx.htm。可以用统计静态调用栈的深度4. 配置问题。如果上述文件不存在,请检查相关配置。Options for Target->Output;Options for Target -> Listing调试主要包含两种方式,一种是仿真调试,一种是硬件调试(需要依赖ARM仿真器)。这里我们主要介绍仿真调试(无需硬件设备),Keil对于Cortex-M3提供了很好的仿真支持,对于Cortex-M4的仿真,在要求不高的情况下,可以复用Cortex-M4的动态库。配置如图所示。2. 调试窗口的功能非常丰富,但是具体的调试方法,读者可以根据图片中提示自己摸索3. 实际生产过程中,很多问题都需要使用硬件在线调试。仿真调试只能作为预言的手段,实际硬件依然存在各种电气因素的干扰,仅凭仿真的结果不能作为最终可行的依据。