普通函数与回调函数的差异:便是ST将中断封装,给利用者的API,便是标准库的中断函数
对普通函数的调用:

调用程序发出对普通函数的调用后,程序实行立即转向被调用函数实行,直到被调用函数实行完毕后,再返回调用程序连续实行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数实行完毕-->连续实行”
对回调函数调用:
调用程序发出对回调函数的调用后,不等函数实行完毕,立即返回并连续实行。这样,调用程序执和被调用函数同时在实行。当被调函数实行完毕后,被调函数会反过来调用某个事先指定函数,以关照调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。
位置:stm32f4xx_hal_xxx.c 中
定义为虚函数
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef huart)
串口回调:stm32f4xx_hal_uart.c
voidHAL_UART_IRQHandler(UART_HandleTypeDefhuart);
voidHAL_UART_TxCpltCallback(UART_HandleTypeDefhuart); //发送回调
voidHAL_UART_TxHalfCpltCallback(UART_HandleTypeDefhuart);
voidHAL_UART_RxCpltCallback(UART_HandleTypeDefhuart); //吸收回调
voidHAL_UART_RxHalfCpltCallback(UART_HandleTypeDefhuart);
voidHAL_UART_ErrorCallback(UART_HandleTypeDefhuart);
voidHAL_UART_AbortCpltCallback(UART_HandleTypeDefhuart);
voidHAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDefhuart);
voidHAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDefhuart);
举例:
我利用的stm32的两路串口收发,两个串口吸收中断处理有问题,我现在的处理办法是这样的
/ USER CODE BEGIN 4 /voidHAL_UART_RxCpltCallback(UART_HandleTypeDefhuart) { 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_HandleTypeDefhtim); //周期运行回调,配置定时进入中断
voidHAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDefhtim);//输出比较回调
voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDefhtim);
voidHAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDefhtim);
voidHAL_TIM_TriggerCallback(TIM_HandleTypeDefhtim);
voidHAL_TIM_ErrorCallback(TIM_HandleTypeDefhtim);
GPIO:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDefGPIOx,uint16_t GPIO_Pin);//读引脚状态
voidHAL_GPIO_WritePin(GPIO_TypeDefGPIOx,uint16_t GPIO_Pin,GPIO_PinState PinState); //写状态
voidHAL_GPIO_TogglePin(GPIO_TypeDefGPIOx,uint16_t GPIO_Pin); //翻转电平
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDefGPIOx,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 /






