GD32F303固件库开发(9)----USART通过DMA收发
@TOC
概述
本章主要配置printf进行打印。 查阅手册可以得知,PA9、PA10为串口0的输出和输入口。需要样片的可以加Qun申请:615061293。

视频教学
https://www.bilibili.com/video/BV1QG411p7cw/

csdn课程
课程更加详细。 https://download.csdn.net/course/detail/37144
样品申请
https://www.wjx.top/vm/wFGhGPF.aspx#
硬件准备
这里准备了1块开发板进行验证,分别是GD32303C_START开发板。

DMA
DMA 控制器提供了一种硬件的方式在外设和存储器之间或者存储器和存储器之间传输数据,而无需 CPU 的介入,从而使 CPU 可以专注在处理其他系统功能上。DMA 控制器有 12 个通道(DMA0 有 7 个通道,DMA1 有 5 个通道)。每个通道都是专门用来处理一个或多个外设的存储器访问请求的。DMA 控制器内部实现了一个仲裁器,用来仲裁多个 DMA 请求的优先级。 DMA 控制器和 Cortex™-M4 内核共享系统总线。当 DMA 和 CPU 访问同样的地址空间时,DMA 访问可能会阻挡 CPU 访问系统总线几个总线周期。总线矩阵中实现了循环仲裁算法来分配 DMA 与 CPU 的访问权,它可以确保 CPU 得到至少一半的系统总线带宽。 主要特性:
传输数据长度可编程配置,最大到 65536;
12 个通道,并且每个通道都可配置(DMA0 有 7 个通道,DMA1 有 5 个通道);
AHB 和 APB 外设,片上闪存和 SRAM 都可以作为访问的源端和目的端;
每个通道连接固定的硬件 DMA 请求;
支持软件优先级(低、中、高、极高)和硬件优先级(通道号越低,优先级越高);
存储器和外设的数据传输宽度可配置:字节,半字,字;
存储器和外设的数据传输支持固定寻址和增量式寻址;
支持循环传输模式;
支持外设到存储器,存储器到外设,存储器到存储器的数据传输;
每个通道有 3 种类型的事件标志和独立的中断;
支持中断的使能和清除。

DMA0对应通道。

DMA1对应通道。

keil配置
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。

定义发送数据
使能串口
串口重定向
串口重定向后就可以使用printf进行打印。
发送DMA初始化
在DMA初始化的时候,可以将需要发送的数据填充在memory_addr中,注意需要填上长度number。
使能DMA发送
开启DMA0_3通道,这个通道位串口0的TX。
dma_flag_get()函数说明
dma_flag_get()函数功能是获取DMAx通道y标志位状态。 主要的输入参数有4个。

在GD303固件库中,使用DMA_INTF_FTFIF和DMA_FLAG_FTF是一样的。

DMA发送测试代码
DMA发送测试结果

DMA循环发送
修改代码。
修改为。
结果如下。

定义接收数组
接收DMA初始化
在DMA初始化的时候,可以将需要接收的数据填充在memory_addr中,注意需要填上长度number。
使能串口空闲中断
当接收完数据之后,会进入空闲中断。
USART0_IRQHandler()函数
定义串口的中断服务函数,当DMA接收完毕会进入。
最后
以上的代码会在Q_qun里分享。Qqun:615061293。 或者关注『记帖』,持续更新文章和学习资料!

DMA接收测试结果

由于不是循环接收,当接收长度超过数组的长度,就会照成数据混乱。 解决办法可以增加接受数组的长度或者设用循环接收,但是循环接收会覆盖之前接收到的数据。
DMA循环接收
修改代码。
修改为
结果如下。
