新手上路
- 积分
- 38
- 金钱
- 38
- 注册时间
- 2012-3-20
- 在线时间
- 7 小时
|
本帖最后由 黑洞yyh 于 2022-1-7 12:28 编辑
一张图就可以完美展示了,忽略图中的高低字节名称,,只要知道结构体中每个成员是2个字节就行
历程中的代码如下
- //LCD地址结构体
- typedef struct
- {
- vu16 LCD_REG;
- vu16 LCD_RAM;
- } LCD_TypeDef;
- //使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A10作为数据命令区分线
- //注意设置时STM32内部会右移一位对其!
- #define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))
- #define LCD ((LCD_TypeDef *) LCD_BASE)
复制代码 1--由于16位模式下,地址要往右移一位来做对齐,因此就有了如下图
这里初学者容易被迷惑的是,地址和数据这两个概念,,这里重点在于地址,
历程中是 define LCD ((LCD_TypeDef *) LCD_BASE) 这个代码
让结构体在内存中的地址指向了0x6c0007FE
如上图所示
又由于内存中的地址是每隔一个字节,地址递增1,
而结构体中,第一个成员的地址就等于结构体的地址,因此LCD_REG的地址就是0x6c0007FE
,结构体每个成员被声明为2个字节,所以第一个成员往下两个字节就是第二个成员的地址,
也就是0x6c0007FE +2 = 0x6C000800
当往地址0x6c0007FE 写入东西的时候,A10位是0,所以芯片会认为是在写命令,而往这个地址写入东西,就是往LCD_REG写入东西,因此程序中直接就操作结构体成员变量LCD_REG来做命令写入操作
当往地址0x6c000800 写入东西的时候,A10位是1,所以芯片会认为是在写数据,而往这个地址写入东西,就是往LCD_RAM写入东西,因此程序中直接就操作结构体成员变量LCD_RAM来做数据写入操作
至于A10位的值怎么算的,这个看下原子哥的视频就明白了。右移了一位导致的,很容易理解。
|
|