STM32F407学习DAY.14:使用DMA模式进行USART串口数据收发(以正点原子例程为例)
目录
一、DMA配置
1、DMA1和DMA2的请求映射
2、DMA挂载总线
3、DMA相关库函数
4、DMA配置过程(以串口1为例)
1)进行时钟使能
2)等待DMA可配置
3)初始化DMA(串口1的TX为DMA2 数据流7 通道4,RX为DMA2 数据流5 通道4)
a.DMA外设地址par:
b.DMA存储器0地址mar:
c.数据传输量ndtr:
4)开启DMA数据传输(初始化函数后写)
二、USART串口配置
0、串口相关库函数
1、串口发送与接收函数初始化思路
2、senddata和receivedata库函数(一般在主函数中调用)
1)USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
2)uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
3、接收函数的两种方法(查询方法、中断方法)
1)查询方法
2)中断方法
三、在DMA模式下实现USART串口数据收发
1、初始化各配各的
2、在主函数中调用各自的初始化
3、在需要串口传输数据的时候使能USART_DMACmd并开启DMA传输
4、判断DMA传输是否完成(使用DMA状态标志位TCIF)
5、DMA传输完成后清除传输完成标志
一、DMA配置
1、DMA1和DMA2的请求映射
2、DMA挂载总线
可以看出DMA均挂载在AHB1总线上
3、DMA相关库函数
4、DMA配置过程(以串口1为例)
1)进行时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
2)等待DMA可配置
while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//等待DMA可配置
3)初始化DMA(串口1的TX为DMA2 数据流7 通道4,RX为DMA2 数据流5 通道4)
重点关注参数:
a.DMA外设地址par:
此处外设为串口1,∴将串口1的地址写进去即可:
par=(u32)&USART1->DR
地址是STM32规定的串口1的地址,应为0x40011000
b.DMA存储器0地址mar:
在主函数中定义一个发送数据缓冲区SendBuff[SEND_BUF_SIZE]
此数据缓冲区的地址即为存储器0地址,利用强制类型转换写出其地址为:
mar=(u32)SendBuff
c.数据传输量ndtr:
为主函数中定义的大小为8200的SEND_BUF_SIZE,即
ndtr=SEND_BUF_SIZE
∴在主函数中调用DMA初始化函数时,可写作:
MYDMA_Config(DMA2_Stream7,DMA_Channel_4,(u32)&USART1->DR,(u32)SendBuff,SEND_BUF_SIZE);
4)开启DMA数据传输(初始化函数后写)
思路:关闭DMA传输→查询DMA通道状态是否为使能(即确认DMA是否可以被设置)→设置DMA传输数据量→开启DMA传输
二、USART串口配置
0、串口相关库函数
1、串口发送与接收函数初始化思路
1)只需要发送的功能,直接在初始化中开启串口发送使能即可;
2)若需要发送和接收,需要在开启串口前写中断,即加上ITConfig和NVIC的部分,写中断服务函数。
2、senddata和receivedata库函数(一般在主函数中调用)
1)USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
写DR寄存器
过程:数据写入TDR寄存器,再通过TDR传送给发送移位寄存器,将数据按位移出到TX引脚,完成串口数据的发送
2)uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
读DR寄存器
3、接收函数的两种方法(查询方法、中断方法)
1)查询方法
初始化串口的过程与串口发送一致,即不需要进行中断的设置
查询RXNE标志位是否置1,置1表示已准备好接收数据,可以进行数据接收(写USART_ReceiveData)
2)中断方法
在usart.c文件的usart_init中加上串口中断的初始化结构体,由
可知 ,当RXNE标志位为1时,自动开启串口中断
再在usart.c中写usart串口中断服务函数:void USART1_IRQHandler(void)
三、在DMA模式下实现USART串口数据收发
1、初始化各配各的
即按照单独串口和单独dma进行两个.c文件的初始化配置