搜索
bottom↓
回复: 115

STM32关于FSMC连接LCD 例程:MCU怎么确定片外LCD控制器的寄存器地址?

[复制链接]

出0入0汤圆

发表于 2010-3-7 16:35:32 | 显示全部楼层 |阅读模式
Keil4自带的demo: STM32F103VE用FSMC驱动LCD AM-240320L8TNQW00H(ILI9320),在lcd.c里有:
typedef struct
{
  __IO uint16_t LCD_REG;
  __IO uint16_t LCD_RAM;
} LCD_TypeDef;

#define LCD_BASE    ((uint32_t)(0x60000000 | 0x0C000000))
#define LCD         ((LCD_TypeDef *) LCD_BASE)

第一个define好理解:LCD连接的是FSMC_Bank1_NOR/SRAM4,映射到FSMC的memory为0x6C00 0000 - 0x6FFF FFFF,共64MByte。
但第二个define该怎么理解呢,为什么LCD_REG(寄存器序号)地址为0x6C00 0000、LCD_RAM(该寄存器的值)地址为0x6C00 0001?

对于写寄存器,代码里有:
#define R1             0x01
LCD_WriteReg(R1, 0x0100);
uint16_t LCD_ReadReg(uint8_t LCD_Reg)
{
  LCD->LCD_REG = LCD_Reg;
  return (LCD->LCD_RAM);
}
MCU和LCD的通讯,从ILI9320 DS里的时序图可知是:先CS=0,RS=0,WR=0写IR,然后使CS=0,RS=1,WR=0再写index是IR值的寄存器(RS=1时不时写RAM么?不懂),而对于上面的LCD_WriteReg()语句,就是先往地址为0x6C00 0000的地方写0x01、再往地址为0x6C00 0001的地方写0x0100,中间也没有CS/RS/WR的设置,LCD_REG怎么就成了IR寄存器呢、LCD_RAM怎么就成了IR索引的那个寄存器呢?

请高手指教。
附图:问题中提到的demo所用的电路图:

AN2790电路图 (原文件名:AN2790.JPG)

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

如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。

出0入0汤圆

 楼主| 发表于 2010-3-8 13:19:57 | 显示全部楼层
大家都没用过FSMC连LCD么

出0入0汤圆

发表于 2010-3-8 13:29:12 | 显示全部楼层
往地址0x6C00 0001的地方写0x0100这个地址时A0会输出一个高电平到液晶的RS脚上,数据总线上会输出0x0100;之后依你的FSMC时序初始化设置,FSMC_NE4和FSMC_NWE会往自动拉低再拉高完成一个类SRAM设备的写操作时序。这样就完成了对液晶REG寄存器的写操作。

仔细看一下Reference Maunaul,上面有对FSMC的讲解。

出0入0汤圆

 楼主| 发表于 2010-3-8 13:39:51 | 显示全部楼层
谢谢楼上的关注。
MCU往0x6C00 0000地址写0x01,片外的LCD从接口数据线的16bit收到这个值,但它怎么就知道该把这个值送给IR寄存器呢,FSMC只把0x6C00 0000 - 0x6FFF FFFF映射给了LCD,但也没说0x6C00 0000就是IR寄存器呀

出0入0汤圆

 楼主| 发表于 2010-3-8 14:37:24 | 显示全部楼层
是否是这样理解:先看ILI9320控制器的说明:

ILI9320 (原文件名:100308134738f2e4c2e7565b26.png)
RS=0时是针对IR和SR,RS=1是针对其他寄存器。RS=0时也即A0=0,对应地址0x6C00 0000,对该地址写就是对IR寄存器写,对该地址读就是对SR寄存器读。RS=1时也即A0=1,对应地址0x6C00 0001(末位为1),对该地址读、写就是对其余寄存器读写,具体是读写哪个寄存器,ILI9320控制器会先从IR中取出索引号。

至于读写时CS/RS/RD/WR的高低电平变化,都是MCU“自动”完成的,这“自动”的道理是什么呢?……

出0入0汤圆

发表于 2010-5-5 21:42:55 | 显示全部楼层
支持一下!我也在搞这个,很迷茫!

