问题:我调用了 HAL_UART_Transmit_IT() 或 HAL_UART_Receive_IT(),这里面使能了中断,且中断回调函数被调用了,代码里完全看不到 HAL_UART_TxCpltCallback() 或 HAL_UART_RxCpltCallback() 被调用,为什么回调函数还是能执行?
真相是:回调函数确实被调用了,但被 HAL 库“藏”得很深,藏在了中断处理函数的子函数里
以下通过串口中断发送来查看回调函数的调用:
一、解释串口两种发送模式
首先解释一下两种发送模式,一种HAL_UART_Transmit,一种HAL_UART_Transmit_IT。
普通发送(阻塞模式)HAL_UART_Transmit(&huart1, data, size, timeout);
CPU全程等待:发送过程中CPU一直占用,直到数据发完或超时
简单直接:代码执行到这里就停住,发完才继续往下走
适合:发送少量数据,对实时性要求不高的场合
IT模式(中断模式)HAL_UART_Transmit_IT(&huart1, data, size);
CPU不等待:启动发送后立即返回,CPU可以继续做其他事
后台发送:数据在后台通过中断逐个字节发送
发送完成通知:发送完毕后会调用回调函数 HAL_UART_TxCpltCallback()
适合:发送大量数据,或需要CPU同时处理其他任务的场合
二、通过使用(中断模式)串口发送查看回调函数
在main函数中,我使用HAL_UART_Transmit_IT()来发生数据。

进入HAL_UART_Transmit_IT(),我们看到通过 __HAL_UART_ENABLE_IT(huart, UART_IT_TXE);使能硬件中断





《STM32通过代码分析Callback回调函数的调用》 是转载文章,点击查看原文。