打印

STM32 DMA出现怪现象?

[复制链接]
3999|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenfengmcu|  楼主 | 2011-11-11 15:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//DMA时钟使能
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
DMA_DeInit(DMA2_Stream0);
//检测是否打开
while (DMA_GetCmdStatus(DMA2_Stream0) != DISABLE);
//配置DMA流
DMA_InitStructure.DMA_Channel = DMA_Channel_0;   
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DispBuf;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)0x68010000;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
DMA_InitStructure.DMA_BufferSize = (uint32_t)48000;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;         
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
//使能传输完成是产生中断
           DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
//使能DMA
DMA_Cmd(DMA2_Stream0, ENABLE);
//使能DMA流IRQ通道
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
沙发
chenfengmcu|  楼主 | 2011-11-11 15:24 | 只看该作者
图片

s.jpg (44.01 KB )

s.jpg

d.jpg (36.7 KB )

d.jpg

使用特权

评论回复
板凳
chenfengmcu|  楼主 | 2011-11-11 15:28 | 只看该作者
STM32F207  在FSMC 的SRAM 用显存,用DMA 的m2m 发送到FSMC LCD 出现上面情况。好像内容被放大了4倍,并出在B 单色灰度,HX8352 的显示芯片

使用特权

评论回复
地板
香水城| | 2011-11-11 16:28 | 只看该作者
没看出来哪里不妥,LZ没说正确的是什么样?

从配置上看:
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
为什么DMA的目标和源的宽度不一致?

使用特权

评论回复
5
chenfengmcu|  楼主 | 2011-11-11 16:33 | 只看该作者
谢谢香水城回复:
其实程序是都是用的Halfword; 搞不出来才试试byte. 做好了应该是最上面的那个样子,非常奇怪好像放大了一样。不用DMA什么都正常,用的就成下面那个样子。

使用特权

评论回复
6
chenfengmcu|  楼主 | 2011-11-11 16:37 | 只看该作者
第一个图是未采用DMA方式,第二个是采用DMA方式,但有问题

使用特权

评论回复
7
香水城| | 2011-11-11 16:39 | 只看该作者
1)先少传送点数据看看什么效果
2)上电路图看看
3)检查一下SRAM和LCD的时序对不对,最好用示波器看。

使用特权

评论回复
8
chenfengmcu|  楼主 | 2011-11-11 16:40 | 只看该作者
对比看上面错位,到达LCD 数据好像部分丢失。

使用特权

评论回复
9
chenfengmcu|  楼主 | 2011-11-11 16:47 | 只看该作者
如果是时序不对的话,不采用DAM好像也要出错,实际上不采用DMA是正常的。香主还有没有其它可能,非常感谢

使用特权

评论回复
10
香水城| | 2011-11-11 16:50 | 只看该作者
如果是时序不对的话,不采用DAM好像也要出错,实际上不采用DMA是正常的。香主还有没有其它可能,非常感谢
chenfengmcu 发表于 2011-11-11 16:47


我前面提了3点,你不能只管最后1点呢,:$

使用特权

评论回复
11
chenfengmcu|  楼主 | 2011-11-11 16:59 | 只看该作者
少传一点我试过,显示只有一部,并修改显存中的内容也会相应的变化,只是单色灰度的并错位。

使用特权

评论回复
12
chenfengmcu|  楼主 | 2011-11-11 17:00 | 只看该作者
电路图

Protel Schematic.pdf

24.58 KB

使用特权

评论回复
13
香水城| | 2011-11-11 17:23 | 只看该作者
12楼的PDF打不开,请直接贴图片。

使用特权

评论回复
14
香水城| | 2011-11-11 17:25 | 只看该作者
如果是时序不对的话,不采用DAM好像也要出错,实际上不采用DMA是正常的。香主还有没有其它可能,非常感谢
chenfengmcu 发表于 2011-11-11 16:47


采用DMA与不用DMA的区别是2次传送之间的时间缩短了,尤其你还用了FIFO和Burst模式,你需要研究一下你的LCD对2次传送之间的时间是否有要求。

使用特权

评论回复
15
无冕之王| | 2011-11-11 17:41 | 只看该作者
把电路图直接贴出来看看

使用特权

评论回复
16
nongfuxu| | 2011-11-11 18:50 | 只看该作者
STM32F207  在FSMC 的SRAM 用显存,用DMA 的m2m 发送到FSMC LCD 出现上面情况。好像内容被放大了4倍,并出在B 单色灰度,HX8352 的显示芯片

请教:若正常正确情况下,STM32F207能直接驱动TFT显示屏吗?

使用特权

评论回复
17
chenfengmcu|  楼主 | 2011-11-11 20:40 | 只看该作者
电路图明天再传。。。现在的主频是120M,用示波器看过数据量大了很多。下一步降频并仔细对比信号。

使用特权

评论回复
18
zhang@long| | 2011-11-12 08:41 | 只看该作者
学习中!

使用特权

评论回复
19
chenfengmcu|  楼主 | 2011-11-12 09:13 | 只看该作者
问题基本找到,通过非DMA方式模拟,将数据源也就是SRAM显存指针设为8位(应该是16位)发送到LCD,就出现这个情况了,也就是说在用DMA方式时源数据按8位方式进行传输了。IS61LV25616   A0-A17 接 STM32 A0-A17 这个接法在16位传输时要不要地址移位按16位地址对齐。

使用特权

评论回复
20
chenfengmcu|  楼主 | 2011-11-12 14:12 | 只看该作者
总算找到了
原来是:
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
现在是:
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

25

帖子

1

粉丝