出0入0汤圆

发表于 2010-5-6 08:50:28 | 显示全部楼层
如果你想搞明白MCU和LCD之间怎么通信的,那你可以不用FSMC直接用IO驱动LCD,当你能用IO口直接驱动LCD的时候,你就彻底搞明白了。

出0入0汤圆

发表于 2010-9-17 21:26:59 | 显示全部楼层
呵呵  我是先用的io直接驱动 后来用的fsmc驱动的
感觉没什么 只是用的时候费劲了! 还得算那些延时啊 建立时间啊什么的

出0入0汤圆

发表于 2010-9-19 11:53:38 | 显示全部楼层
其实都是51的时候关于总线没学好……真正理解movx 产生的时序…… 再来看这些时序问题就都不是问题了

出0入0汤圆

发表于 2010-9-19 17:25:42 | 显示全部楼层
MARK
头像被屏蔽

出0入0汤圆

发表于 2010-9-27 23:04:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2010-9-28 12:04:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-15 22:16:11 | 显示全部楼层
几号
头像被屏蔽

出0入0汤圆

发表于 2010-11-15 23:17:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2010-12-15 20:07:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-16 11:43:30 | 显示全部楼层
希望能把解决办法发到这里。

出0入0汤圆

发表于 2010-12-28 15:03:10 | 显示全部楼层
实际上通过FSMC总线看 LCD只有[ 2 ]个地址,分别对应RS=1和 RS=0的两种情况.
RS=0:写命令.
RS=1:读写数据.

写REG其实分成2步:
1.写命令(寄存器地址) 2.写数据(寄存器数据)

读REG:
1.写命令(寄存器地址) 2.读数据(寄存器数据)

所有的寄存器地址和寄存器数据,以及 GRAM数据都是通过 IO0-IO15完成传输的,而不是FSMC的地址.这是容易搞混的一个地方.LCD的FSMC地址只有一根 ,就是RS.

出0入0汤圆

发表于 2010-12-28 15:26:02 | 显示全部楼层
"至于读写时CS/RS/RD/WR的高低电平变化,都是MCU“自动”完成的,这“自动”的道理是什么呢?……"
---------------------------------------------------------------------------------------------
读存储器一般是FSMC控制器使能片选CS,在地址总线上输出地址,RD=0,WR=1,然后存储器响应这些信号在数据总线上输出数据,然后FSMC在数据总线上读取该数据.
写存储器一般是FSMC控制器使能片选CS,在地址总线上输出地址,在数据总线上输出数据,RD=1,WR=0,然后存储器响应这些信号把数据总线上的数据写入内部存储单元.

出0入0汤圆

发表于 2011-1-24 06:39:17 | 显示全部楼层
LCD的REST的管脚连接到STM32F103ZET的哪个管脚啊?急~~!

出0入0汤圆

发表于 2011-1-24 10:45:20 | 显示全部楼层
RST连接到任何一个闲置的GPIO,需要通过操作该GPIO来操作RST.

出0入0汤圆

发表于 2011-2-19 19:05:57 | 显示全部楼层
好资料

出0入0汤圆

发表于 2011-2-19 19:11:49 | 显示全部楼层
//写寄存器地址函数
void LCD_WR_REG(unsigned int index)
{
        *(__IO uint16_t *) (Bank1_LCD_C)= index;

}

//写寄存器数据函数
void LCD_WR_CMD(unsigned int index,unsigned int val)
{       
        *(__IO uint16_t *) (Bank1_LCD_C)= index;       
        *(__IO uint16_t *) (Bank1_LCD_D)= val;
}


这两句都不怎么理解?   sharpufo 风生水起月皎白   帮忙

出0入0汤圆

发表于 2011-2-20 13:48:23 | 显示全部楼层
回复【21楼】sgfwin
-----------------------------------------------------------------------
具体什么地方不理解?

记住,FSMC总线上看,LCD只有2个地址.
Bank1_LCD_C是写寄存器,此时RS=1,告诉LCD我在总线上输出数据的是寄存器的地址
Bank1_LCD_D是写数据,此时RS=0,告诉LCD我在总线上输出地数据是寄存器的数据或者GRAM的数据.

