OpenEdv-开源电子网

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

FSMC驱动LCD章节,lcd结构体的赋值问题

[复制链接]

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2022-10-7
在线时间
7 小时
发表于 2022-11-15 17:26:34 | 显示全部楼层 |阅读模式
1金钱
这个值((u32)(0x6C000000 | 0x0000007E))赋值给结构体的 vu16 LCD_REG;  但下一个成员vu16 LCD_RAM自自增1为什么是上面说的7E+0X02呢

十六位地址加1等于八位地址加2.png
赋值图.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-11-16 00:31:45 | 显示全部楼层
  1. /* LCD_BASE的详细解算方法:
  2. * 我们一般使用FSMC的块1(BANK1)来驱动TFTLCD液晶屏(MCU屏), 块1地址范围总大小为256MB,均分成4块:
  3. * 存储块1(FSMC_NE1)地址范围: 0X6000 0000 ~ 0X63FF FFFF
  4. * 存储块2(FSMC_NE2)地址范围: 0X6400 0000 ~ 0X67FF FFFF
  5. * 存储块3(FSMC_NE3)地址范围: 0X6800 0000 ~ 0X6BFF FFFF
  6. * 存储块4(FSMC_NE4)地址范围: 0X6C00 0000 ~ 0X6FFF FFFF
  7. *
  8. * 我们需要根据硬件连接方式选择合适的片选(连接LCD_CS)和地址线(连接LCD_RS)
  9. * 战舰F103开发板使用FSMC_NE4连接LCD_CS, FSMC_A10连接LCD_RS ,16位数据线,计算方法如下:
  10. * 首先FSMC_NE4的基地址为: 0X6C00 0000;     NEx的基址为(x=1/2/3/4): 0X6000 0000 + (0X400 0000 * (x - 1))
  11. * FSMC_A10对应地址值: 2^10 * 2 = 0X800;    FSMC_Ay对应的地址为(y = 0 ~ 25): 2^y * 2
  12. *
  13. * LCD->LCD_REG,对应LCD_RS = 0(LCD寄存器); LCD->LCD_RAM,对应LCD_RS = 1(LCD数据)
  14. * 则 LCD->LCD_RAM的地址为:  0X6C00 0000 + 2^10 * 2 = 0X6C00 0800
  15. *    LCD->LCD_REG的地址可以为 LCD->LCD_RAM之外的任意地址.
  16. * 由于我们使用结构体管理LCD_REG 和 LCD_RAM(REG在前,RAM在后,均为16位数据宽度)
  17. * 因此 结构体的基地址(LCD_BASE) = LCD_RAM - 2 = 0X6C00 0800 -2
  18. *
  19. * 更加通用的计算公式为((片选脚FSMC_NEx)x=1/2/3/4, (RS接地址线FSMC_Ay)y=0~25):
  20. *          LCD_BASE = (0X6000 0000 + (0X400 0000 * (x - 1))) | (2^y * 2 -2)
  21. *          等效于(使用移位操作)
  22. *          LCD_BASE = (0X6000 0000 + (0X400 0000 * (x - 1))) | ((1 << y) * 2 -2)
  23. */
  24. #define LCD_BASE        (uint32_t)((0X60000000 + (0X4000000 * (LCD_FSMC_NEX - 1))) | (((1 << LCD_FSMC_AX) * 2) -2))
  25. #define LCD             ((LCD_TypeDef *) LCD_BASE)
复制代码
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-11-16 00:32:10 | 显示全部楼层
参考下这个
回复

使用道具 举报

13

主题

250

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2248
金钱
2248
注册时间
2019-8-7
在线时间
364 小时
发表于 2022-11-16 09:22:10 | 显示全部楼层
因为它为了字节对齐 最后一位是没用的 从倒数第二位开始
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2022-10-7
在线时间
7 小时
 楼主| 发表于 2022-11-22 16:14:26 | 显示全部楼层

这个原理我下去看了,看懂了,只是那句话“ 如果 16 位地址再加 1(注意:对应到 8 位地址是加 2,即 7E+0X02)“ 不明白, 还有就是您回答的跟帖里面,为什么哪儿是任意地址都可以呢(图中我有标记),我学的STM32407探索者,按照我的理解,A10高低电平会代表数据和指令,任意地址不就又包含了A10为0或为1吗?


为什么可以是任意地址呢

为什么可以是任意地址呢
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2022-10-7
在线时间
7 小时
 楼主| 发表于 2022-11-22 16:19:12 | 显示全部楼层

这里的结构体自增,LCD_BASE 赋值为((u32)(0x6C000000 | 0x0000007E)) ,那么vu16 LCD_REG 也为((u32)(0x6C000000 | 0x0000007E)),后面vu16 LCD_RAM自增为什么16 位地址再加 1(注意:对应到 8 位地址是加 2,即 7E+0X02) ,即0x6C000081

赋值图.png
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-11-22 23:04:30 | 显示全部楼层
老乐1985 发表于 2022-11-22 16:14
这个原理我下去看了,看懂了,只是那句话“ 如果 16 位地址再加 1(注意:对应到 8 位地址是加 2,即 7E+ ...

是LCD_RAM之外的任意地址。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-11-22 23:04:59 | 显示全部楼层
老乐1985 发表于 2022-11-22 16:19
这里的结构体自增,LCD_BASE 赋值为((u32)(0x6C000000 | 0x0000007E)) ,那么vu16 LCD_REG 也为((u32)(0x ...

7E+2=80了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 23:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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