问答

汇集网友智慧,解决技术难题

21ic问答首页 - 关于用FMSC和DMA显示图片的相关问题

单片机 MSC fm DMA sd SD卡

关于用FMSC和DMA显示图片的相关问题

nxdxm2021-08-31
在野火的stm32f407平台上面写了一个显示图片的程序,使用SDIO功能和移植的fatfs文件系统将存在SD卡中的BMP文件读取出来,然后判断数据,将数据写入两个BUFFER中,再用DMA将BUFFER里面数据传入FSMC映射的数据地址。问题是图片可以显示出来,但是图片上会有条纹,我观察了一下,感觉条纹像是显示错位了,我也DEBUG了,看了一下从SD卡中读取的数据是没有问题的,问题可能就出现在DMA传输上面,因为当我使用MCU直接去搬运数据就不会出现图片显示有条纹的问题,不知道DMA要怎样设置才能让图片显示正常,求大佬点拨。
回答 +关注 16
10679人浏览 3人回答问题 分享 举报
3 个回答
  • 问题解决了,是因为我把存储器到存储器DMA优先级和SDIO的DMA优先级设置一样高,我程序里面先把图片用sdio的DMA读取到两个BUFFER中去,填满一个BUFFER后,我就用存储器到存储器DMA把读取的数据传入FSMC映射好的LCD数据地址中去,紧接着让SDIO的DMA搬运数据到另一个BUFFER中,这期间就会产生两个DMA争夺总线资源的问题,所以产生了奇奇怪怪的问题,特别是我把BUFFER的容量改小后问题则更严重,但当我把BUFFER的容量给的过大则导致调用f_read()函数返回1的问题,我上网搜了一下,发现可能是因为SDIO的工作频率过高可能出现的读取错误,于是我检查了一下两个DMA的配置,发现传输的优先级设置相同,才联想到可能是因为两个DMA相互争夺资源导致的问题。
  • 看下10楼的帖子对你有没有帮助
  • void Initial_DMA_StoreToStore (unsigned short *source,unsigned long size)///存储器到存储器DMA
    {
      DMA_InitTypeDef  DMA_InitStructure = {0};
            DMA_Cmd(DMA2_Stream0,DISABLE);///发送
      //*********************************** 初始化DMA ***************************************//
             DMA_InitStructure. DMA_Channel = DMA_Channel_0; //通道选择
             DMA_InitStructure. DMA_PeripheralBaseAddr = (unsigned long)source; //数据地址//源地址
             DMA_InitStructure. DMA_Memory0BaseAddr = (unsigned long)LCD_BASEADD_DATA; //存储器 0 地址////目标地址
             DMA_InitStructure. DMA_DIR = DMA_DIR_MemoryToMemory; //传输方向
             DMA_InitStructure. DMA_BufferSize = size; //数据数目
             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_MemoryDataSize_HalfWord; //存储器数据宽度
             DMA_InitStructure. DMA_Mode = DMA_Mode_Normal; //模式选择//一次传输
             DMA_InitStructure. DMA_Priority = DMA_Priority_Low; //优先级
             DMA_InitStructure. DMA_FIFOMode = DMA_FIFOMode_Enable; //FIFO 模式
             DMA_InitStructure. DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; //FIFO 阈值设置为半满,也就是把char类型转成short类型
             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_Cmd(DMA2_Stream0,ENABLE);///发送
             
    }


您需要登录后才可以回复 登录 | 注册