|
今天在做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周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|