in other words, how to create a stm32 stdlib project with gcc/makefile
actally, what you need do is to consider it as a c projectt then create a proper project structure and create a makefile to build it, what make it special is the regular c file become the peripheral file and you need to provide a startfile and a link script explicitly.
Peripheral Library
library structure:
1 | STM32F4xx_DSP_StdPeriph_Lib_V1.9.0 $ tree -L 2 . |
Library
包含两个文件夹CMSIS 和 STM32F4xx_StdPeriph_Driver, CMSIS(Cortex Microcontroller Software Interface Standard) 包含对Cortex的调用接口支持,而STM32F4xx_StdPeriph_Driver 包含了实际上的外设库文件,包括gpio/spi/i2c等等。
CMSMS
CMSIS是arm提供的
- 启动文件
位于Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates
,包含不同开发工具链的启动文件
1 | Templates $ tree -L 1 . |
其中,arm和gcc的启动文件我都尝试过,剩余几个由ai给出解释,未做验证。
- 其他头文件
- stm32f4xx.h
位于Libraries/CMSIS/Device/ST/STM32F4xx/Include
包含与外设相关的定义,比如寄存器映射,外设结构体,比如GPIO_TypeDef
就在这个文件中 - system_stm32f4xx.h
位于Libraries/CMSIS/Device/ST/STM32F4xx/Include
包含系统级别初始化相关的定义,实际上在stm32f4中,只包含了两个函数的定义
1
2extern void SystemInit(void);
extern void SystemCoreClockUpdate(void);- core_cm4.h
位于Libraries/CMSIS/Include
包含ARM Cortex CPU 本身包含的一些功能,比如中断,系统定时器,fpu支持,与芯片厂商(比如ST)无关
- stm32f4xx.h
Driver
很多,包含必要的就行
其他文件
- stm32f40x_conf.h
- 这个文件做了两件事,包含所有外设头文件和定义了assert_param这个宏。
- 这个文件在stm32f4xx.h中被包含
1
2
3- 而且这个文件并未在Libraries中,但是可以在
Project/STM32F4xx_StdPeriph_Templates
下找到,所以这个文件不是必须的。 - 如果不想使用这个文件,就需要手动做上面的两件事,原本只需要包含
stm32f4xx.h
就会包含stm32f4xx_conf.h
然后包含外设头文件,现在需要在必要的时候显式包含外设头文件,当然,这个一个好的习惯,所以不是问题。接下来,需要显式定义assert_param
,问题在与各个外设.c文件都在使用这个宏,如果在某个.h中手动定义的话,还需要修改外设.h文件以包含进去,不可行;有一个方法是通过gcc传递定义,即在makefile中通过-D'assert_param(expr)=((void)0)'
的方式定义。 - 总结,还是直接使用这个文件。使用条件是需要定义
USE_STDPERIPH_DRIVER
和USE_FULL_ASSERT
宏,同时对于不同芯片,还需要定义一些特定的宏详细看stm32f4xx_conf.h
文件
- stm32f10x_it.h
这个文件和stm32f4xx_conf.h
一样,没有在Libraries
而在Project
中 - 链接脚本
这个也有意思,没有提供,目前我知道的能提供链接脚本的只有STM32CubeMX,而且虽然目前cubemx只支持hal库,但是生成的链接脚本也能用于标准库
项目结构
项目结构不是固定统一的,只要能够写出对应的Makefile就行。
我的项目结构如下
1 | example $ tree -L 2 . [0/0] |
Core 目录如下
1 | Core $ tree [0/0] |
Makefile
和项目结构对应
也是改自cubemx生成