STM32 的HAL库中 使用 Register CallBack 与使用HAL库 原始的中断回调函数 的区别

本文探讨了STM32 HAL库中使用Register Callback与原始中断回调函数的区别。当需要在运行时针对同一中断执行不同函数时,直接在中断函数内添加逻辑分支虽然可行,但可能导致中断函数复杂且不利于程序模块化。HAL库提供了一种替代方案,即通过xxx_RegisterCallback()宏注册中断函数,以实现更灵活的中断处理,并减少堆栈开销。用户可以在CubeMX中配置启用此功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HAL库 中的 中断函数 一般默认为

HAL_xxx_xxxxxxxxCallback()

比如:

定时器的溢出中断函数:

void  HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

定时器的触发中断函数:

void  HAL_TIM_TriggerCallback (TIM_HandleTypeDef *htim)

定时器的 输入捕获函数:

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

这些函数的功能 就是 程序在运行时 进入对应中断后的函数,这也是常规的框架结构

但是 如果有一种情况 ,需要程序在运行时 对于同一个中断可以执行不同的 中断函数

改怎么做呢?

大多数人的思路就是在 上面的中断函数中做 逻辑分支,当然是没问题的,但是这样会导致中断函数变得庞大,容易给任务切换时带来更多的堆栈开销,而且不利于程序的模块化,一旦运行,中断函数的功能难以修改。

还有一种办法,HAL库 中给用户提供了另一种方式

看下面的宏定义:

 当这些宏定义 被设为1 后

每个外设的中断函数 将通过    xxx_RegisterCallback () 注册函数的方式来 关联,

比如定时器的中断函数要 调用

HAL_StatusTypeDef

使用STM32HAL编写FDCAN驱动程序时,为了实现在FIFO中有数据时调用回调函数`HAL_FDCAN_RxFifo0Callback`,你需要遵循以下几个步骤: 1. **初始化CAN模块**: 首先,在驱动程序开始之前,你需要初始化CAN HAL结构体并开启FDCAN。这包括选择正确的时钟源、配置中断以及打开FIFO。 ```c HAL_CAN_Init(&hcan); HAL_CAN_MspInit(&hcan_Msp); // 初始化CAN硬件资源 HAL_CAN_MasterConfig(&hcan, ENABLE, FDCAN_MODE_NORMAL); HAL_CAN_RxConfiguration(&hcan, CAN_RxCNF_FIFO0); // 设置接收模式为FIFO0 ``` 2. **注册回调函数**: 在初始化完成后,你需要将你的`HAL_FDCAN_RxFifo0Callback`函数注册为接收FIFO0的数据处理回调。通常这是通过HAL提供的API完成的。 ```c HAL_NVIC_SetPriority(RCC_ClkInitStruct.RCCEx.NVICFasteoiPreemptionPriority, 5, 0); HAL_NVIC_EnableIRQ(CAN_IRQn); __HAL_CAN_REGISTER_CALLBACKS(&hcan, &hal_can_rxfifofull_callback, &hal_can_rxempty_callback, &hal_can_error_callback); ``` 这里假设`hal_can_rxfifofull_callback`等是对应的内部函数名,它们会分别对应于FIFO满、空和错误等情况。 3. **配置中断**: 对于FIFO0的数据到达,你可以配置CAN的中断以在有新数据到达时触发。通过`HAL_CAN_ConfigInterrupt`函数,启用RX FIFO 0中断。 ```c HAL_CAN_ConfigIrq(&hcan, CAN_IT_RXF0 | CAN_IT_ERR | CAN_IT_FMP); ``` 4. **中断服务处理函数**: 当中断发生时,系统会调用`HAL_CAN_IRQHandler`,你需要在这个函数中判断是哪个中断事件并调用对应的回调函数。 ```c static void CAN_IRQHandler(void) { HAL_CAN_IRQHandler(&hcan); } ``` 这样,每当FIFO0中有新的数据到来时,`HAL_FDCAN_RxFifo0Callback`就会被调用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值