一、Boot配置
内存地址是固定的,代码从0x0000 0000开始,而数据从0x2000 0000开始,F4支持三种不同的boot模式
复位芯片时,在SYSCLK的第4个上升沿BOOT引脚值被锁存,STM32F407通过此时BOOT[1:0]引脚值选择Boot模式
BOOT1 | BOOT0 | mode | description |
---|---|---|---|
x | 0 | Main Flash | 从flash区域boot |
0 | 1 | System memory | 从系统存储区boot |
1 | 1 | Embedded SRAM | 从内置SRAM区域boot |
二、必备API
2.1 初始化流程
- 系统上电复位。进入启动文件
startup_stm32f407xx.s
,在这个文件中执行复位中断服务程序- 在复位中断程序中执行函数
SystemInit
,此函数在system_stm32f4xx.c
文件中 - 调用
_main
,最终进入main
函数
- 在复位中断程序中执行函数
- 进入
main
函数即可开始应用程序编程,需要进行初始化- HAL库初始化函数
HAL_Init
,此函数在stm32f4xx_hal.c
文件中 - 系统时钟初始化,在
stm32f4xx_hal_rcc.c
文件中
- HAL库初始化函数
2.2 源文件分析
startup_stm32f407xx.s
文件
此文件由汇编语言编写,主要完成以下操作:设置堆栈指针、设置PC指针、设置中断向量表、配置系统时钟、配置外部SRAM/SDRAM用于程序变量等数据存储、跳转到main()
函数。system_stm32f4xx.c
文件
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
在进入main()
函数之前,进入了SystemInit
函数,此函数在system_stm32f4xx.c
文件中,该文件提供了两个函数和一个全局变量,分别是SystemInit()
、SystemCoreClockUpdate()
和SystemCoreClock variable
其作用分别为,SystemInit()
用于设置微控制器系统,初始化FPU、向量表和外部内存配置;SystemCoreClockUpdate()
用于更新SystemCoreClock variable
。
stm32f4xx_hal.c
文件
HAL库驱动文件,函数HAL_Init
会初始化HAL库,设置NVIC优先级分组为4,滴答定时器每1ms中断一次,默认使用HSI时钟,必须在main()
函数中优先调用此函数;函数HAL_IncTick()
实现一个简单的计数功能,全局变量uwTick
每毫秒加1;函数HAL_Delay()
用于阻塞式延迟,单位为ms。stm32f4xx_hal_rcc.c
文件
主要实现内部和外部时钟以及总线时钟的配置,函数HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
用于初始化RCC振荡器;函数HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
用于初始化总线时钟,此函数会更新全局变量SystemCoreClock的主频值,并且会再次调用函数HAL_InitTick更新系统滴答时钟;