写寄存器数据按2步来:
第一步先往Bank1_LCD_C (对应RS=1),送寄存器的地址:*(__IO uint16_t *) (Bank1_LCD_C)= index;
接着在Bank1_LCD_D这个地址(对应RS=0),写入刚指向的寄存器的数据: *(__IO uint16_t *) (Bank1_LCD_D)= val;

为什么*(__IO uint16_t *) (Bank1_LCD_C)= index; 就是往 LCD 写寄存器呢?
这个你要懂得什么是总线操作。具体自己去查一下微机原理之类或者FSMC方面的资料吧。
如果让我说,不是很准确。稍微说一下吧:
这是一个16位的IO赋值操作,地址是Bank1_LCD_C,这个地址就是指向FSMC的 Bank1的NE1对应的地址空间。而LCD片选正是连接到NE1,具体地址要看RS接到哪一根地址线上。当CPU执行到这一条的时候,就会通过FSMC总线控制器在数据总线上进行一个地址为 Bank1_LCD_C的数据写操作,此操作自动完成CS信号,RD信号,WR信号,以及地址总线数据(RS信号)的输出以及数据总线数据的输出.

其他的操作都是这两个操作组合完成。也就是我上面所说的,
"所有的寄存器地址和寄存器数据,以及 GRAM数据都是通过 IO0-IO15完成传输的,而不是FSMC的地址.这是容易搞混的一个地方.LCD的FSMC地址只有一根 ,就是RS."

出0入0汤圆

发表于 2011-2-20 14:04:47 | 显示全部楼层
回复【22楼】sharpufo 风生水起月皎白
-----------------------------------------------------------------------

//写寄存器数据函数
void LCD_WR_CMD(unsigned int index,unsigned int val)
{
*(__IO uint16_t *) (Bank1_LCD_C)= index;   //========= RS=1
*(__IO uint16_t *) (Bank1_LCD_D)= val;     //========= RS=0    但是2条语句间并没有“ 手动 ”操作 RS啊?
}

FSMC地址只有一根 ,就是RS,至于读写时CS/RS/RD/WR的高低电平变化,都是MCU“自动”完成的。 好像RS接哪个GPIO没有固定要求的吧,又怎么体现“自动”呢?  不解

出0入0汤圆

发表于 2011-2-20 14:15:06 | 显示全部楼层
这正是总线操作的优点啊,RS是接到地址线上的,总线操作是自动完成地址总线数据的输出地。
对应Bank1_LCD_C 的地址,FSMC总线控制器在RS接的那根地址线输出的是 1,而对应Bank1_LCD_D,输出的0.
RS接的可不是GPIO,是FSMC地址总线的一根.FSMC进行读写操作的时候会在地址总线根据要读写的地址输出电平的.
RS接哪一根地址线虽然没有固定要求,但是一旦你确定要接哪一根,那么Bank_LCD_C和Bank_LCD_D也要随之确定,这可不是“自动的".

虽然没有手动操作GPIO来操作RS,但是你敲代码的时候可是手动指定 Bank1_LCD_C 或者 Bank1_LCD_D ,从而确定 RS的电平.
所谓的“自动”是指:不是通过操作GPIO来操作RS,而是直接根据地址总线地址的不同来完成操作RS,这两种方法的速度差别是非常大的.


如果是GPIO方式,先要通过操作GPIO 分别 输出 RS,CS,等的电平,然后再通过过GPIO操作输出数据,然后还要通过GPIO 再操作RD,WR,CS等的电平。
每操作一个GPIO都要好几个周期,加起来就非常慢了.
而FSMC是在一个FSMC写周期内就完成了这所有的动作。

出0入0汤圆

发表于 2011-2-20 14:48:21 | 显示全部楼层
#define Bank1_LCD_D    ((uint32_t)0x60020000)    //disp Data ADDR
#define Bank1_LCD_C    ((uint32_t)0x60000000)         //disp Reg ADDR   

RS-->PD11

