OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 19794|回复: 34

DMA 无法启动, 我修改了DMA 配置函数 MYDMA_Config

[复制链接]

1

主题

4

帖子

0

精华

限制会员

积分
-108
金钱
-108
注册时间
2011-4-13
在线时间
4 小时
发表于 2011-4-13 09:25:21 | 显示全部楼层 |阅读模式
我在做 USART DMA 实验中无法发送数据, 而设置断点后步进就可发送数据, 最终确定为 开启DMA1时钟后需等待其稳定


void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx, u32 cpar, u32 cmar, u16 cndtr)
{
    RCC->AHBENR|=1<<0;          //开启DMA1时钟
    __nop();                    //等待 DMA1 时钟稳定
    __nop();                    //经测试最少 2 个 nop
    __nop();
    DMA_CHx->CPAR=(u32)cpar;    //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;        //存储器数据宽度16位
    DMA_CHx->CCR|=1<<12;        //中等优先级
    DMA_CHx->CCR|=0<<14;        //非存储器到存储器模式
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-4-13 09:46:38 | 显示全部楼层
回复【楼主位】wtj7603:
-------------------------------
这问题我还真没遇到过哦.
比较奇特,以后遇到了可以参考下你的了,^_^...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

限制会员

积分
-108
金钱
-108
注册时间
2011-4-13
在线时间
4 小时
 楼主| 发表于 2011-4-13 09:57:59 | 显示全部楼层
怎么会没遇到呐!  以下为原程序:

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;    //此处就相当于一个 nop, 而一个 nop 是不够的

DMA_CHx->CPAR=DR_Base;   //DMA1 外设地址, 
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-4-13 10:12:24 | 显示全部楼层
回复【3楼】wtj7603:
-------------------------------
哦,原来如此!
多谢指点!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2011-4-18
在线时间
4 小时
发表于 2011-4-18 21:30:00 | 显示全部楼层
怎么液晶屏上显示的完成的百分比跟串口接收的不一样呢。都100%了,串口接收还要接收很长时间。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-4-19 01:06:03 | 显示全部楼层
回复【5楼】sdtswhb:
-------------------------------
我的串口调试助手会有延时的.你用别的,可能就不存在这个问题了.你看RX,那个计数器,还在增加没有,就可以知道还在发送没有的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2011-4-28
在线时间
0 小时
发表于 2011-5-10 16:44:20 | 显示全部楼层
回复【2楼】正点原子:
-------------------------------
原子哥,LZ的方法的确有效,我用你的板子和程序,调DMA,死活不出结果。按下KEY0,板子显示0%,LED灯不闪,调试助手只打印出一行DMA DATA:搞了两天都是这样,郁闷死了,问了其他同学都说程序没错,今天无意中看到LZ的帖子,我在程序里加上
__nop();                    //等待 DMA1 时钟稳定
__nop();                    //经测试最少 2 个 nop
_nop();
下载,运行,竟神奇的好了,液晶显示,和串口打印都正确了!11!!
建议,在置顶帖里说明一下,不然,很多人都要走弯路了
沧海横流方显英雄本色
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-5-10 17:16:05 | 显示全部楼层
回复【7楼】sun_sun_sun:
-------------------------------
是的,这个确实值得说明一下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2011-5-13
在线时间
0 小时
发表于 2011-5-13 20:54:16 | 显示全部楼层
我遇到同样的情况,采用楼主的方法,问题解决。
桥流水不流
回复 支持 反对

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2011-5-10
在线时间
0 小时
发表于 2011-5-13 22:52:24 | 显示全部楼层
回复【楼主位】wtj7603:
-------------------------------
请问你的这个实验改后能成功吗?我用原子大哥的实验也能打印数据,但是数据不会换行,而且出现乱码和数据不全,刚才原子大哥说我的串口调试助手有问题,可是我找了另外一个,还是不行,不知道问什么
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-5-14 01:28:40 | 显示全部楼层
回复【10楼】lip0201:
-------------------------------
1,用我的串口调试助手,肯定不会有问题.
2,如果我的不行(系统不兼容),请在本论坛搜索串口调试助手,可以下载丁丁版本的试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2011-9-26
在线时间
0 小时
发表于 2011-9-26 10:14:04 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
这个程序昨天倒腾了一宿,终于发现了问题所在,本想发帖说明下,没想早有高人指出来了,呵呵。

另外,原子的串口调试软件确实存在问题,至少RX数目不对。第一次KEY0时,RX是5211个,计数器清零后,再次KEY0就不确定了。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-9-26 10:58:28 | 显示全部楼层
回复【12楼】hare8888:
---------------------------------
用sscom
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2117
金钱
2117
注册时间
2011-9-3
在线时间
122 小时
发表于 2011-9-26 21:18:18 | 显示全部楼层
搞了两天DMA 串口传输数据,居然出现跟大家一样的情况,也是不成功,无奈昨天问过原子大哥,代码基本一样,他说也不知道原因,万般无奈下上论坛来找看有没有人遇到相同问题,果真被我找到了,试了LZ的方法,完全可行。其实原子大哥应该知道原因的:因为程序上为

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;    //此处就相当于一个 nop, 而一个 nop 是不够的 

DMA_CHx->CPAR=DR_Base;   //DMA1 外设地址,  
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址 


明明这里写“缓冲用,不知道为什么,非要不可” ,其实就是延迟待DMA稳定,说明原子大哥是知道的,除非代码是别人写的。如六楼所说,置顶,免得让更多人走弯路。
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2117
金钱
2117
注册时间
2011-9-3
在线时间
122 小时
发表于 2011-9-26 21:42:53 | 显示全部楼层
另外,我也碰到11楼的情况,用原子哥的串口调试助手,发送数目是不正确的,有5200,5732等等,每次基本不一样,用丁丁的串口是正确的。专门做过发送和接收数目的匹配,再次确定丁丁版本是OK的。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-9-26 22:20:35 | 显示全部楼层
回复【14楼】螃蟹爱虫:
---------------------------------
这个原因,也是我看了楼主的提示才想明白的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2117
金钱
2117
注册时间
2011-9-3
在线时间
122 小时
发表于 2011-9-26 22:28:47 | 显示全部楼层
原子哥应该把此贴放在置顶位置,以免更多人走弯路。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-9-26 22:51:33 | 显示全部楼层
精华帖!
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2011-8-20
在线时间
24 小时
发表于 2011-10-7 00:18:00 | 显示全部楼层
我也是看到这个帖子解决问题的,希望原子大哥在新版光盘资料里面更正这个问题。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2011-10-14
在线时间
0 小时
发表于 2011-10-17 11:09:25 | 显示全部楼层
我也有lz的问题,不过看过之后解决了,好贴
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2011-10-18
在线时间
2 小时
发表于 2011-10-18 17:48:26 | 显示全部楼层
今天也遇到了,确实是DMA时钟的问题,谢谢
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-10-18 20:20:26 | 显示全部楼层
置顶加精吧,我明天也试试。又一个深藏不露的BUG曝光了。。
世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-10-18 23:37:08 | 显示全部楼层
回复【22楼】sixear:
---------------------------------
早已加精华。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2011-9-23
在线时间
0 小时
发表于 2011-10-28 20:44:58 | 显示全部楼层
回复【楼主位】wtj7603:
---------------------------------
感谢楼主,调了n久都不对,一看明了
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2011-11-3 09:57:55 | 显示全部楼层
话说神奇哦~~~
这个DMA是一个蛋疼的东西
我根据原子哥的程序,自写了一下,原子哥的程序是把内部flash里数组的值赋值到RAM中数组:
原子哥是这样定义数组的:
u8 SendBuff[5200];
const u8 TEXT_TO_SEND[]={"ALIENTEK MiniSTM32 DMA 串口实验"};  
他在程序中这样赋值:
for(i=0;i<5200;i++)//填充ASCII字符集数据
    {
if(t>=j)//加入换行符
{
if(mask)
{
SendBuff=0x0a;
t=0;
}else 
{
SendBuff=0x0d;
mask++;
}
}else//复制TEXT_TO_SEND语句
{
mask=0;
SendBuff=TEXT_TO_SEND[t];
t++;
}       
    }  
运行没错误,我仿照原子哥自写了一下,也是从flash里读取数组数据,然后放到ram中准备发送:
我是这样定义的:
const u8 shit[]={"我的妈啊~~~~"};
u8 send[5200];
然后是这样赋值的:
while(1)
{
while(i<5200)
{
send=shit[t];
i++;
t++;
if(t==12)
{
t=0;
send=0x0a;
}
}
后来,程序运行后死在启动文件里的一行B       .上,不知道为什么,但取消掉数组定义的const,程序正常了,但又出现新的问题,串口接收正常,换行不正常,还有oled一直显示100%,串口一直还在接收。
万思不得其解啊~~~
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-11-3 10:30:55 | 显示全部楼层
可能是堆栈溢出吧.
是不是局部变量设置太大了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2011-11-3 12:09:43 | 显示全部楼层
回复【26楼】正点原子:
---------------------------------
问题已经解决,在处理显示剩余量的问题。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2011-11-3 12:11:39 | 显示全部楼层
回复【楼主位】wtj7603:
---------------------------------
此nop函数放在哪个头文件里???
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2011-10-17
在线时间
0 小时
发表于 2011-11-8 12:18:17 | 显示全部楼层
   DMA,精华!!!
回复 支持 反对

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2011-8-23
在线时间
0 小时
发表于 2011-12-4 20:15:18 | 显示全部楼层
困扰了两三天的程序终于找到答案了,楼主给力啊,谢谢!!
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-3-21
在线时间
3 小时
发表于 2012-5-22 08:42:47 | 显示全部楼层
 额,我也掉进这个坑了。。。
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-23
在线时间
0 小时
发表于 2012-5-23 18:42:46 | 显示全部楼层
_nop();在51里可以直接用,在STM里说没有定义,找不到它的头文件啊。
回复 支持 反对

使用道具 举报

10

主题

64

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3105
金钱
3105
注册时间
2012-3-12
在线时间
261 小时
发表于 2012-6-5 17:18:13 | 显示全部楼层
谢谢LZ,我用原子哥函数版的可以实现,寄存器就跟LZ一样了。LZ的DEBUG跟强悍啊
回复 支持 反对

使用道具 举报

11

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2012-10-26
在线时间
0 小时
发表于 2012-10-26 10:58:18 | 显示全部楼层
 这个DMA 问题把我跟同学都难住了,程序怎么看都没错,原来是少了延时。。。。。谢谢楼主啊 。。。。
回复 支持 反对

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2020-10-24 16:51:17 | 显示全部楼层
学习了,以后少走弯路
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 20:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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