打印

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

[复制链接]
10675|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nxdxm|  楼主 | 2021-8-31 18:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在野火的stm32f407平台上面写了一个显示图片的程序,使用SDIO功能和移植的fatfs文件系统将存在SD卡中的BMP文件读取出来,然后判断数据,将数据写入两个BUFFER中,再用DMA将BUFFER里面数据传入FSMC映射的数据地址。问题是图片可以显示出来,但是图片上会有条纹,我观察了一下,感觉条纹像是显示错位了,我也DEBUG了,看了一下从SD卡中读取的数据是没有问题的,问题可能就出现在DMA传输上面,因为当我使用MCU直接去搬运数据就不会出现图片显示有条纹的问题,不知道DMA要怎样设置才能让图片显示正常,求大佬点拨。

使用特权

评论回复

相关帖子

沙发
nxdxm|  楼主 | 2021-8-31 18:36 | 只看该作者

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

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);///发送
         
}

使用特权

评论回复
板凳
shipeng1989| | 2021-9-1 09:59 | 只看该作者
看下10楼的帖子对你有没有帮助

使用特权

评论回复
地板
nxdxm|  楼主 | 2021-9-1 22:30 | 只看该作者
问题解决了,是因为我把存储器到存储器DMA优先级和SDIO的DMA优先级设置一样高,我程序里面先把图片用sdio的DMA读取到两个BUFFER中去,填满一个BUFFER后,我就用存储器到存储器DMA把读取的数据传入FSMC映射好的LCD数据地址中去,紧接着让SDIO的DMA搬运数据到另一个BUFFER中,这期间就会产生两个DMA争夺总线资源的问题,所以产生了奇奇怪怪的问题,特别是我把BUFFER的容量改小后问题则更严重,但当我把BUFFER的容量给的过大则导致调用f_read()函数返回1的问题,我上网搜了一下,发现可能是因为SDIO的工作频率过高可能出现的读取错误,于是我检查了一下两个DMA的配置,发现传输的优先级设置相同,才联想到可能是因为两个DMA相互争夺资源导致的问题。

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