上面的值是不是和 RS 接在哪个引脚有关?

出0入0汤圆

发表于 2011-2-20 14:57:35 | 显示全部楼层
是的,就是这样,先确定RS接到A0-A22的哪一根上面,然后才能确定那两个地址.

出0入0汤圆

发表于 2011-2-20 15:04:32 | 显示全部楼层
sharpufo 风生水起月皎白
讲的好

出0入0汤圆

发表于 2011-2-20 16:05:09 | 显示全部楼层
mark 学习

出0入0汤圆

发表于 2011-2-20 20:41:37 | 显示全部楼层
回复【26楼】sharpufo 风生水起月皎白
-----------------------------------------------------------------------


(原文件名:11.jpg)


高手再问你一下  那两个地址是怎么确定的? 实在是不懂

出0入0汤圆

发表于 2011-2-20 22:51:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-21 13:48:44 | 显示全部楼层
现在还不是好懂

出0入0汤圆

发表于 2011-2-22 23:18:11 | 显示全部楼层
回复【29楼】sgfwin
回复【26楼】sharpufo 风生水起月皎白
-----------------------------------------------------------------------


(原文件名:11.jpg)
引用图片
高手再问你一下  那两个地址是怎么确定的? 实在是不懂   

-----------------------------------------------------------------------

高手不敢当,多接触而已。

把TFT看做类似SRAM的存储器,只能接在 BANK1上。对应基地址是0x60000000.
而BANK1又有划分为四个片选,分别对应基地址:
NE1 0x600000000
NE2 0x640000000
NE3 0x680000000
NE4 0x6C0000000
所以每个NEx能寻址的空间大小为64M,也就是对应了FSMC的A0到A25 共26根地址线.

假如使用NE4接到为LCD的片选CS上,那么就对应基地址 0x6C000000,
如果RS接到地址线的 A0上,那么当 RS为0时对应的地址就是 LCD_REG = 0x6C000000,(其实你用0x6CFFFFF0是一样的,因为只用到一根地址线).RS为1时对应的地址就是 LCD_RAM =0x6C000001,(0x6CFFFFF1一样对应 LCD_RAM,因为它一样对应 RS=1).

如果 RS接到 其他地址线上,情况是类似的。
比如接到 An上,那么
LCD_REG= 0x6C000000,
LCD_RAM= 0x6C000000 | (1<<n)

注意这个地址不是唯一的,只要这个地址能寻址到 BANK1 的 NE4上而且使 RS=0,那么就是 LCD_REG,使 RS=1,就是LCD_RAM.

出0入0汤圆

发表于 2011-2-28 13:24:51 | 显示全部楼层
楼上讲得好 看懂了 哈
关注地址的最低位就行了,RS连接在A0上,所以地址的最低位决定了RS的状态。。。
微机原理没学好啊,惭愧。。。。。。。。。。

出0入0汤圆

发表于 2011-3-6 16:07:54 | 显示全部楼层
谢谢 风生水起月皎白 耐心、精彩的讲解,受益非浅!

出0入0汤圆

发表于 2011-3-9 13:10:08 | 显示全部楼层
回复【32楼】sharpufo 风生水起月皎白
-----------------------------------------------------------------------

风生水起月皎白  不错不错。。学习了。。

出0入0汤圆

发表于 2011-3-11 22:44:54 | 显示全部楼层
讨论很精彩啊,以前学的计算机原理课程忘了差不多了,看了很朦胧。在这里一定会学到真正的东西。

出0入0汤圆

发表于 2011-3-16 17:05:32 | 显示全部楼层
受益匪浅,谢谢 风生水起月皎白

出0入0汤圆

发表于 2011-3-16 17:16:11 | 显示全部楼层
32楼一语道破

出0入0汤圆

发表于 2011-3-22 17:25:44 | 显示全部楼层
非常感谢

出0入0汤圆

发表于 2011-3-24 15:31:30 | 显示全部楼层
讲的不错,受益匪浅。

出0入0汤圆

发表于 2011-3-24 15:37:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-27 21:40:34 | 显示全部楼层
MARK
头像被屏蔽

