说明:
上一期我们学习了DMA的基础知识,这一期我们来完成串口DMA接收的实验。首先,我们需要先配置DMA初始化,编写DMA中断服务函数,然后在主函数进行数据处理,查看现象,最终完成串口DMA接收的实验。配置串口DMA接收有几个步骤:开启时钟、配置参数结构体,使能通道外设、使能DMA中断、使能外设DMA(串口)和编写DMA中断服务函数。
文章目录
提示:以下部分参考于梁山派开发板学习指南,代码如有更有解可在评论区一起沟通交流哈。
一、串口DMA接收配置
1、开启时钟
首先,我们需要配置的是串口0的接收功能,对此我们应该去用户手册查找对应的DMA通道,这里我们将使用通道2来进行配置:
注:RCU_DMA1 到gd32f4xx_rcu.h库函数里找到:
2、配置参数结构体
DMA 传输有单一传输和增量突发传输两种,单一传输一次可以传输
8
位、
16
位
和
32
位,增量突发传输可配置为
4
个节拍、
8
个节拍和
16
个节拍进行传输,每次传输量是单一传输的 4
倍,
8
倍和
16
倍。这里以单一传输进行配置:
注:
direction
:
DMA
通道数据传输方向
memory0_addr
:存储器基地址
memory_inc
:存储器地址生成算法模式
number
:
DMA
通道数据传输数量
periph_addr
:外设基地址
periph_inc
:外设地址生成算法模式
periph_memory_width
:外设和存储器数据传输宽度
priority
:
DMA
通道传输软件优先级
circular_mode
:
DMA
循环模式
3、使能通道外设
void dma_channel_subperipheral_select(uint32_t dma_periph, dma_channel_enum channelx, dma_subperipheral_enum sub_periph);
这个函数是 DMA
通道外设选择。有三个参数,第一个参数就是要使用的
DMA
,第二个参数就是要使用的通道,第三个参数就是要开启的通道外设:
首先,我们要看USART0_RX所在的DMA通道,得知我们需要打开4:
使能通道外设:
使能DMA通道:
4、使能DMA中断
void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source);
这个函数是使能
DMA
中断。有三个参数,第一个参数是要使用的
DMA
外设,第二个参数是要
使用的
DMA
通道,第三个参数是要使能的中断资源;
关于第三个参数:
DMA_CHXCTL_SDEIE
:通道单数据传输模式异常中断
DMA_CHXCTL_TAEIE
:通道发生传输错误中断
DMA_CHXCTL_HTFIE
:通道半传输完成中断
DMA_CHXCTL_FTFIE
:通道传输完成中断
这里的第三个参数我们选择DMA_CHXCTL_FTFIE:
5、使能外设DMA(串口)
void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd);
这个函数是串口 DMA
接收配置。有两个参数,第一个参数是要配置的串口外设,第二个参数是要使能还是失能。
二、DMA中断服务函数
注:
FlagStatus dma_interrupt_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt);
这个函数是 DMA
中断标志位获取。有三个参数,第一个参数就是
DMA
外设,第二个参数就是DMA通道,第三个要获取的中断标志位。
三、串口DMA接收数据处理
四、现象
总结
通过本期实验,我们学习了DMA,从学习DMA的基础知识开始,再到配置DMA初始化,接着是数据接收配置,熟悉了DMA的运作原理及配置流程。