嵌入式c 回调函数实例
时间: 2024-08-16 18:08:52 浏览: 48
嵌入式C中的回调函数是一种编程技术,它允许我们在特定事件发生时自动调用预先指定的函数。这种技术常用于处理硬件中断、定时任务完成、数据接收等场景,当某个操作完成后,系统会自动调用事先注册好的回调函数来执行后续处理。
例如,假设有一个GPIO引脚被配置为外部中断源,当这个引脚检测到外部信号变化时,就会触发中断。这时,我们可以在初始化阶段设置一个回调函数作为中断服务程序(ISR)。当中断发生时,中断处理器会自动调用这个回调函数,传递中断的相关信息,如中断编号或中断标志位。
```c
typedef void (*callback_function)(void *context); // 定义回调函数类型
void set_callback(GPIO_TypeDef *gpio, callback_function callback, void *context) {
// 设置中断并注册回调
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = GPIO_Pin_0; // 设定GPIO引脚
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 设置模式为中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 触发类型
EXTI_InitStructure.EXTI Interrupt = EXTI_Interrupt_Enable; // 开启中断
HAL_GPIO_EXTI_Init(gpio, &EXTI_InitStructure);
// 注册回调函数和上下文
EXTI_SetITPendingBit(EXTI_Line_0);
EXTI_ClearITPendingBit(EXTI_Line_0);
EXTI戈CallbackRegister(gpio_line_IRQn, callback, context);
}
// 中断服务程序示例
void gpio_line_IRQHandler(void) interrupt handlers {
if (EXTI_GetITStatus(EXTI_Line_0) != RESET) { // 检查中断是否发生
callback_function callback = (callback_function)EXTI_GetCallBack(EXTI_Line_0); // 获取回调函数地址
callback(context); // 调用回调函数,context为之前传递的参数
EXTI_ClearITPendingBit(EXTI_Line_0); // 清除中断标志
}
}
```
阅读全文