OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6992|回复: 12

STM32在FSMC下通过SRAM驱动TFT出现问题

[复制链接]

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2012-11-9
在线时间
0 小时
发表于 2012-12-9 15:10:30 | 显示全部楼层 |阅读模式
我想通过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、图片如下

TFT不带SRAM 


后来接上了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简单显示 

从现在看一切很正常,我就准备把那个大图像也这样子写读一次,
对应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);
接下来的图片就悲剧了:
IMG_20121209_131752.jpg 



希望大家帮帮忙啊!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2012-11-9
在线时间
0 小时
 楼主| 发表于 2012-12-9 15:32:58 | 显示全部楼层
试过改数据类型,也改了范围。还是不行............
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-12-9 19:01:03 | 显示全部楼层
整个内存数据测试下,看看是不是焊接有问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2012-11-9
在线时间
0 小时
 楼主| 发表于 2012-12-10 09:56:46 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
用JTAG调试发现数据读出居然是从63K*16bit的位置开始,而且只是一小段,然后就不断重复了。我在写入函数下面加了读出,发现写入后马上读出数据没有一点问题。但是搞不懂在显示函数里面读出就不正常了。有几位数还不是表格里面的数据,会不会是TFT与SRAM驱动程序有互斥?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-12-10 11:37:45 | 显示全部楼层
不会的,他们会通过片选信号区分,不会干扰的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2012-11-9
在线时间
0 小时
 楼主| 发表于 2012-12-10 11:51:23 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
写入单个数据,地址在最高层,然后单个读出也没有什么不对。搞不懂了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-12-10 12:35:15 | 显示全部楼层
回复【6楼】304301959:
---------------------------------
全测试下,一个个字节写入,读出对比。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2012-11-9
在线时间
0 小时
 楼主| 发表于 2012-12-10 15:11:44 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
看图片的规律似乎是数据溢出了,麻烦您帮我看看,我上面是不是把数据大小算错了呢?
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2012-11-9
在线时间
0 小时
 楼主| 发表于 2012-12-10 15:49:05 | 显示全部楼层
回复【8楼】304301959:
---------------------------------
测试出来了,送16位的数据最多送1024个,多了就会溢出。但是这样子算出来只有:1K*16BIT啊,与Datasheet上的512K*16bit完全不同啊。后来又找了ST的历程,他们给出SRAM的范围也是0-0X400,也还是1K*16bit,同样的芯片。怎么会这样呢?还是我理解错了啊?
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2012-11-9
在线时间
0 小时
 楼主| 发表于 2012-12-10 18:09:29 | 显示全部楼层
回复【9楼】304301959:
---------------------------------
如果单独送数的话,多余的范围也一样可以正常读出了。看来硬件是没问题了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-12-10 22:15:23 | 显示全部楼层
这差得远啊...
你地址线有问题,估计。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2012-11-9
在线时间
0 小时
 楼主| 发表于 2012-12-11 15:10:40 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
找出问题了,A10这个地址线IO映射的时候搞丢了。哎,做事太不仔细了。
回复 支持 反对

使用道具 举报

15

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-7-1
在线时间
28 小时
发表于 2014-9-9 17:29:21 | 显示全部楼层
回复【12楼】304301959:
----------------------------
然后你怎么解决的呢???
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-2 13:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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