10.4.1 内存到外设USART数据传输设计

更新于 2026年10月10日 版权声明
10.4.1 内存到外设USART数据传输设计

1.任务要求

现STM32F1的内存中存放有一数据:uint8_t SendBuff[]={"***Principle and application of embedded system***\r\n***USART Output Message By DMA!\r\n"},请利用DMA控制器将数据通过外设串口2传输到计算机,计算机利用串口调试助手接收。请设计硬件电路、软件程序代码,并通过Proteus完成仿真和调试。

2.硬件设计

USART的DMA通信图如图10.8所示。STM32F1系列MCU通过USART2与外接的串口转USB接口芯片CH340相连,引脚分别是PA2和PA3。CH340再与计算机的USB接口相连。计算机需安装上串口调试助手。

3.软件设计

图示

图10.8 USART的DMA通信图

软件部分一方面需要配置DMA,另一方面需要配置串口2。系统时钟采用8 MHz的内部振荡器。

在STMCubeMX中,进入“Pinout&Configuration”配置界面,展开“Connectivity”(通信)列表,勾选“USART2”选项,分别配置基本参数和DMA参数,串口的基础参数配置方法和前面一样,设置波特率为115 200 bit/s,数据位为8位,停止位为1位,无校验位。DMA参数配置如图10.9所示。

图示

图10.9 DMA参数配置

配置好参数后,生成MDK工程文件。DMA的初始化程序在“usart.c”文件中,无须修改,在“dma.c”文件中只是对DMA的中断进行了配置。

内存数据到外设串口的程序在“main.c”中实现,定义一个数组用于存放内存数据,在主程序中通过串口发送程序将数据发出,代码如下。

图示

程序中,用数组SendBuff[]定义数据,串口的DMA发送函数HAL_UART_Transmit_DMA()用于发送数据,延时函数HAL_Delay(1000)用于延时1秒钟发送一次数据。(https://www.daowen.com)

4.仿真与调试

在Proteus中绘制仿真电路图,把编译的.hex文件加载到工程中,内存SendBuff[]中的批量数据能够通过串口2的DMA方式快速发出,仿真电路图与调试效果如图10.10所示。

图示

图10.10 仿真电路图与调试效果

在接收数据的时候,串口DMA在初始化的时候就处于开启状态,一直等待数据的到来。无须做任何事情,只要在初始化配置的时候设置好配置就可以了。等到接收到数据的时候,通知CPU去处理即可。问题是,STM32F1如何知道数据是否接收完成呢?

对于定长的数据,只需要判断数据的接收个数,就可知道数据是否接收完成。

对于不定长的数据,可以采用串口的空闲中断和DMA结合的方式实现。串口的空闲中断(IDLE)规定产生的条件是当清除IDLE标志位后,必须接收到第一个数据后,才开始触发空闲中断,一旦接收的数据断流,没有接收到数据,就产生IDLE中断,切记不是串口无数据接收就产生空闲中断。对IDLE中断的处理步骤如下。

(1)暂时关闭串口接收DMA通道,有两个原因:其一是防止后面又有数据被接收,产生干扰;其二是DMA需要重新配置。

(2)清除DMA标志位。

(3)从DMA寄存器中获取接收到的数据字节数(如DMA1_Channel5->CNDTR,每次DMA传输后递减,如该值为65530,表示接收了5个字节数据,该值为0时,不会发生任何数据传输)。

(4)重新设置DMA下次要接收的数据字节数。注意,数据传输数量范围为0~65535。

(5)开启DMA通道,等待下一次的数据接收。注意,对DMA的相关寄存器配置写入,如重置DMA接收数据长度,必须要在关闭DMA的条件下进行,否则操作无效。

串口1空闲中断的DMA接收程序如下。

图示

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)