OpenEdv-开源电子网

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

关于DMA实验的外设数据宽度

[复制链接]

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-10-6 20:05:35 | 显示全部楼层 |阅读模式
5金钱
      在原子哥的DMA实验中,定义的外设数据宽度为8位,我觉得是错误的,这是原程序:
[mw_shl_code=c,true] DMA_DeInit(DMA_CHx); //将DMA的通道1寄存器重设为缺省值 DMA1_MEM_LEN=cndtr; DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMA外设ADC基地址 DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMA内存基地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向,从内存读取发送到外设 DMA_InitStructure.DMA_BufferSize = cndtr; //DMA通道的DMA缓存的大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输 DMA_Init(DMA_CHx, &DMA_InitStructure); [/mw_shl_code]
我觉得应该是设置成32位。
USART的寄存器描述中有说到


访问方式为16位或者32位。而要访问的USRAT数据寄存器为32位,虽然只有低八位有效:


而官方中在DMA的描述中有这样一段话:


注意最后的例子,因为BKP备份数据寄存器的有效位数为16位,为节省RAM,存储器数据宽度应设置为16位;而它的寄存器却为32位,高16位保留而已,于是这个例子将外设目标数据宽度设置为32位.
从另一个角度看,STM32的寄存器地址是字对齐(4字节)的,串口DMA实验中外设地址没有使能地址自动增加,设置为8位宽度没有出现错误;假设其它应用中使能地址自动增加的话,到下一个地址时由于是8位数据宽度指针只加了1,这是个错误的地址,应当加4才能指向下一个外设寄存器,于是宽度应设置成32位。
      我分析的对吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-6 23:31:53 | 显示全部楼层
没有研究你这么深入,呵呵。
不过一直用8位操作,没发现过问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
 楼主| 发表于 2014-10-6 23:46:45 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
心血来潮,突然就这么钻进去了。。。。。。。
非增量模式,8/16/32位模式都不会出错的。
在8位的情况下把外设地址改成增量模式的话,应该会出错。如果STM32 寄存器奇数地址是不能访问的话,DMA应该会进入错误中断。
现在在宿舍了,还没验证。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-6 23:56:07 | 显示全部楼层
回复【3楼】STM32VBT6:
---------------------------------
外设地址怎么会是增量模式???我真没想到这种应用场景。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
 楼主| 发表于 2014-10-7 00:15:02 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
前面提到的BKP备份寄存器就可以设置成增量模式吧,许多都是4字节对齐的连续地址。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-7 00:41:10 | 显示全部楼层
回复【5楼】STM32VBT6:
---------------------------------
额,这个没想到用,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 15:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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