搜索
bottom↓
回复: 8

stm32使用FSMC控制DMA传输图片到LCD显示出现颜色错乱

[复制链接]

出0入0汤圆

发表于 2013-8-31 21:21:56 | 显示全部楼层 |阅读模式
今天在做FSMC上DMA传输图片到LCD显示,在不用DMA只用FSMC的情况下只是将图片反转了,在加了图片之后颜色值好像变反了,下面是相关的代码,请大侠和高手赐教,万分感谢
1. 我的图片是320*240,位深24位的,LCD为16位显示,(原图如图1所示)所以在从SD卡中读取数据后(这一步验证没有问题),将24位数据转换成16位数据,函数如下所示:
uint16_t LCDRGB24TORGB16fuction(R,G,B) //R、G、B分别为8位数据
{
        uint16_t tmpcolor;
        tmpcolor = ((unsigned short int)((((R)>>3)<<11) | (((G)>>2)<<5)        | ((B)>>3)        ));
        return tmpcolor;
}
2. 在这个转换完之后,用LCD的FSMC写函数直接写到映射区,结果只是图像水平翻转了,颜色都没变,但换成DMA之后就变成了如下图2所示。不知道是不是由于高低位错乱的问题,请高人指点DMA的相关配置:
void DMA_LCD_Init(void)
{
    DMA_InitTypeDef    DMA_InitStructure;
    RCC_AHB1PeriphClockCmd(DMA_STREAM_CLOCK, ENABLE);//使能DMA控制器的系统时钟 RCC_AHB1Periph_DMA2
  /* DMA2 channel2 configuration 将DMA2通道2的寄存器设为默认值*/
  DMA_DeInit(DMA_STREAM);//DMA2_Channel2_Stream1
    DMA_InitStructure.DMA_Channel = DMA_CHANNEL; /* 配置通道*/
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_Const_Buffer;//RAM地址 Bank1_LCD_D
  DMA_InitStructure.DMA_Memory0BaseAddr = Bank1_LCD_D; //外设地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;// 配置为内存到内存的DMA传输     
  DMA_InitStructure.DMA_BufferSize = 320;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//Enable
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//Enable
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//Word
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//HalfWord//Byte
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//Normal
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

  DMA_Init(DMA_STREAM, &DMA_InitStructure);// 初始化
  DMA_ITConfig(DMA_STREAM, DMA_IT_TC, ENABLE);//使能DMA传输结束中断 DMA_IT_TC//DMA_IT_TC//DMA_IT_FEIF1
  DMA_ClearFlag(DMA_STREAM, DMA_FLAG_TCIF1);//DMA_IT_TC
  //DMA_Cmd(DMA_STREAM, ENABLE);// 使能DMA Stream DMA2_Stream1在后面要用的地方进行使能
}
3.主程序先关部分:
    Active_Window(0,319,0,239);
      XY_Coordinate(0,0);
     LCD_CmdWrite(0x02);                 /* 准备读写显存 */
      for(i=0;i<height; i++)
      {       
           for(j=0; j<width*3; j++)         //将一行数据全部读入
       {
                f_read(&bmpfsrc,pColorData+j,1,&read_num);
           }            
           for(j=0;j<width;j++)         //一行有效信息
       {                                                       
                bmp_red = pColorData[3*j+2];//<<16
                bmp_green = pColorData[3*j+1];//<<8
                bmp_blue =  pColorData[3*j];  //一行中第K个像素的起点(地址)
        SRC_Const_Buffer[j] = LCDRGB24TORGB16fuction(bmp_red ,bmp_green ,bmp_blue)                                                           
                // LCD_BusWrite16(RGB24TORGB16(bmp_red,bmp_green,bmp_blue));//此处为单独FSMC写图像命令
            }
         DMA_Cmd(DMA_STREAM, ENABLE);                                               
      }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-8-31 21:50:46 | 显示全部楼层
貌似原图比出问题的图好不到哪去。

出0入0汤圆

发表于 2013-8-31 22:09:02 | 显示全部楼层
看上去是数据错位了    做个模拟测试  对比一下发送的数据与接收的数据 次序

出0入0汤圆

 楼主| 发表于 2013-8-31 23:01:01 | 显示全部楼层
aozima 发表于 2013-8-31 21:50
貌似原图比出问题的图好不到哪去。

嗯,但单独用FSMC的时候没有问题

出0入0汤圆

 楼主| 发表于 2013-8-31 23:01:20 | 显示全部楼层
not_at_all 发表于 2013-8-31 22:09
看上去是数据错位了    做个模拟测试  对比一下发送的数据与接收的数据 次序 ...

嗯,谢谢指点

出0入0汤圆

发表于 2013-10-2 22:42:54 | 显示全部楼层
LZ这个问题进展的如何了?

出0入0汤圆

 楼主| 发表于 2013-11-17 22:11:13 | 显示全部楼层
youpeng 发表于 2013-10-2 22:42
LZ这个问题进展的如何了?

最近已经不再弄这个了,后面弄得时候有进展再更新

出0入0汤圆

发表于 2013-11-17 22:57:58 | 显示全部楼层
just0511 发表于 2013-11-17 22:11
最近已经不再弄这个了,后面弄得时候有进展再更新

您好,最近我也想用3.5寸的tft屏,能提供点资料给我参考吗?

这个屏是哪个型号的,stm32驱动的时候要加驱动芯片吗?

出0入0汤圆

发表于 2022-6-3 22:05:45 | 显示全部楼层
我的用fsmc全部正常后,加入dma,其它都正常,就是颜色不正确
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-14 04:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表