博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32 HAL库学习系列第8篇---回调函数总结
阅读量:5140 次
发布时间:2019-06-13

本文共 3211 字,大约阅读时间需要 10 分钟。

12856594-a8518d7be3709d7a.webp.jpg

普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数

对普通函数的调用:

调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”

对回调函数调用:

调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。

 

位置:stm32f4xx_hal_xxx.c 中

 

定义为虚函数

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

 

串口回调:stm32f4xx_hal_uart.c 

voidHAL_UART_IRQHandler(UART_HandleTypeDef*huart);voidHAL_UART_TxCpltCallback(UART_HandleTypeDef*huart);    //发送回调voidHAL_UART_TxHalfCpltCallback(UART_HandleTypeDef*huart);voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart);    //接收回调voidHAL_UART_RxHalfCpltCallback(UART_HandleTypeDef*huart);voidHAL_UART_ErrorCallback(UART_HandleTypeDef*huart);voidHAL_UART_AbortCpltCallback(UART_HandleTypeDef*huart);voidHAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef*huart);voidHAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef*huart);

举例:

我使用的stm32的两路串口收发,两个串口接收中断处理有问题,我现在的处理方式是这样的

/* USER CODE BEGIN 4 */voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart)       {               if(huart==&huart2)               {                                uRX_buf[RX_cont++]=RX_buf;//                HAL_UART_Transmit_DMA(&huart2, uTX_buf, 8);                               if(RX_cont>63)                               {                                        RX_cont=0;                               }                }                else if(huart==&huart4)               {                                uRX_buf[RX_cont++]=RX_buf4;                               if(RX_cont>63)                               {                                        RX_cont=0;                               }//                        HAL_UART_Receive_IT(&huart4,&RX_buf4,1);//¡ä??¨²?¨®¨º¨¹?D??               }

定时器回调:stm32f4xx_hal_tim.c 

voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim);  //周期运行回调,配置定时进入中断voidHAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef*htim);//输出比较回调voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef*htim);  voidHAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef*htim);voidHAL_TIM_TriggerCallback(TIM_HandleTypeDef*htim);voidHAL_TIM_ErrorCallback(TIM_HandleTypeDef*htim);

 

GPIO:

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin);//读引脚状态voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin,GPIO_PinState PinState);  //写状态voidHAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin);  //翻转电平HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin); //锁存引脚状态voidHAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);   //实际调用的是下边的中断回调函数voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);     //引脚触发之后的回调函数,按键中断函数

举例; cube配置时开启中断触发模式

/* USER CODE BEGIN 4 */ voidHAL_GPIO_EXTI_Callback(uint16_t 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   */    switch(GPIO_Pin)    {        caseGPIO_PIN_12:LED0_Toggle();break;        caseGPIO_PIN_13:LED1_Toggle();break;        caseGPIO_PIN_14:LED2_Toggle();break;        caseGPIO_PIN_15:LED3_Toggle();break;        default:break;    } } /* USER CODE END 4 */ 

转载于:https://www.cnblogs.com/Allen5G/p/11145920.html

你可能感兴趣的文章
四级英语day10
查看>>
基于K-近邻分类算法的手写识别系统
查看>>
使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
查看>>
PC站跳转M站的方法
查看>>
wow 各职业体验(pvp)
查看>>
Streaming的receiver模式
查看>>
[转载]一个人的失败,99%失败于“脾气”
查看>>
一个简单的MDI示范程序(Delphi)
查看>>
统计实验数据 总结实验结果
查看>>
Spring 3.x MVC 入门4 -- @ResponseBody & @RequestBody
查看>>
62. Unique Paths
查看>>
Linux Linux程序练习十七
查看>>
数据库关系运算
查看>>
JavaSE基础之 IO流
查看>>
DDoS攻防战 (一) : 概述
查看>>
根据现有PDF模板填充信息(SpringBoot)
查看>>
div+css布局的好处
查看>>
《需求工程——软件建模与分析》阅读笔记一
查看>>
如何成为一枚好测试员
查看>>
【Nowcoder】玩游戏
查看>>