STM32的usart的DMA方式发送 一个数 ,程序怎么写?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32的usart的DMA方式发送 一个数 ,程序怎么写?相关的知识,希望对你有一定的参考价值。

自己按照原子的历程用 库函数配置的,一直发送不成功,不知道什么原因。求程序 或者可能出错的原因,有程序最好。

我是用的原子的寄存器版的,

串口部分初始化部分加入这个
USART1->CR3=1<<7; //使能串口1的DMA发送
这是初始化
MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)TData,32);//DMA1通道4,外设为串口1,存储器为SendBuff,长度32.
下面是DMA.C文件里的配置

u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHx:DMA通道CHx
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输量
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)

u32 DR_Base; //做缓冲用,不知道为什么.非要不可
RCC->AHBENR|=1<<0;//开启DMA1时钟
DR_Base=cpar;
DMA_CHx->CPAR=DR_Base; //DMA1 外设地址
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址
DMA1_MEM_LEN=cndtr; //保存DMA传输数据量
DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量
DMA_CHx->CCR=0X00000000;//复位
DMA_CHx->CCR|=1<<1; //TCIE:允许传输完成中断
DMA_CHx->CCR|=1<<4; //从存储器读
DMA_CHx->CCR|=0<<5; //普通模式
DMA_CHx->CCR|=0<<6; //外设地址非增量模式
DMA_CHx->CCR|=1<<7; //存储器增量模式
DMA_CHx->CCR|=0<<8; //外设数据宽度为8位
DMA_CHx->CCR|=0<<10; //存储器数据宽度8位
DMA_CHx->CCR|=1<<12; //中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
MY_NVIC_Init(2,1,DMA1_Channel4_IRQChannel,3); //抢占优先级3,响应优先级0,组3


//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)

DMA_CHx->CCR&=~(1<<0); //关闭DMA传输
DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,传输数据量
DMA_CHx->CCR|=1<<0; //开启DMA传输


void DMAChannel4_IRQHandler(void)

if (DMA1->ISR & (1<<13))
DMA1->IFCR|=1<<13;//清除通道4传输完成标志




然后每次使用调用一次这个
MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输
就可以了追问

额,我的问题已经解决过了,不过有新问题了,就是把从DMA接收到的数再发送给串口助手这里,发送到串口助手的数总是一个数(04)和DMA接收到的数不一样,不知道你有什么建议?

追答

不知道你是不是取地址时取错了。。

追问

额,应该怎么取地址啊?

追答

额。。谢谢

参考技术A 自己配置?那就是有地方配置错了 参考技术B 写出你的配置过程

STM32串口遇到的一个问题

做HLW8032电能表项目中关于USART使用DMA接收定长数据的问题
1:由于HLW8032芯片一上电,芯片就会通过串口每隔50ms向STM32发送24字节的数据,且我不能通过STM32控制HLW8032发送数据,由于STM32初始化需要一段时间,所以当STM32接收数据时会出现丢包的情况。。
2:解决方法:使用USART空闲中断,在初始化时先不使能串口DMA,只打开串口,在STM32串口空闲时,跳入串口空闲中断,
先判断数据是否正确,是否接收到24个字节的数据,如果数据校验错误,将缓冲区清零,如果数据正确,关掉串口空闲中断,最后使能串口DMA和DMA。
//串口1中断
//做数据发送结束判断
void USART1_IRQHandler()
{
    uint32_t clear=0;
    uint8_t i=0;
    if(USART_GetITStatus(DEBUG_USARTx,USART_IT_IDLE)!=RESET)
    {
            //判断数据是否正确
            if(DMA_GetCurrDataCounter(DMA1_Channel5)!=24||Check_True_Data()==0)
            {
                 //数组清零
                 for(i=0;i<24;i++)
                 {
                    DMA_Recive_Data[i]=0;
                 }
            }
            else if(DMA_GetCurrDataCounter(DMA1_Channel5)==24&&Check_True_Data()==1)
            {
                //关闭串口空闲中断
                USART_ITConfig(USART1,USART_IT_IDLE, DISABLE);
            }
    }
            //注意:只有读取寄存器DR SR才能清楚空闲中断标志位
            clear=USART1->DR;
            clear=USART1->SR;
            //使能DMA1,通道5
            DMA_Cmd(DMA1_Channel5,ENABLE);
           //使能串口DMA
           USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
}

 


 

以上是关于STM32的usart的DMA方式发送 一个数 ,程序怎么写?的主要内容,如果未能解决你的问题,请参考以下文章

STM32F429 定时器触发 USART DMA 传输问题

STM32为啥不能实现485和DMA的数据收发?

STM32串口发送中断

STM32中串口DMA实验里,为啥选择通道4(选择串口的发送端,而不是接收端)?

STM32串口遇到的一个问题

STM32F0xx_DMA收发USART数据配置详细过程