实现功能:把外部SRAM数据用DMA送到LCD的RAM上
问题:在103上已经实现,现在要移植到207上(207与407的DMA相同)
[mw_shl_code=c,true]void GRAM_DMA_Init(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//使能DMA传输
DMA_DeInit(DMA2_Stream5);//将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_Channel = DMA_Channel_5;//通道5
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&GDRAM[0];//(u32)0X68000000;//SRAM
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)0x60020000;//LCD
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//SRAM->LCD
DMA_InitStructure.DMA_BufferSize = 38400;//DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//地址递增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//不增
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通道 x拥有中优先级
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream5, &DMA_InitStructure);//初始化DMA
// DMA_ITConfig(DMA2_Stream5, DMA_IT_TC,ENABLE);
}[/mw_shl_code]
320X480的屏数据分4次送,直到刷完一屏算一次。
[mw_shl_code=c,true]//开启一次LCD DMA传输
//x:其实传输地址编号(0~240)
void LCD_DMA_Enable(void)
{
u16 len;
len = 38400;
DMA_Cmd(DMA2_Stream5,DISABLE); //关闭DMA传输
DMA_ClearFlag(DMA2_Stream5, DMA_IT_TCIF5);//清除上次的传输完成标记
DMA2_Stream5->NDTR=len; //传输的数据长度
DMA2_Stream5->  AR=(u32)&GDRAM[0]; //DMA2,改变存储器地址
DMA_Cmd(DMA2_Stream5, ENABLE); //开启DMA传输
while(DMA_GetFlagStatus(DMA2_Stream5, DMA_IT_TCIF5)==RESET);//等着
///////////////////////////////////////////////////////////////////////////
DMA_ClearFlag(DMA2_Stream5, DMA_IT_TCIF5);//清除上次的传输完成标记
DMA2_Stream5->  AR=(u32)&GDRAM[38400]; //DMA2,改变存储器地址
DMA_Cmd(DMA2_Stream5,DISABLE); //关闭DMA传输
DMA2_Stream5->NDTR=len; //传输的数据长度
DMA_Cmd(DMA2_Stream5, ENABLE); //开启DMA传输
while(DMA_GetFlagStatus(DMA2_Stream5, DMA_IT_TCIF5)==RESET);//等着
///////////////////////////////////////////////////////////////////////////
DMA_ClearFlag(DMA2_Stream5, DMA_IT_TCIF5);//清除上次的传输完成标记
DMA2_Stream5->  AR=(u32)&GDRAM[76800]; //DMA2,改变存储器地址
DMA_Cmd(DMA2_Stream5,DISABLE); //关闭DMA传输
DMA2_Stream5->NDTR=len; //传输的数据长度
DMA_Cmd(DMA2_Stream5, ENABLE); //开启DMA传输
while(DMA_GetFlagStatus(DMA2_Stream5, DMA_IT_TCIF5)==RESET);//等着
///////////////////////////////////////////////////////////////////////////
DMA_ClearFlag(DMA2_Stream5, DMA_IT_TCIF5);//清除上次的传输完成标记
DMA2_Stream5->  AR=(u32)&GDRAM[115200]; //DMA2,改变存储器地址
DMA_Cmd(DMA2_Stream5,DISABLE); //关闭DMA传输
DMA2_Stream5->NDTR=len;
DMA_Cmd(DMA2_Stream5, ENABLE); //开启DMA传输
while(DMA_GetFlagStatus(DMA2_Stream5, DMA_IT_TCIF5)==RESET);//等着
}[/mw_shl_code]
上述代码问题:程序死在第一次等待查询上“while(DMA_GetFlagStatus(DMA2_Stream5, DMA_IT_TCIF5)==RESET);”,不知道哪个地方出现了问题。
外设基地址和内存基地址还是沿用之前的,在不启用DMA,直接FSMC+LCD测试已经通过了。
|