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

对普通函数的调用:

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

对回调函数调用:

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

位置:stm32f4xx_hal_xxx.c 中

定义为虚函数

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

串口回调:stm32f4xx_hal_uart.c

  1. voidHAL_UART_IRQHandler(UART_HandleTypeDef*huart);
  2. voidHAL_UART_TxCpltCallback(UART_HandleTypeDef*huart);    //发送回调
  3. voidHAL_UART_TxHalfCpltCallback(UART_HandleTypeDef*huart);
  4. voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart);    //接收回调
  5. voidHAL_UART_RxHalfCpltCallback(UART_HandleTypeDef*huart);
  6. voidHAL_UART_ErrorCallback(UART_HandleTypeDef*huart);
  7. voidHAL_UART_AbortCpltCallback(UART_HandleTypeDef*huart);
  8. voidHAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef*huart);
  9. voidHAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef*huart);

举例:

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

  1. /* USER CODE BEGIN 4 */
  2. voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart)
  3.        {
  4.                if(huart==&huart2)
  5.                {
  6.                                 uRX_buf[RX_cont++]=RX_buf;
  7. //                HAL_UART_Transmit_DMA(&huart2, uTX_buf, 8);
  8.                                if(RX_cont>63)
  9.                                {
  10.                                         RX_cont=0;
  11.                                }
  12.                 }
  13.                 else if(huart==&huart4)
  14.                {
  15.                                 uRX_buf[RX_cont++]=RX_buf4;
  16.                                if(RX_cont>63)
  17.                                {
  18.                                         RX_cont=0;
  19.                                }
  20. //                        HAL_UART_Receive_IT(&huart4,&RX_buf4,1);//¡ä??¨²?¨®¨º¨¹?D??
  21.                }

定时器回调:stm32f4xx_hal_tim.c

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

GPIO:

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

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

  1. /* USER CODE BEGIN 4 */ 
  2. voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 
  3. { 
  4.  /* NOTE: This function Should not be modified, when the callback is needed,
  5.            the HAL_GPIO_EXTI_Callback could be implemented in the user file
  6.    */ 
  7.    switch(GPIO_Pin) 
  8.    { 
  9.        caseGPIO_PIN_12:LED0_Toggle();break; 
  10.        caseGPIO_PIN_13:LED1_Toggle();break; 
  11.        caseGPIO_PIN_14:LED2_Toggle();break; 
  12.        caseGPIO_PIN_15:LED3_Toggle();break; 
  13.        default:break; 
  14.    } 
  15. } 
  16. /* USER CODE END 4 */ 

STM32 HAL库学习系列第8篇---回调函数总结的更多相关文章

  1. STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置

    cube基本配置,外设开启编码器,串口2 可能大家在设置的时候有这个错误 错误:error:  #20: identifier "TIM_ICPOLARITY_BOTHEDGE" ...

  2. STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

    ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放 ...

  3. STM32 HAL库学习系列第6篇---定时器TIM 级联配置

    应用情景 使用定时器配置编码器模式,发现STM32只有两个定时器是32位,16位的测量值不够用,发现是可以使用两个16位定时器级联为32位的. 我是在使用编码器计数电机转速时使用,但是最终实现的效果不 ...

  4. STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置

    基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM ...

  5. STM32 HAL库学习系列第3篇 常使用的几种延时方式

    1   自带的hal_delay 函数    毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick( ...

  6. STM32 HAL库学习系列第2篇 GPIO配置

    GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...

  7. STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能

    测量脉冲宽度或者测量频率   基本方法 1.设置TIM2 CH1为输入捕获功能:  2.设置上升沿捕获:  3.使能TIM2 CH1捕获功能:  4.捕获到上升沿后,存入capture_buf[0], ...

  8. STM32 HAL库学习系列---定时器TIM 输入捕获功能

    基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿: 5.捕获到下降沿后 ...

  9. 我们一起学习WCF 第八篇回调函数

    什么是回调函数? 一个简单的例子:小明想要在京东购买一件商品.他会登陆网站选好自己的商品.然后他把这件商品放在购物车,然后开始付钱(这个表示触发,不付钱不发货(排除货到付款)).然后京东的人员收到了小 ...

随机推荐

  1. Nginx限制ip访问

    首先建立下面的配置文件放在nginx的conf目录下面,命名为blocksip.conf: 加入以下代码: #屏蔽soso蜘蛛IP deny 113.108.12.154; #此为搜搜蜘蛛IP den ...

  2. Nginx 504响应超时

    1.问题分析 nginx访问出现504 Gateway Time-out,一般是由于程序执行时间过长导致响应超时,例如程序需要执行90秒,而nginx最大响应等待时间为30秒,这样就会出现超时.    ...

  3. MySQL中事务的隔离级别

    MySQl InnoDB存储引擎实现SQL标准的4种隔离级别(RU,RC,RR,serializable),用来限定事务内外的哪些改变时可见的,哪些时不可见的.低级别的隔离级一般支持更高的并发处理,并 ...

  4. 【ARTS】01_47_左耳听风-201900930~201901006

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  5. 基于TreeSoft实现异构数据同步

    一.为了解决数据同步汇聚,数据分发,数据转换,数据维护等需求,TreeSoft将复杂的网状的同步链路变成了星型数据链路.     TreeSoft作为中间传输载体负责连接各种数据源,为各种异构数据库之 ...

  6. Django时区导致的datetime时间比较报错

    我们使用python 的datetime模块比较Django数据库Datetime字段的时候,可能会出现报错: TypeError: can't compare offset-naive and of ...

  7. HashMap的key存储对象需要注意哪些

    HashMap的key最好不要存储对象,大部分环境都是String. 如果要存储对象,要注意重写下equal和hashcode方法!!

  8. Qt 编译出错“undefined reference to `vtable for”

    1. 有时,如果将某个类改为继承自QObject类(以前不继承自该类),编译时会出错. 解决: clean Project, run qmake, rebulid都运行一遍,好了! 因为qmake生成 ...

  9. 《ucore lab6》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1: 使用 Round Robin 调度算法(不需要编码) 题目 完成练习0后,建议大家比较一下(可用kdiff3等文件比较软件) 个人完成 ...

  10. synchrnized 和lock的区别