一、LCD地址结构体
typedef struct
{
u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A6作为数据命令区分线
//注意设置时STM32内部会右移一位对其! 111 1110=0X7E
#define LCD_BASE ((u32)(0x6C000000 | 0x0000007E))
#define LCD ((LCD_TypeDef *) LCD_BASE)
1、LCD为指针强制类型转换,指向NE4(Bank1第四区)A6。
2、为什么会右移一位?
因为当Bank1
接的是16
位宽度存储器的时候:HADDR[25:1]-->FSMC[24:0]。
当 Bank1
接的是 8位宽度存储器的时候:
HADDR[25:0]-->FSMC[25:0]。
而不论外部接8 位/16位宽设备, FSMC_A[0]永远接在外部设备地址A[0]。这里, TFTLCD使用的是16 位数据宽度,所以HADDR[0]并没有用到,只有HADDR[25:1]是有效的,对应关系变为:HADDR[25:1]--> FSMC[24:0],相当于右移了一位。另外,HADDR[27:26]的设置,是不需要我们干预的,初始化的时候可以选择区。
3、为什么是7E?
7E转换成二进制就是:
1111110,而16
位数据时,地址右移一位对齐,那么实际对应到地址引脚的时候,就是:A6:A0=0111111,此时A6
是 0,但是如果
16 位地址再加1(注意:对应到
8位地址是加 2,即7E+0X02),那么:
A6:A0=1000000,此时
A6 就是 1了,即实现了对
RS 的 0
和1 的控制。 还有一个简单的方法就是,当选A6时将第七位和最后一位置0,为01111110=0X7E 8 位地址是加 2为1000000,就可以实现A6对RS的控制了,例如我操作NE1、A10那么地址就为(u32)(0x60000000
| 0x000007FE),其中7FE=011111111110。
注:1、HADDR是需要转换到外部存储器的内部AHB地址线。
来源:CSDN
作者:一只小白啊
链接:https://blog.csdn.net/qq_30993593/article/details/79185415