欢迎光临散文网 会员登陆 & 注册

GD32F303固件库开发(9)----USART通过DMA收发

2022-12-13 15:27 作者:记帖  | 我要投稿

@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 得到至少一半的系统总线带宽。 主要特性:

  1. 传输数据长度可编程配置,最大到 65536;

  2. 12 个通道,并且每个通道都可配置(DMA0 有 7 个通道,DMA1 有 5 个通道);

  3. AHB 和 APB 外设,片上闪存和 SRAM 都可以作为访问的源端和目的端;

  4. 每个通道连接固定的硬件 DMA 请求;

  5. 支持软件优先级(低、中、高、极高)和硬件优先级(通道号越低,优先级越高);

  6. 存储器和外设的数据传输宽度可配置:字节,半字,字;

  7. 存储器和外设的数据传输支持固定寻址和增量式寻址;

  8. 支持循环传输模式;

  9. 支持外设到存储器,存储器到外设,存储器到存储器的数据传输;

  10. 每个通道有 3 种类型的事件标志和独立的中断;

  11. 支持中断的使能和清除。 

在这里插入图片描述
  1.  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循环接收

修改代码。


修改为


结果如下。 

在这里插入图片描述


GD32F303固件库开发(9)----USART通过DMA收发的评论 (共 条)

分享到微博请遵守国家法律