文章目录[隐藏]
STM32 不定长数据的接收和发送
-
接收采用IDLE中断 + DMA方式
HAL_UART_Receive_DMA()添加使能IDLE中断
SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
DMA传输完成中断是默认初始化开启的,但中断回调函数未重新实现,串口中断开启,并对空闲中断做处理。
局限性:每次接收的数据不能超过DMA设定的接收值,避免触发DMA传输完成,否则无法开启下一次传输。
DMA 接收传输完成回调函数如下:
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
串口中断处理函数HAL_UART_IRQHandler()添加空闲中断处理:
- 取消串口正在进行的接收操作
- 清空空闲标志
- 自己的回调函数处理(数据保存FIFO、重新开启下一次传输、释放信号量)
if(((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET)) { HAL_UART_AbortReceive(huart); //clear the IDLE flag __HAL_UART_CLEAR_IDLEFLAG(huart); //Abord the received process HAL_UART_AbortReceiveCpltCallback(huart); return; }
-
发送采用DMA传输完成中断
DMA传输完成回调函数UART_DMATransmitCplt()没有针对normal模式的回调函数,因此增加
自定义回调 HAL_UART_DMA_TxCpltCallback(huart) 释放信号量
if ((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) { huart->TxXferCount = 0x00U; /* Disable the DMA transfer for transmit request by setting the DMAT bit in the UART CR3 register */ CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); /* Enable the UART Transmit Complete Interrupt */ SET_BIT(huart->Instance->CR1, USART_CR1_TCIE); HAL_UART_DMA_TxCpltCallback(huart); }
版权声明:本文为CSDN博主「一只小菜鸟奋斗」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39949884/article/details/122275359
STM32 不定长数据的接收和发送
-
接收采用IDLE中断 + DMA方式
HAL_UART_Receive_DMA()添加使能IDLE中断
SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
DMA传输完成中断是默认初始化开启的,但中断回调函数未重新实现,串口中断开启,并对空闲中断做处理。
局限性:每次接收的数据不能超过DMA设定的接收值,避免触发DMA传输完成,否则无法开启下一次传输。
DMA 接收传输完成回调函数如下:
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
串口中断处理函数HAL_UART_IRQHandler()添加空闲中断处理:
- 取消串口正在进行的接收操作
- 清空空闲标志
- 自己的回调函数处理(数据保存FIFO、重新开启下一次传输、释放信号量)
if(((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET)) { HAL_UART_AbortReceive(huart); //clear the IDLE flag __HAL_UART_CLEAR_IDLEFLAG(huart); //Abord the received process HAL_UART_AbortReceiveCpltCallback(huart); return; }
-
发送采用DMA传输完成中断
DMA传输完成回调函数UART_DMATransmitCplt()没有针对normal模式的回调函数,因此增加
自定义回调 HAL_UART_DMA_TxCpltCallback(huart) 释放信号量
if ((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) { huart->TxXferCount = 0x00U; /* Disable the DMA transfer for transmit request by setting the DMAT bit in the UART CR3 register */ CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); /* Enable the UART Transmit Complete Interrupt */ SET_BIT(huart->Instance->CR1, USART_CR1_TCIE); HAL_UART_DMA_TxCpltCallback(huart); }
版权声明:本文为CSDN博主「一只小菜鸟奋斗」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39949884/article/details/122275359
暂无评论