[应用相关]

回调函数总结

[复制链接]
1005|6
手机看帖
扫描二维码
随时随地手机跟帖
小灵通2018|  楼主 | 2018-11-6 15:30 | 显示全部楼层 |阅读模式
普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数
对普通函数的调用:
调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”
对回调函数调用:
调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。


小灵通2018|  楼主 | 2018-11-6 15:30 | 显示全部楼层
位置: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 */ 

使用特权

评论回复
观海| | 2018-11-7 11:52 | 显示全部楼层
回调函数可以嵌套吗

使用特权

评论回复
guanjiaer| | 2018-11-7 12:09 | 显示全部楼层
应该是可以嵌套的

使用特权

评论回复
heimaojingzhang| | 2018-11-7 12:14 | 显示全部楼层
其实只是功能不同

使用特权

评论回复
renzheshengui| | 2018-11-7 12:58 | 显示全部楼层
其实只是调用的地方不同 而已

使用特权

评论回复
wakayi| | 2018-11-7 13:03 | 显示全部楼层
压栈出栈是不同的把

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

116

主题

1441

帖子

4

粉丝