|
我计划使用dma优化fsmc和muc屏的lcd刷新效率,遇到了以下几个问题
1.当使用mem2mem模式时,内存地址和外设地址要如何设置。
2.数据格式要如何设置。
3.初始化完成之后如何开始使用dma传输数据
以下是代码部分
void fsmc_dma_init()
{
DMA_InitTypeDef fsmc_dma_init;
fsmc_dma_init.DMA_BufferSize=0;//传输的数据大小 初始化为0 后续设置
fsmc_dma_init.DMA_Channel=DMA_Channel_1;//通道1
fsmc_dma_init.DMA_DIR=DMA_DIR_MemoryToMemory ;//从内存到内存 LCD的ram到FSMC
fsmc_dma_init.DMA_FIFOMode=DMA_FIFOMode_Enable;//当开启内存到内存时需要将开启
fsmc_dma_init.DMA_FIFOThreshold=DMA_FIFOThreshold_Full;
fsmc_dma_init.DMA_Memory0BaseAddr=(uint32_t)TFTLCD->LCD_RAM ;
fsmc_dma_init.DMA_MemoryBurst= DMA_MemoryBurst_INC8 ;
fsmc_dma_init.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord ;//根据sram的数据位=16bit 算则
fsmc_dma_init.DMA_MemoryInc=DMA_MemoryInc_Disable ;//因将LCD的ram映射为内存 所以将fsmc上的数据传输到lcdram中 所以地址不自增
fsmc_dma_init.DMA_Mode=DMA_Mode_Normal ;//正常模式
fsmc_dma_init.DMA_PeripheralBaseAddr=FSMC_Bank1_NORSRAM1;//连接到FSMC bank1
fsmc_dma_init.DMA_PeripheralBurst=DMA_PeripheralBurst_INC8;
fsmc_dma_init.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//半字16位
fsmc_dma_init.DMA_PeripheralInc=DMA_PeripheralInc_Enable ;//外设地址递增 将
fsmc_dma_init.DMA_Priority=DMA_Priority_Low ;
DMA_Init(DMA2_Stream0,&fsmc_dma_init );//DMA2 数据流0
}
void fsmc_lcd_dma_tx(u16 ndtr ,uint32_t MemoryBaseAddr )
{
DMA_MemoryTargetConfig(DMA2_Stream0, MemoryBaseAddr,DMA_Memory_0);
DMA_Cmd(DMA2_Stream0, DISABLE); //关闭DMA传输
while (DMA_GetCmdStatus(DMA2_Stream0) != DISABLE){} //确保DMA可以被设置
DMA_SetCurrDataCounter(DMA2_Stream0,ndtr); //数据传输量
DMA_Cmd(DMA2_Stream0, ENABLE); //开启DMA传输
}
|
|