//LCD地址结构体 typedef struct { vu16 LCD_REG; vu16 LCD_RAM; } LCD_TypeDef; //使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A10作为数据命令区分线 //注意设置时STM32内部会右移一位对其! #defineLCD_BASE ((u32)(0x6C000000 | 0x000007FE))
#defineLCD ((LCD_TypeDef *)LCD_BASE)
LCD_BASE,须根据外部电路的连接来确定,如Bank1.sector4就是从地址0X6C000000开 始,而0X000007FE,则是A10的偏移量。以A10为例,7FE换成二进制为:1111111 1110 ,而16位数据时,地址右移一位对齐,对应到地址引脚,就是:A10:A0=0111111 1111, 此时A10是0,但是如果16位地址再加1(对应到8位地址是加2,即7FE+0X02),那么: A10:A0=1000000 0000,此时A10就是1了,即实现了对RS的0和1的控制
LCD_TypeDef结构体地址,那么可以得到LCD->LCD_REG的 地址就是0X6C00,07FE,对应A10的状态为0(即RS=0),而LCD->LCD_RAM的地址就是 0X6C00,0800(结构体地址自增),对应A10的状态为1(即RS=1),从而实现对RS的控
制。
//写寄存器函数 //regval:寄存器值 void LCD_WR_REG(u16 regval) { LCD->LCD_REG=regval;//写入要写的寄存器序号 } //写LCD数据 //data:要写入的值 void LCD_WR_DATA(u16 data) { LCD->LCD_RAM=data;
}
不理解的地方、 一、A10与LCD_RAM和LCD_REG的关系、。上面写着、LCD->LCD_REG的地址对应A10为0、、16位对齐时、 要向右移一位、如果是0x000007FE>>1后再和0x6C000000 | 结果就是 6C0003FF、、但和A10是什么关系呢? 16位地址加1时 是0X00000800,再与0x6C000000 | 结果就是 6C000800 与A10又是什么关系呢? 没有一个正确的说明。让人难以理解
二、FSMC_D0到FSMC_D15 与 LCD->LCD_RAM 是什么关系呢、 LCD->LCD_RAM=data;说是写入数据、、 是不是。把data数据赋值给 LCD->LCD_RAM 这个寄存器地址时,A10为1,,然后寄存器地址上的值映射到FSMC_D0-FSMC_D15上??
初学STM32、、竟然卡在这里了、、
|