现在我的目的是在SRAM中给TFT做一个二级缓存,这样可以提高TFT的局部刷新速度,并且目前这样的效果实现了还很不错。
不过仍然有两个疑问没有解决,先给大家说说我的实现步骤:
1、总体步骤
stm32f4----(通过FSMC)-------->更新SRAM中缓存内容----------(通过DMA)--------->刷新TFT屏
2、程序准备
要将SRAM想像成一个TFT,根据地址偏移算出对应的X,Y轴即可,所以之前在TFT画图的程序得对应修改为在SRAM画图的程序
,并且DMA使用M2M模式就可以了。
3、代码
DMA初始化:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
DMA_Cmd(DMA2_Stream2, DISABLE);
DMA_DeInit(DMA2_Stream2);
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)0;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Bank1_LCD_D;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
DMA_InitStructure.DMA_BufferSize = (uint32_t)30000;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC4;
DMA_Init(DMA2_Stream2, &DMA_InitStructure);
在以后使用仅仅更改设备地址及设备大小就行了:
void LCD_DMA_TX(u32 Addr,u32 Size)
{
DMA_Cmd(DMA2_Stream2, DISABLE);
DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)Addr;
DMA_InitStructure.DMA_BufferSize=(uint32_t)Size;
DMA_Init(DMA2_Stream2,&DMA_InitStructure);
DMA_Cmd(DMA2_Stream2,ENABLE);
}
4、问题
一、在使用void LCD_DMA_TX()这个函数后,必须在后面加入至少SysTick_DelayMS(10);的延时才能正常使用。
A、刚开始我以为是DMA初始化需要等待,于是我将SysTick_DelayMS(10)替换为:while(DMA_GetCmdStatus(DMA2_Stream2)!=ENABLE&&u32_i--);
这样子理论上来说,DMA已经完全稳定,但是还是显示不正常。
B、然后为了不堵塞CPU,我就100MS启动一次刷屏,理论上这样比SysTick_DelayMS(10)延时还多:
if(++count==10)
{
count=0;
void LCD_DMA_TX();
}
郁闷的是,这样还是不行。
C、最后我屏蔽掉了其他程序,排除其他部分的干扰。但问题依旧,唯有SysTick_DelayMS(10);这种方法坚挺!
二、ADC转换速度与带宽速度冲突
实际上,我刷新的SRAM中的内容是ADC采样的数据。之前一直保持的是1M的采样率多通道转换。
现在只要DMA刷屏一开启,就会使能ADC报警:overrun
后面想了想,有可能是DMA占用的总线带宽,使得剩下带宽读取ADC的速度已经跟不上ADC本身的采样率而导致ADC挂掉。
试了试果然是这样,但是这样ADC速度就下来了。
5、解答
请教各位大神,如何把那个该死的10MS延迟消掉?还有就是如何配置DMA才和ADC尽量不冲突?
|