在原子哥的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位。
我分析的对吗?
|