STM32CubeIDE开发笔记4: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的基本配置
配置如图所示
调用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();串口轮询模式发送,使用超时管理机制。
在主程序的while循环里加入如下程序:
HAL_UART_Transmit(&huart1,"Hello World!\r\n",14,10);
HAL_Delay(1000);
第一个参数是串口
第二个参数是要发送的字符串
第三个参数是发送字符的个数
第四个参数是超时时间。(这里我随便输的10,有点例程用最大的0XFFFF,也有用0的,我都试过,都能成功发送,想要深入研究可自行查看源码)
下载到单片机上,用串口用助手验证。(注意串口助手的配置要与单片机相同才能通信;连接TTL转UASRT时TX接RX,不懂的自行百度)
异步接收
异步接收我们使用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添加接收函数
第一个变量是串口号
第二个变量是存储接收字符的地址
第三个变量是接收字符个数
下载到单片机上验证
从这可以看出与预期一致,下面这张在线调试的图也一样。
DMA 收发
DMA的用法与上面的类似,使用的是:
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Receive_DMA();串口DMA模式接收
使用前要注意,首先要配置好,要开启中断,不然发的时候会出现问题。
然后用法与上面的**HAL_UART_Transmit(),HAL_UART_Receive()**一致,这里不多说了,说几点要注意的:
注意
如果你先只加了USART,后面再加DMA,cubemx可能会
MX_USART1_UART_Init();
后
MX_DMA_Init();
这样会导致发送失败,具体原因我没深究,必需换下顺序,下图这样是正确的。
当然,你用CUBUMX配置时一开始就把USART与DMA同时导入,顺序就是对的。
有的老一点的资料说要加这一段代码:
//void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
//{
回调函数
//huart->gState=HAL_UART_STATE_READY;
//
//
//}
亲测加不加不影响,我用的CUBEMX版本5.4,F1HAL库函数版本1.80。
创作不易,点个赞吧!