出0入0汤圆

发表于 2011-3-28 15:43:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2011-3-30 18:19:12 | 显示全部楼层
mark,呵呵,我也明白了

出0入0汤圆

发表于 2011-4-10 13:36:25 | 显示全部楼层
51是基础啊!

出0入0汤圆

发表于 2011-4-13 09:09:34 | 显示全部楼层
mark学习

出0入0汤圆

发表于 2011-4-14 00:48:13 | 显示全部楼层
看到22楼,一下子开了

出0入0汤圆

发表于 2011-4-14 13:57:55 | 显示全部楼层
32楼的扣扣是多少啊  求加

出0入0汤圆

发表于 2011-4-14 14:36:51 | 显示全部楼层
寄存器地址由NEx确定,数据地址由RS确定。就是这么简单。

出0入0汤圆

发表于 2011-5-10 14:25:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-11 12:26:59 | 显示全部楼层
学习了 ~~~

出0入0汤圆

发表于 2011-5-11 12:41:46 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-5-11 14:34:52 | 显示全部楼层
学习中......

出0入0汤圆

发表于 2011-5-13 17:11:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-13 17:59:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-14 15:19:10 | 显示全部楼层
谢谢 风生水起月皎白,真的 受益匪浅啊!!!!!!!!!!!

出0入0汤圆

发表于 2011-5-18 17:19:48 | 显示全部楼层
回复【32楼】sharpufo 风生水起月皎白
-----------------------------------------------------------------------
你好,我用的STM32F103ZE驱动ILI9325液晶,能显示,但是图像是反的,看上去是颠倒了180,请问可能是哪里设置出错了?谢谢!

出0入0汤圆

发表于 2011-5-27 11:53:51 | 显示全部楼层
楼上的估计是扫描方向搞错了。
看了帖子。收益非浅。顶一个

出0入0汤圆

发表于 2011-6-5 08:17:46 | 显示全部楼层
这个帖子要马克

出0入0汤圆

发表于 2011-6-5 12:11:09 | 显示全部楼层
回复【32楼】sharpufo  风生水起月皎白
-----------------------------------------------------------------------

我觉得LCD_RAM的地址具体是多少,除了由地址线决定之外,还要看你选择的存储器数据长度,如果数据长度是8bit,那这个公式是可以的:
LCD_RAM= 0x6C000000 | (1<<n)

如果数据类型是16bit,那地址线中的1对应的是基址中的2byte,
公式应该是0x6c000000+2^n*2,这里n是对应的地址线编号,A0即n=0,A7即n=7;

例如用A0控制RS时,假设屏的数据线是16bit的,那么LCD_REG的地址是0x6c000000时,LCD_RAM的地址应该是0x6c000000+2,而不是+1,基址是以byte为单位的,一个16bit数据应该是2个byte。

当然,对于用A0做控制线来说就是有这个好处,只要结构体成员长度没弄错,直接就是连续的,LCD_RAM的地址到底是多少根本不用关心。

我也是刚看的,有错误请大家指正。

出0入0汤圆

发表于 2011-6-5 14:36:45 | 显示全部楼层
回复【60楼】leavic
回复【32楼】sharpufo  风生水起月皎白
-----------------------------------------------------------------------
我觉得lcd_ram的地址具体是多少,除了由地址线决定之外,还要看你选择的存储器数据长度,如果数据长度是8bit,那这个公式是可以的:
lcd_ram= 0x6c000000 | (1&lt;&lt;n)  
如果数据类型是16bit,那地址线中的1对应的是基址中的2byte,
公式应该是0x6c000000+2^n*2,这里n是对应的地址线编号,a0即n=0,a7即n=7;
例如用a0控制rs时,假设屏的数据线是16bit的,那么lcd_reg的地址是0x6c000000时,lcd_ram的地址应该是0x6c000000+2,而不是+1,基址是以byte为单位的,一个16bit数据应该是......
-----------------------------------------------------------------------

楼上解释了我的困苦哦
#define Bank1_LCD_D    ((uint32_t)0x60020000)    //disp Data ADDR
#define Bank1_LCD_C    ((uint32_t)0x60000000)  //disp Reg ADDR   

