HAL_Lib
- 1> 函数入口
-
- 1.1> 启动文件 startup_stm32f407xx.s
- 1.2> 复位函数 Reset_Handler()
- 1.3> 初始化函数 Systeminit()
- 2> HAL库_模块配置
- 3> __weak作用
- 4> 中断处理
- 5> 容易忽略的宏
库版本:STM32Cube_FW_F4_V1.25.01> 函数入口
文章图片
1.1> 启动文件 startup_stm32f407xx.s
》配置异常向量表;
文章图片
1.2> 复位函数 Reset_Handler()
》复位函数,调用子函数 【Systeminit】,再调用【__main】 ;
__main -> main
;
;
----------------------------- Reset handler ------------------------------------;
;
Reset_HandlerPROC
EXPORTReset_Handler[WEAK]
IMPORTSystemInit
IMPORT__mainLDRR0, =SystemInit
BLXR0
LDRR0, =__main
BXR0
ENDP
1.3> 初始化函数 Systeminit()
void SystemInit(void)
{/* FPU settings 配置浮点运算单元---------------*/
/* External memory 配置外部SDRAM---------------*/
/* Configure the Vector Table location add offset address 配置异常向量表地址-------------*/}
会改变吗:,在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/* 未开启的模块 */
/* #define HAL_ADC_MODULE_ENABLED*/
/* #define HAL_CRYP_MODULE_ENABLED*/// 开启那个模块,实际就是把那个模块头文件包含
#ifdef HAL_GPIO_MODULE_ENABLED
#include "stm32f4xx_hal_gpio.h"
#endif /* HAL_GPIO_MODULE_ENABLED */#endif /* __STM32F4xx_HAL_CONF_H */
开启的模块,进行判断文件:stm32f4xx_hal_gpio.C
#include "stm32f4xx_hal.h"
//
#ifdef HAL_GPIO_MODULE_ENABLED/* Driver Code Begin*/
/* Driver Code End */#endif /* HAL_GPIO_MODULE_ENABLED */
3> __weak作用
/**
* @briefEXTI line detection callbacks.
* @paramGPIO_Pin Specifies the pins connected EXTI line
* @retval None
*/
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
弱定义函数,参考手册:
用户在用户层重新定义HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)后,会被覆盖;
为用户提供一个模板;
文章图片
4> 中断处理 以EXTI中断为例
/**--- 启动File:【startup_stm32f407xx.s】 ----**/ DCDEXTI0_IRQHandler;
EXTI Line0/**--- 用户中断处理File:【stm32f4xx_it.c】 ----**/
void EXTI0_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
/**--- 外设驱动File:stm32f4_hal_gpio.c ----**/// 中断处理函数
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
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)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
总结: HAL库已为用户提供了整套流程,5> 容易忽略的宏 【#|HAL库_源码阅读】
只需要在用户层定义void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
不需要在清中断。
文章图片
/**--- HAL总 文件:【stm32f4xx.h】 ----**/#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)
/** @briefFSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000
*/
#define __HAL_SYSCFG_REMAPMEMORY_FSMC()do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);
\
SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);
\
}while(0);
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */
- STM32F407xx 在软件中定义;
推荐阅读
- 电路小课堂|聊聊实际使用的电源转化电路,分享一些不同场合下的转3.3V电路
- #|SpringCloud Alibaba微服务中Nacos的服务注册与发现
- 单片机原理及应用 - 指令系统
- 刷题|【剑指 Offer】剑指 Offer 34. 二叉树中和为某一值的路径
- #|基于JAVA实现的WEB端UI自动化 -自动化测试简单介绍
- #|她笑了——心里阳光满满(Matlab实现一个太阳心)
- #|送小公主——哆啦A梦(Python代码实现)
- #|她很焦虑,是时候送一波更高级的玫瑰(Python&Matlab实现)
- #|你值得拥有——流星雨下的告白(Python实现)