STM32 DMA发送(USART2)

1、由于串口发送的数据比较多,占用cpu的资源,所以打算将串口2发送的数据全部的用DMA发送

2、首先的是配置DMA代码如下:

void USART2_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;   
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //开启DMA适中
DMA_InitStructure.DMA_PeripheralBaseAddr = USART2_DR_Base;  //设置DMA源(由于我是用的串口2所以此处是串口2的地址)地址算法 0x40004400 + 0x04 = 0x40004404

                                                                                                                            0x40004400此地址为串口2的首地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;          //内存地址(将要传输的数据放到此数组里)名字可以自己设
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;              //方向,从内存到外设
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;                 //传输的大小(传输的数据多大)
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址不增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            //内存地址自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设的数据单位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;     //内存数据单位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;                                //此时是单次循环,也可以设置不停地循环                            
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;                            //优先级:中
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                     //:禁止内存到地址的传输
DMA_Init(DMA1_Channel7, &DMA_InitStructure);                                           //配置DMA1的7的通道
// DMA_Cmd (DMA1_Channel7,ENABLE);                                                        //此时不需要使能,单次发送的话需要使能
//DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);                              //此DMA没有用到中断
}

如果想要多次都能发送需要设置

        memcpy(SendBuff,"23345", 5);  
    USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);
DMA_Cmd (DMA1_Channel7,DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel7,5);//为当前(上边的发送的字节)5
DMA_Cmd (DMA1_Channel7,ENABLE);

这样的话就能多次的发送了,不会出现发送一次就不能发送的情况

DMA配置的函数开始我使能了 DMA_Cmd (DMA1_Channel7,ENABLE);   之后发现每次发送的第一个数据都会丢失,如果想不丢失就得把此处去掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForNi福尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值