RS-->PD11   A16

16位总线 我一直认为是Bank1_LCD_D   地址应该是0x60010000而不是0x60020000,我想不通 原来 16位总线应该这么算地址0x6c000000+2^n*2

出0入0汤圆

发表于 2011-6-5 14:43:03 | 显示全部楼层
HADDR[27:26]位用于选择四个存储块之一:
表86  NOR/PSRAM存储块选择
HADDR[27:26]
(1)
  选择的存储块
00  存储块1 NOR/PSRAM 1
01  存储块1 NOR/PSRAM 2
10  存储块1 NOR/PSRAM 3
11  存储块1 NOR/PSRAM 4
(1) HADDR是需要转换到外部存储器的内部AHB地址线。
HADDR[25:0]包含外部存储器地址。HADDR是字节地址,而存储器访问不都是按字节访问,因
此接到存储器的地址线依存储器的数据宽度有所不同,如下表:
表87  外部存储器地址
数据宽度(1)
  连到存储器的地址线  最大访问存储器空间(位)
8位  HADDR[25:0]与FSMC_A[25:0]对应相连  64M字节 x 8 = 512 M位
16位  HADDR[25:1]与FSMC_A[24:0]对应相连,HADDR[0]未接  64M字节/2 x 16 = 512 M位
(1) 对于16位宽度的外部存储器,FSMC将在内部使用HADDR[25:1]产生外部存储器的地址FSMC_A[24:0]。不
论外部存储器的宽度是多少(16位或8位),FSMC_A[0]始终应该连到外部存储器的地址线A[0]。

出0入0汤圆

发表于 2011-6-5 14:50:03 | 显示全部楼层
那就是说如果我用的是16位数据宽度
A16---RS

那么RS=1  也即是A16=0  HADDR[17]=1  
所以地址是   
#define Bank1_LCD_D    ((uint32_t)0x60020000)    //disp Data ADDR

出0入0汤圆

发表于 2011-6-5 20:53:11 | 显示全部楼层
回复【63楼】stm32_boy  
-----------------------------------------------------------------------

