发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
[问答] 求解答DMA->CRR的设置系列问题!
174 DMA 存储器 Flash
分享
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; //非存储器到存储器模式

问题:(1)首先看红色部分的,假如是从外设读的话, 那是不是应该设置成 存储器地址非增量模式 和 外设地址增量模式 ?
         (2)再看绿色部分,这里没有设置成循环模式  只是普通模式,那什么情况下才可以设置成循环模式呢?
         (3)看看蓝色部分,这里两个为什么都要设置成8位呢???    16位  、32位和保留  分别是在什么情况下才可以设置呢???
          (4) 最后看看粗体的那一部分,这里这样设置的原因是不是从flash到 ram?   "alientek MiniSTM32 DMA 串口实验"  这句话的内容是不是就存储在flash里,那ram是在哪里体现的??
  纯属菜鸟问题,不吝赐教,感激不尽!!!
0
2019-9-23 20:06:42   评论 分享淘帖 邀请回答

相关问题

15个回答
1,错.相反.
2,需要循环读数的时候.
3,因为外设数据宽度为8位,其他类同.
4,不是.flash也是存储器.
2019-9-24 06:11:04 评论

举报

(1)你是说 假如是从外设读的话,应该设置成 存储器地址增量模式 和 外设地址非增量模式吗 ?  这样的话那不是和从存储器读设置的一样吗???
(2)(3)明白了
(4)还是不明白为什么要这样设置,设置非存储器到存储器模式 有什么意义,不这样设置又会怎么样呢?
2019-9-24 06:16:32 评论

举报

原子哥,刚刚我试了下  这样改 DMA_CHx->CCR|=1<<14  结果串口输出的结果却是这样的:DMA DATA:K,求原子哥解释!!!
2019-9-24 06:28:12 评论

举报

1,是可以一样啊.
4,告诉DMA操作对象而已吧.
不知道你的代码是做什么用,所以,无法帮你.
2019-9-24 06:46:26 评论

举报

这段代码就是出自你的DMA例程呀!
2019-9-24 06:56:44 评论

举报

哦,你找到<<STM32参考手册>>看看CCR寄存器的第十四位描述吧.
2019-9-24 07:11:45 评论

举报

原子哥,,这个AMD怎样设置为串口接受啊???要设置那几位啊?????求救啊
2019-9-24 07:20:50 评论

举报

看STM32参考手册,看寄存器描述,然后就知道怎么做了。
2019-9-24 07:33:28 评论

举报

我就是看手册,然后修改过了,可是就是接受出现问题。。哎,,,经验不足啊
2019-9-24 07:41:04 评论

举报

是不是无论接受还是发送都是这句啊?
void MYDMA_SEnable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_CHx->CCR&=~(1<<0);       //关闭DMA传输 
DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,传输数据量 
DMA_CHx->CCR|=1<<0;          //开启DMA传输
}
2019-9-24 07:48:12 评论

举报

是的.
这个是软件开启一次.
如果设置了其他方式触发,则开启之后,由其他方式触发,触发结束后重新设置.
2019-9-24 07:59:58 评论

举报

原子哥,,再问你一下。。可能比较弱的问题。。我用DMA接收以串口作为外设的数据,,是不是当缓冲区满了,就一次性读取这些数据到我的寄存器啊?当我用串口调试助手的时候,要发送足够的数据,才会被读取到寄存器吗?
2019-9-24 08:17:16 评论

举报

不是.
USART->DMA->内存.
每接收一个字符,都会被搬运到内存,你只要读出DMA搬运了多少数据,再去内存取就可以了,并不需要一次发送特定数目的字符.
2019-9-24 08:27:34 评论

举报

void MYDMA_SConfig(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)//DMA1通道4,外设为串口1,存储器为recbuff,长度20
{
u32 DR_Base;  //做缓冲用,不知道为什么.非要不可
RCC->AHBENR|=1<<0;//开启DMA1时钟
DR_Base=cpar;//串口1
DMA_CHx->CPAR=DR_Base;  //DMA1 外设地址  上一句就 已经把串口的地址赋给了Base变量
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址  buff
DMA1_MEM_LEN=cndtr;      //保存DMA传输数据量   这一句就是数据的长度
DMA_CHx->CNDTR=cndtr;    //DMA1,传输数据量
DMA_CHx->CCR=0X00000000;//复位
DMA_CHx->CCR|=0<<4;  //从外设读
DMA_CHx->CCR|=0<<5;  //普通模式
DMA_CHx->CCR|=1<<6;  //外设地址增量模式
DMA_CHx->CCR|=0<<7;  //不执行存储器增量模式
DMA_CHx->CCR|=0<<8;  //外设数据宽度为8位
DMA_CHx->CCR|=0<<10; //存储器数据宽度8位
DMA_CHx->CCR|=1<<12; //中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式  
}
原子哥,我是想通过串口接受的,你看看这个初始化有没有错、、、、
2019-9-24 08:41:49 评论

举报

原子哥,,我已经实现了串口的DMA接受了。。谢谢指导
2019-9-24 08:58:01 评论

举报

只有小组成员才能发言,加入小组>>

32个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表