库版本:STM32Cube_FW_F4_V1.25.0
1> 函数入口
1.1> 启动文件 startup_stm32f407xx.s
》配置异常向量表;
1.2> 复位函数 Reset_Handler()
》复位函数,调用子函数 【Systeminit】,再调用【__main】 ; __main -> main
;;----------------------------- Reset handler ------------------------------------;;
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
1.3> 初始化函数 Systeminit()
void SystemInit(void)
{
}
会改变吗:,在CubeMx工具配置过程中?
2> HAL库_模块配置
文件:stm32f4xx_hal_conf.h
> 重点 : HAL_GPIO_MODULE_ENABLED
>
#ifndef __STM32F4xx_HAL_CONF_H
#define __STM32F4xx_HAL_CONF_H
#define HAL_GPIO_MODULE_ENABLED
#ifdef HAL_GPIO_MODULE_ENABLED
#include "stm32f4xx_hal_gpio.h"
#endif
#endif
开启的模块,进行判断
文件:stm32f4xx_hal_gpio.C
#include "stm32f4xx_hal.h"
#ifdef HAL_GPIO_MODULE_ENABLED
#endif
3> __weak作用
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
UNUSED(GPIO_Pin);
}
弱定义函数, 用户在用户层重新定义HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)后,会被覆盖; 为用户提供一个模板;
参考手册:
4> 中断处理
以EXTI中断为例
DCD EXTI0_IRQHandler ; EXTI Line0
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
UNUSED(GPIO_Pin);
}
总结: HAL库已为用户提供了整套流程, 只需要在用户层定义void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 不需要在清中断。
5> 容易忽略的宏
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)
#define __HAL_SYSCFG_REMAPMEMORY_FSMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\
SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\
}while(0);
#endif
|