其实我没看这段,这个写得有点晕,我就直接算的A16之前的A0~A15这16根地址线,能指示存储2^16个数据,而这2^16个数据,要占用2`16*2个字节,所以一直到A15能指示到的最后一个字节地址是0x6c000000+2^16*2-1(掐掉0这个开头),接下来的A16对应的地址就是0x6c000000+2^16*2了。

出0入0汤圆

发表于 2011-6-6 09:17:16 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-6-7 01:20:15 | 显示全部楼层
mark

出0入13汤圆

发表于 2011-6-7 09:02:00 | 显示全部楼层
学习学习,很实用的LCD控制

出0入0汤圆

发表于 2011-6-7 15:41:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-7 18:18:56 | 显示全部楼层
mark~留着以后学习~

出0入0汤圆

发表于 2011-6-11 18:44:32 | 显示全部楼层
寄存器地址由NEx确定,数据地址由RS确定。

出0入0汤圆

发表于 2011-6-13 21:57:27 | 显示全部楼层
回复【63楼】stm32_boy
那就是说如果我用的是16位数据宽度
a16---rs
那么rs=1  也即是a16=0  haddr[17]=1   
所以地址是   
#define bank1_lcd_d    ((uint32_t)0x60020000)    //disp data addr   

-----------------------------------------------------------------------

原来如此,我也困惑怎么不是0x60010000 呢,好贴!
不过我不太明白,RS就一个地址,那0x60020001 为什么就不能用?

出0入0汤圆

发表于 2011-6-13 22:18:32 | 显示全部楼层
MARK
感谢 风生水起月皎白!及众人的讨论

出0入0汤圆

发表于 2011-6-21 15:54:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-21 16:41:11 | 显示全部楼层
mark 多谢讲解

出0入0汤圆

发表于 2011-7-4 19:25:23 | 显示全部楼层
mark 等待高手跟帖解答问题

出0入0汤圆

发表于 2011-7-4 19:41:41 | 显示全部楼层
学习好贴。

出0入0汤圆

发表于 2011-7-4 21:19:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-5 16:17:05 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-7-24 09:38:25 | 显示全部楼层
MARK一下

出0入0汤圆

发表于 2011-8-13 22:49:27 | 显示全部楼层
马克芝。

出0入0汤圆

发表于 2011-8-14 13:05:09 | 显示全部楼层
讨论的太好了,学习到东西了

出0入0汤圆

发表于 2011-8-16 15:32:36 | 显示全部楼层
你们好。 请问一下。 我是在FPGA板子上开发 LCD 接在SRAM上。  方法和FSMC驱动LCD大体上一致。
LCD的型号是SPFD5408  开始的时候我是想读取LCD型号(刚开始还不知道型号多少),但是读取出来的值是1。不管读取几次 都是1
我就写了LCD_WriteReg()和LCD_ReadReg()。
你们觉得是什么原因呢~~  
跟RST管脚有关系吗?

出0入0汤圆

发表于 2011-8-16 19:57:39 | 显示全部楼层
回复【71楼】ppa2001  
-----------------------------------------------------------------------
这个肯定能用,如果外接的是一片存储器,数据总线是16位的,那么你用奇数地址去读取内存的时候,最低位直接被内部逻辑给无效,向下对齐,举个例子,定义一个short *p=(u16*)0xc0000001指针,你现在要读取这个地方上的一个word(2字节),直接肯定不会读取到,如果你0xc0000001这个地址不是强制转换过来的,编译后在32位CPU上会产生data abort,特别是用汇编语言编写的数据加载存储要注意,所以你会看到一些汇编写的程序里面定义变量前都会用对齐这个伪指令。这里你用了强制转换,所以编译器会给生成几句代码保证可以读取到,分3步:1,读取0xc0000000的2字节去掉0xc0000000的一个字节保留0xc0000001的一个字节;2,读取0xc0000002处的2字节去掉0xc0000003的一个字节保留0xc0000002的一个字节;3,把保留的两个字节拼在一起组成结果返回。可以看出这种不对齐的访问方式对内存的访问效率非常低,对齐方式一个读写周期就行,而拼的要3个,所以推荐写程序的时候要注意地址对齐,效率会高很多

出0入0汤圆

发表于 2011-8-17 09:52:40 | 显示全部楼层
回复【84楼】s200661524  
-----------------------------------------------------------------------

学习啊~~~

出0入0汤圆

发表于 2011-9-15 23:29:22 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-9-16 07:45:31 | 显示全部楼层
mark!!正准备做。。

出0入0汤圆

发表于 2011-9-25 10:05:46 | 显示全部楼层
帮助太给力了,非常满意!

出0入0汤圆

发表于 2011-10-4 20:00:57 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-10-4 23:29:08 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-10-20 19:31:18 | 显示全部楼层
这个必须得顶

出0入0汤圆

发表于 2011-10-21 17:15:50 | 显示全部楼层
回复【23楼】sgfwin
-----------------------------------------------------------------------

我的理解,FSMC是16位的数据宽度,访问第一个地址空间是地址为0x6C00,0000,访问第二地址空间时为0x6C00,0001,(对应的RS变成1了,A0与RS接再一起。)

出0入0汤圆

发表于 2011-10-21 17:23:21 | 显示全部楼层
回复【60楼】leavic
-----------------------------------------------------------------------

没错,是这个理。

出0入0汤圆

发表于 2011-11-8 00:23:25 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-28 09:29:05 | 显示全部楼层
正在学习FSMC

出0入0汤圆

发表于 2011-12-3 08:21:32 | 显示全部楼层
回复【32楼】sharpufo  来生缘
-----------------------------------------------------------------------

谢谢了,解释的太好了!

出0入0汤圆

发表于 2011-12-12 17:30:22 | 显示全部楼层
超级MARK

出0入0汤圆

发表于 2011-12-24 09:15:11 | 显示全部楼层
mark again

出0入0汤圆

发表于 2011-12-25 15:30:50 | 显示全部楼层
好贴

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-9-27 06:33

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

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