【STM32学习笔记(2)】---回调函数和中断处理函数的关系

本文揭示了回调函数如何在单片机中断处理中间接被调用,重点讲解了HAL_UART_IRQHandler函数的作用以及HAL_UART_Receive_IT和HAL_UART_Transmit_IT设置的回调频率。理解了这些,有助于掌握中断与回调在嵌入式开发中的协作方式。

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

https://www.cnblogs.com/UnfriendlyARM/p/10321838.html

结论

看完本文,大家可能对回调函数和中断处理函数的关系产生了疑问。其实是这样的,单片机每完成接收一个字符,就会进入一次中断处理函数,而在中断处理函数中,我们又调用了函数
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
该函数会间接调用回调函数,也就是说回调函数是由中断处理函数间接调用的。而函数

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

决定了中断处理函数调用回调函数的频率,若Size为1,则每进入一次中断处理函数都会调用一次回调函数;
若Size为10,则每第十次进入中断处理函数时,才会调用回调函数。

STM32微控制器中的中断回调函数是用来处理特定硬件事件(如定时器溢出、外部信号线中断等)的一种编程机制。当某个中断源发生时,CPU会暂停当前任务,转向执行预先设置好的中断服务程序(ISERVICES),即中断回调函数。 以下是使用STM32中断回调函数的一般步骤: 1. **配置中断**: 首先,你需要在STM32的系统配置文件(例如`stm32f10x.h`或`stm32cubeMX`生成的`hal_mdTypeDef.h`)中启用相应的中断,并通过`NVIC_InitStructure`结构体来设置中断优先级向量地址。 ```c void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 指定模式,比如下降沿触发 GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIO // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 设置中断优先级组别 HAL_NVIC_EnableIRQ(GPIOA_IRQn); // 启用中断 } ``` 2. **定义中断服务函数**: 这是一个标准函数,通常带有`__attribute__((interrupt))`或`extern "C"`前缀。在这个函数里,你可以获取到中断标志位并根据需要执行相应的操作。 ```c void EXTI0_IRQHandler(void) __attribute__((interrupt("IRQ"))) { if (HAL_GPIO_GetState(GPIOA_PIN_0) == GPIO_PIN_RESET) { // 判断中断条件 // 执行中断处理逻辑 // ... } } ``` 3. **清除中断标志**: 接受中断处理后,记得清理中断标志,以便于下一次中断的触发。 ```c void EXTI0_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIOA_PIN_0); // 使用库提供的中断处理宏自动清除标志 // ... } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值