软件生成的代码 串口的使用
使用回调函数的条件:
[..] UART HAL 驱动程序可以按如下方式使用:
(#) 声明一个 UART_HandleTypeDef 句柄结构(例如 UART_HandleTypeDef huart)。
(#) 通过实现 HAL_UART_MspInit() API 初始化 UART 低级资源:
(##) 启用 USARTx 接口时钟。
(##) UART 引脚配置:(+++) 启用 UART GPIO 的时钟。
(+++) 将 UART TX/RX 引脚配置为备用功能上拉。
(##) NVIC 配置如果您需要使用中断处理(HAL_UART_Transmit_IT() 和 HAL_UART_Receive_IT() APIs):
(+++)配置 USARTx 中断优先级。
(+++) 启用 NVIC USART IRQ 句柄。
(##) DMA 配置,如果您需要使用 DMA 进程(HAL_UART_Transmit_DMA() 和 HAL_UART_Receive_DMA() API):
(+++) 为 Tx/Rx 流声明 DMA 句柄结构。
(+++) 使能 DMAx 接口时钟。
(+++) 使用所需的 Tx/Rx 参数配置声明的 DMA 句柄结构。
(+++) 配置 DMA Tx/Rx 流。
(+++) 将初始化的 DMA 句柄关联到 UART DMA Tx/Rx 句柄。
(+++) 为 DMA Tx/Rx 流上的传输完成中断配置优先级并启用 NVIC。
(+++) 配置USARTx中断优先级并启用NVIC USART IRQ句柄(用于DMA非循环模式下的最后一个字节发送完成检测)
(#) 在 huart Init 结构中编程波特率、字长、停止位、奇偶校验、硬件流控制和模式(接收器/发送器)。
(#) 对于 UART 异步模式,通过调用 HAL_UART_Init() API 来初始化 UART 寄存器。
(#) 对于 UART 半双工模式,通过调用 HAL_HalfDuplex_Init() API 来初始化 UART 寄存器。
(#) 对于 LIN 模式,通过调用 HAL_LIN_Init() API 来初始化 UART 寄存器。
(#) 对于多处理器模式,通过调用 HAL_MultiProcessor_Init() API 来初始化 UART 寄存器。
[..]
(@) 特定的 UART 中断(传输完成中断、RXNE 中断和错误中断)将在发送和接收过程中使用宏 __HAL_UART_ENABLE_IT() 和 __HAL_UART_DISABLE_IT() 进行管理。
[..]
(@) 这些 API(HAL_UART_Init() 和 HAL_HalfDuplex_Init())还通过调用自定义的 HAL_UART_MspInit() API 配置低级硬件 GPIO、CLOCK、CORTEX...等)。
#####回调注册##### ==================================
[..] 当设置为 1 时,编译定义 USE_HAL_UART_REGISTER_CALLBACKS 允许用户动态配置驱动程序回调。
[..] 使用函数 HAL_UART_RegisterCallback() 注册用户回调。
函数 HAL_UART_RegisterCallback() 允许注册以下回调:
(+) TxHalfCpltCallback : Tx Half Complete Callback.
(+) TxCpltCallback : Tx Complete Callback.
(+) RxHalfCpltCallback : Rx Half Complete Callback.
(+) RxCpltCallback : Rx Complete Callback.
(+) ErrorCallback : Error Callback.
(+) AbortCpltCallback : Abort Complete Callback.
(+) AbortTransmitCpltCallback : Abort Transmit Complete Callback.
(+) AbortReceiveCpltCallback : Abort Receive Complete Callback.
(+) MspInitCallback : UART MspInit.
(+) MspDeInitCallback : UART MspDeInit.
该函数将 HAL 外设句柄、回调 ID 和指向用户回调函数的指针作为参数。
[..] 使用函数 HAL_UART_UnRegisterCallback() 将回调重置为默认的弱(附加)函数。
HAL_UART_UnRegisterCallback() 将 HAL 外设句柄和回调 ID 作为参数。
此功能允许重置以下回调:
(+) TxHalfCpltCallback : Tx Half Complete Callback.
(+) TxCpltCallback : Tx Complete Callback.
(+) RxHalfCpltCallback : Rx Half Complete Callback.
(+) RxCpltCallback : Rx Complete Callback.
(+) ErrorCallback : Error Callback.
(+) AbortCpltCallback : Abort Complete Callback.
(+) AbortTransmitCpltCallback : Abort Transmit Complete Callback.
(+) AbortReceiveCpltCallback : Abort Receive Complete Callback.
(+) MspInitCallback : UART MspInit.
(+) MspDeInitCallback : UART MspDeInit.
[..] 默认情况下,在 HAL_UART_Init() 之后且状态为 HAL_UART_STATE_RESET 时,所有回调都设置为相应的弱(附加)函数:
示例 HAL_UART_TxCpltCallback()、HAL_UART_RxHalfCpltCallback()。
仅当这些回调为空(未事先注册)时,对 MspInit 和 MspDeInit 函数分别重置为 HAL_UART_Init() 和 HAL_UART_DeInit() 中的传统弱(附加)函数的异常完成。
如果不是,则 MspInit 或 MspDeInit 不为空,HAL_UART_Init() 和 HAL_UART_DeInit() 保留并使用用户 MspInit/MspDeInit 回调(预先注册)。
[..] 回调只能在 HAL_UART_STATE_READY 状态下注册/取消注册。
异常完成 MspInit/MspDeInit 可以在 HAL_UART_STATE_READY 或 HAL_UART_STATE_RESET 状态注册/取消注册,因此注册(用户)MspInit/DeInit 回调可以在 Init/DeInit 期间使用。
在这种情况下,首先使用 HAL_UART_RegisterCallback() 注册 MspInit/MspDeInit 用户回调,然后再调用 HAL_UART_DeInit() 或 HAL_UART_Init() 函数。
[..] 当编译定义 USE_HAL_UART_REGISTER_CALLBACKS 设置为 0 或未定义时,回调注册功能不可用并使用弱(附加)回调。
[..] 此驱动程序中提供了三种操作模式:
*** 轮询模式 IO 操作 *** ============================ ======
[..] (+) 使用 HAL_UART_Transmit() 以阻塞模式发送一定量的数据
(+) 使用 HAL_UART_Receive() 以阻塞模式接收一定量的数据
*** 中断模式 IO 操作 *** ==================================
[..] (+) 以非阻塞方式发送一定量的数据 mode using HAL_UART_Transmit_IT()
(+) 在传输结束时执行 HAL_UART_TxCpltCallback,用户可以通过自定义函数指针添加自己的代码 HAL_UART_TxCpltCallback
(+) 使用 HAL_UART_Receive_IT() 在非阻塞模式下接收一定量的数据
(+) 在接收 传输结束 HAL_UART_RxCpltCallback 被执行,用户可以通过自定义函数指针添加自己的代码 HAL_UART_RxCpltCallback
(+) 如果传输错误,HAL_UART_ErrorCallback( ) 函数被执行,用户可以通过自定义函数指针 HAL_UART_ErrorCallback 添加自己的代码
*** DMA 模式 IO 操作 *** ==============================
[..] (+) 发送金额 使用 HAL_UART_Transmit_DMA()
(+) 在半传输传输结束时执行 HAL_UART_TxHalfCpltCallback,用户可以通过自定义函数指针添加自己的代码 HAL_UART_TxHalfCpltCallback
(+) 在传输传输结束时执行 HAL_UART_TxCpltCallback 用户可以通过自定义函数指针来添加自己的代码 HAL_UART_TxCpltCallback
(+) 使用 HAL_UART_Receive_DMA() 在非阻塞模式 (DMA) 接收一定量的数据
(+) 在半传输的接收端执行 HAL_UART_RxHalfCpltCallback 并且用户可以添加自己的代码 通过自定义函数指针 HAL_UART_RxHalfCpltCallback
(+) 在传输的接收端执行 HAL_UART_RxCpltCallback,用户可以通过自定义函数指针 HAL_UART_RxCpltC 添加自己的代码 allback
(+) 如果传输错误,则执行 HAL_UART_ErrorCallback() 函数,用户可以通过自定义函数指针添加自己的代码 HAL_UART_ErrorCallback
(+) 使用 HAL_UART_DMAPause() 暂停 DMA 传输
(+) 使用 HAL_UART_DMAResume() 恢复 DMA 传输 )
(+) 使用 HAL_UART_DMAStop() 停止 DMA 传输
[..] 本小节还提供了一组附加功能,为用户提供增强的接收服务。 (例如,这些函数允许应用程序处理要接收的数据数量未知的用例)。
(#) 与仅考虑接收数据元素数量作为接收完成标准的标准接收服务相比,这些功能还考虑了附加事件作为向呼叫者更新接收状态的触发器:
(+) 检测不活动期(RX 线尚未激活) 在一定时期内)。
(++) IDLE 事件检测到 RX 不活动,即 RX 线在最后一个接收字节后一直处于空闲状态(通常为高状态)达 1 帧时间。
(#) 有两种传输模式:
(+) 阻塞模式:以轮询模式执行接收,直到接收到预期数量的数据,或直到 IDLE 事件发生。 接收仅在函数执行期间处理。
当函数退出时,不会发生数据接收。 HAL 状态和实际接收到的数据元素的数量,在传输完成后由函数返回。
(+) 非阻塞模式:使用中断或 DMA 执行接收。
这些 API 返回 HAL 状态。
使用中断模式时会通过专用的UART IRQ 或使用DMA 模式时的DMA IRQ 来指示数据处理的结束。
HAL_UARTEx_RxEventCallback() 用户回调将在接收过程中执行 HAL_UART_ErrorCallback() 用户回调将在检测到接收错误时执行。
(#) 阻塞模式 API:
(+) HAL_UARTEx_ReceiveToIdle()
(#) 带中断的非阻塞模式 API:
(+) HAL_UARTEx_ReceiveToIdle_IT()
(#) 带 DMA 的非阻塞模式 API:
(+) HAL_UARTEx_ReceiveToIdle_DMA()
*** UART HAL 驱动宏列表 ***
======================================== ======
[..] 在 UART HAL 驱动程序中最常用的宏列表下方。
(+) __HAL_UART_ENABLE:启用 UART 外设
(+) __HAL_UART_DISABLE:禁用 UART 外设
(+) __HAL_UART_GET_FLAG :检查指定的 UART 标志是否设置
(+) __HAL_UART_CLEAR_FLAG :清除指定的 UART 挂起标志
(+) 启用 __HAL_IT_UART 指定的 UART 中断
(+) __HAL_UART_DISABLE_IT: 禁用指定的 UART 中断
(+) __HAL_UART_GET_IT_SOURCE: 检查指定的 UART 中断是否发生
[..] (@) 更多有用的宏可以参考 UART HAL 驱动头文件 @endverbatim
[..] (@) 补充说明:如果启用了奇偶校验,则写入数据寄存器的数据的 MSB 位会被传输,但会被奇偶校验位改变。
根据 M 位(8 位或 9 位)定义的帧长,可能的 UART 帧格式如下表所示: