初级会员

- 积分
- 57
- 金钱
- 57
- 注册时间
- 2012-11-9
- 在线时间
- 0 小时
|
我想通过STM32在FSMC模式下驱动SRAM和TFT结果在读SRAM就出现了数据混乱,下面给大家说说过程吧:
一开始没有驱动SRAM,仅仅是用TFT显示图片:
1、驱动TFT选择的区域为:FSMC_Bank1_NORSRAM1
2、TFT的RS接的是A20,所以其对应地址为:0x60000000+1<<(20+1)=0x60000000+0x200000=0x60200000;
3、显示的主要程序如下:
/*************************************************
功能:显示图片
参数说明:
x,y->图标坐标
Width,Height->图片宽高Width<=479,Height<=319
*Picture->图片对应数组
**************************************************/
void LCD_PutPicture(u16 x,u16 y,u16 Width,u16 Height,const unsigned char *Picture)
{
u16 i,j;
u16 Color;
u32 a=0,b=1;
LCD_Open_Windows(x,y,x+Width,y+Height);
LCD_ILI9481_CMD(0x2c);
for(i=0;i<(Height+1);i++)
{
for(j=0;j<(Width+1);j++)
{
Color=(((u16)(Picture[a]<<8))|Picture);
LCD_ILI9481_Parameter(Color);
a=a+2;
b=b+2;
}
}
}
4、图片如下
后来接上了SRAM
1、SRAM所用区域为:FSMC_Bank1_NORSRAM3
2、所以起始其地址为:0x68000000
3、芯片型号为:IS61LV51216,也就是521K乘以16bit
首先是存入少量的数据及显示,对应程序为:
/*********************************
功能:写一个字
参数:WriteAddr->写入字的地址
Data->写入数据
********************************/
void SRAM_WriteHalfWord(u32 WriteAddr,u16 Data)
{
SRAM_Write((Bank1_SRAM3_Addr+WriteAddr),Data);
}
/**************************************
功能:读出一个字
参数:ReadAddr->读入字的地址
***************************************/
u16 SRAM_ReadHalfWord(u32 ReadAddr)
{
return (*(vu16 *)(Bank1_SRAM3_Addr+ReadAddr));
}
对应主程序中内容为:
SRAM_SFMC_Configuration();
SRAM_WriteHalfWord(0x3fff0,RED);
SRAM_WriteHalfWord(0x3fff2,BLACK);
SRAM_WriteHalfWord(0x3fff6,BLUE);
SRAM_WriteHalfWord(0x3fff8,WHITE);
Buffer=SRAM_ReadHalfWord(0x3fff0);
Buffer2=SRAM_ReadHalfWord(0x3fff2);
Buffer4=SRAM_ReadHalfWord(0x3fff6);
Buffer5=SRAM_ReadHalfWord(0x3fff8);
LCD_PutString(100,100,"中",Buffer,WHITE);
LCD_PutString(120,100,"中",Buffer2,WHITE);
LCD_PutString(160,100,"中",Buffer4,WHITE);
LCD_PutString(180,100,"中",Buffer5,WHITE);
其显示图像如下:
从现在看一切很正常,我就准备把那个大图像也这样子写读一次,
对应SRAM及显示的程序如下:
/*******************************
功能:写入连续的16位图像数据
参数:*pBuffer->缓存区指针
WriteAddr->开始写入地址
nHalfWordToWrite->写入个数
********************************/
void SRAM_WritePictureDataBuffer(const unsigned char *pBuffer,u32 WriteAddr,u32 nData)
{
u32 a=0,b=1;
u16 Buffer;
u32 Addr;
Addr=WriteAddr;
for(;nData!=0;nData--)
{
Buffer=((u16)(pBuffer[a]<<8)|pBuffer);
*(u16*)(Bank1_SRAM3_Addr+Addr)=Buffer;
Addr=Addr+2;
a=a+2;
b=b+2;
}
}
/*************************************************
功能:显示图片
参数说明:
x,y->图标坐标
Width,Height->图片宽高Width<=479,Height<=319
ReadAddr->读数据地址
**************************************************/
void LCD_PutPicture(u16 x,u16 y,u16 Width,u16 Height,u32 ReadAddr)
{
u16 i,j;
u16 Color;
u32 Addr;
Addr=ReadAddr;
LCD_Open_Windows(x,y,x+Width,y+Height);
LCD_ILI9481_CMD(0x2c);
for(i=0;i<(Height+1);i++)
{
for(j=0;j<(Width+1);j++)
{
SysTick_DelayUs(20);
Color=*(vu16*)(Bank1_SRAM3_Addr+Addr);
LCD_ILI9481_Parameter(Color);
Addr=Addr+2;
}
}
}
这个图片一共有307200个字节,也就是有150K乘以16bit,所以数据是能够装下的
对应主程序中为:
SRAM_WritePictureDataBuffer(gImage_tu,0x00000000,153600);
LCD_PutPicture(0,0,479,319,0x00000000);
接下来的图片就悲剧了:
希望大家帮帮忙啊! |
|
|