STM32
直播中

王璐

7年用户 185经验值
私信 关注
[问答]

为什么ALIENTEK MINISTM32实验15 DMA实验中程序一直停在这个循环里?

我想问一下,在ALIENTEK MINISTM32 实验15 DMA实验中,程序为什么都一直停在这个循环里面
while(1)
      {
    if(DMA1->ISR&(1<<13))//等待通道4传输完成
    {
     DMA1->IFCR|=1<<13;//清除通道4传输完成标志
     break;
          }
    pro=DMA1_Channel4->CNDTR;//得到当前还剩余多少个数据
    pro=1-pro/5200;//得到百分比   
    pro*=100;      //扩大100倍
    LCD_ShowNum(60,170,pro,3,16);
    LCD_ShowNum(60,190,jishu,4,16);
    jishu++;  //这里是自己加的
      }      
DMA1->ISR&(1<<13)好像都不会传输完成?

回帖(7)

赵晶晶

2019-7-31 07:43:12
论坛搜索下.应该是因为DMA初始化的时候,有个延时没加的缘故.
老版本的代码存在这个问题的.
你可以贴你的DMA初始化代码出来看下.
举报

王彬

2019-7-31 07:57:44
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<<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; //非存储器到存储器模式  
举报

田晴

2019-7-31 08:06:27
我在每句话后面都加了一个10MS的延时程序就可以了,能说一下没加延时导致什么错误码?
有新版本的程序下载吗?
举报

孙原元

2019-7-31 08:21:16
只需要在这里:
RCC->AHBENR|=1<<0;//开启DMA1时钟 
delay_ms(10); 
DMA_CHx->CPAR=cpar;   //DMA1 外设地址  
加入延时即可。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分