STM32CubeIDE开发笔记4:USART异步通信+DMA

STM32CubeIDE开发笔记4:USART异步通信+DMA

  • USART的基本配置
  • 调用HAL库的USART函数
    • 异步发送
    • 异步接收
    • DMA 收发
      • 注意

本文链接:https://blog.csdn.net/qq_42038029/article/details/103835984
版权声明:本文为CSDN博主「遥望1415984987」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
stm32CubeIDE所用版本:1.1.0
固件库包:f1 1.8.0
测试平台stm32f103c8t6

USART的基本配置

配置如图所示
STM32CubeIDE开发笔记4:USART异步通信+DMA_第1张图片

调用HAL库的USART函数

异步发送

这里包括了我们能用到的库函数:
串口的发送接收函数:
HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。
HAL_UART_Receive();串口轮询模式接收,使用超时管理机制。
HAL_UART_Transmit_IT();串口中断模式发送,
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Receive_DMA();串口DMA模式接收
串口相关的中断函数:
HAL_UART_TxHalfCpltCallback():一半数据(half transfer)发送完成后,通过中断处理函数调用。
HAL_UART_TxCpltCallback():发送完成后,通过中断处理函数调用。
HAL_UART_RxHalfCpltCallback():一半数据(half transfer)接收完成后,通过中断处理函数调用。
HAL_UART_RxCpltCallback():接收完成后,通过中断处理函数调用。
HAL_UART_ErrorCallback():传输过程中出现错误时,通过中断处理函数调用。

本次我们使用HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。
STM32CubeIDE开发笔记4:USART异步通信+DMA_第2张图片
在主程序的while循环里加入如下程序:

HAL_UART_Transmit(&huart1,"Hello World!\r\n",14,10);
HAL_Delay(1000);

第一个参数是串口
第二个参数是要发送的字符串
第三个参数是发送字符的个数
第四个参数是超时时间。(这里我随便输的10,有点例程用最大的0XFFFF,也有用0的,我都试过,都能成功发送,想要深入研究可自行查看源码)
STM32CubeIDE开发笔记4:USART异步通信+DMA_第3张图片
下载到单片机上,用串口用助手验证。(注意串口助手的配置要与单片机相同才能通信;连接TTL转UASRT时TX接RX,不懂的自行百度)

STM32CubeIDE开发笔记4:USART异步通信+DMA_第4张图片

异步接收

异步接收我们使用HAL_UART_Receive_IT();串口中断模式接收。
先记得开启中断再更新工程
然后我们编写程序让串口助手发送一个“a”,单片机接收后回复“I get a”;
先在USER CORD4里添加下段代码

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart == &huart1)
    {
    	HAL_UART_Transmit(&huart1, (uint8_t *)"I get ", 6,0xFFFF);
    	HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, sizeof(aRxBuffer),0xFFFF);
    	HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 4,0xFFFF);
    }
}

添加字符串变量
在这里插入图片描述
while添加接收函数
STM32CubeIDE开发笔记4:USART异步通信+DMA_第5张图片
第一个变量是串口号
第二个变量是存储接收字符的地址
第三个变量是接收字符个数
下载到单片机上验证

STM32CubeIDE开发笔记4:USART异步通信+DMA_第6张图片
从这可以看出与预期一致,下面这张在线调试的图也一样。
STM32CubeIDE开发笔记4:USART异步通信+DMA_第7张图片

DMA 收发

DMA的用法与上面的类似,使用的是:
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Receive_DMA();串口DMA模式接收

使用前要注意,首先要配置好,要开启中断,不然发的时候会出现问题。
STM32CubeIDE开发笔记4:USART异步通信+DMA_第8张图片
然后用法与上面的**HAL_UART_Transmit(),HAL_UART_Receive()**一致,这里不多说了,说几点要注意的:

注意

如果你先只加了USART,后面再加DMA,cubemx可能会
MX_USART1_UART_Init();

MX_DMA_Init();
这样会导致发送失败,具体原因我没深究,必需换下顺序,下图这样是正确的。
STM32CubeIDE开发笔记4:USART异步通信+DMA_第9张图片
当然,你用CUBUMX配置时一开始就把USART与DMA同时导入,顺序就是对的。

有的老一点的资料说要加这一段代码:

//void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
//{
////回调函数
//huart->gState=HAL_UART_STATE_READY;
//
//
//}

亲测加不加不影响,我用的CUBEMX版本5.4,F1HAL库函数版本1.80。

创作不易,点个赞吧!

你可能感兴趣的:(stm32,stm32,单片机,串口通信,dma,物联网)