以前我都是在Eclipse上面和arm-none-eabi交叉编译环境来开发STM32应用程序的。
现在改用MDK-ARM比较专业的工具搭建一个开发环境。
新建一个指定STM32微控制器型号的工程:
为了生成编译文件,勾选如下复选框:
配置编译项:
STM32F4XX, USE_STDPERIPH_DRIVER
添加库编译符号,和语言/代码生成级别
其中最关键的头文件包含目录:
首先要添加包含工程目录,因为固件库会查找 stm32f4xx_conf.h 配置头文件,中断服务例程实现文件可能也会调用main.h中的函数。
再添加包含 xxxy\STM32F4_Lib\Libraries\CMSIS\Include 目录,CMSIS Core Support and CMSIS DSP Include Files.
再添加包含 xxxy\STM32F4_Lib\Libraries\CMSIS\Device\ST\STM32F4xx\Include 目录,包含STM32F4xx系列处理器的设备描述系统函数。
最后添加包含 xxxy\STM32F4_Lib\Libraries\STM32F4xx_StdPeriph_Driver\inc 目录,包含所有STM32F4xx系列处理器的标准外设驱动。
接下来配置连接器,在Misc controls中输入 --entry Reset_Handler --first __Vectors 如下图:
如果省略此步,会在应用程序编译完后链接时发生错误:
Error: L6967E: Entry point (0x08000000) points to a Thumb instruction but is not a valid Thumb code pointer.
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在工程中创建如下文件组:
CMSIS文件组下面“生成”STM32的系统时钟配置等体系结构设置文件。
MSK-ARM文件组下面“添加”STM32的中断向量配置等系统初始化信息。
STM32F4xx_StdPeriph_Driver文件组下面“引用”当前应用程序需要用到的外设所依赖的驱动。
User文件组下面“编写”当前应用程序具体实现,包括应用程序所占用的中断服务例程。
实际需要关注和编写的文件只有如下几个:
system_stm32f4xx.c 系统时钟配置文件,可以通过 STM32F4xx_Clock_Configuration_V1.0.1.xls 生成。
stm32f4xx_conf.h 应用程序配置文件,固件库通过其找到应用程序需要调用的外设驱动函数。
main.h 应用程序的功能函数定义,其定义的函数可能在中断实现stm32f4xx_it中被调用。
main.c 应用程序的功能函数实现,包括整个应用系统的入口函数。
stm32f4xx_it.h 应用程序的中断函数声明,其中断函数原型的声明可以在 startup_stm32f40xx.s 中找到。
stm32f4xx_it.c 应用程序的中断函数的具体实现。
startup_stm32f40xx.s 中断向量表、堆栈指针、系统时钟、外部SRAM等基础配置,
该文件为汇编文件,在固件库 xxx\STM32F4_Lib\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm 目录下可以找到。
OK,接下来程序就可以正常编译并调试了。但是还有一个警告目前搞不明白是什么原因。