管理员
  
- 积分
- 165371
- 金钱
- 165371
- 注册时间
- 2010-12-1
- 在线时间
- 2110 小时
|
发表于 2022-11-16 00:31:45
|
显示全部楼层
- /* LCD_BASE的详细解算方法:
- * 我们一般使用FSMC的块1(BANK1)来驱动TFTLCD液晶屏(MCU屏), 块1地址范围总大小为256MB,均分成4块:
- * 存储块1(FSMC_NE1)地址范围: 0X6000 0000 ~ 0X63FF FFFF
- * 存储块2(FSMC_NE2)地址范围: 0X6400 0000 ~ 0X67FF FFFF
- * 存储块3(FSMC_NE3)地址范围: 0X6800 0000 ~ 0X6BFF FFFF
- * 存储块4(FSMC_NE4)地址范围: 0X6C00 0000 ~ 0X6FFF FFFF
- *
- * 我们需要根据硬件连接方式选择合适的片选(连接LCD_CS)和地址线(连接LCD_RS)
- * 战舰F103开发板使用FSMC_NE4连接LCD_CS, FSMC_A10连接LCD_RS ,16位数据线,计算方法如下:
- * 首先FSMC_NE4的基地址为: 0X6C00 0000; NEx的基址为(x=1/2/3/4): 0X6000 0000 + (0X400 0000 * (x - 1))
- * FSMC_A10对应地址值: 2^10 * 2 = 0X800; FSMC_Ay对应的地址为(y = 0 ~ 25): 2^y * 2
- *
- * LCD->LCD_REG,对应LCD_RS = 0(LCD寄存器); LCD->LCD_RAM,对应LCD_RS = 1(LCD数据)
- * 则 LCD->LCD_RAM的地址为: 0X6C00 0000 + 2^10 * 2 = 0X6C00 0800
- * LCD->LCD_REG的地址可以为 LCD->LCD_RAM之外的任意地址.
- * 由于我们使用结构体管理LCD_REG 和 LCD_RAM(REG在前,RAM在后,均为16位数据宽度)
- * 因此 结构体的基地址(LCD_BASE) = LCD_RAM - 2 = 0X6C00 0800 -2
- *
- * 更加通用的计算公式为((片选脚FSMC_NEx)x=1/2/3/4, (RS接地址线FSMC_Ay)y=0~25):
- * LCD_BASE = (0X6000 0000 + (0X400 0000 * (x - 1))) | (2^y * 2 -2)
- * 等效于(使用移位操作)
- * LCD_BASE = (0X6000 0000 + (0X400 0000 * (x - 1))) | ((1 << y) * 2 -2)
- */
- #define LCD_BASE (uint32_t)((0X60000000 + (0X4000000 * (LCD_FSMC_NEX - 1))) | (((1 << LCD_FSMC_AX) * 2) -2))
- #define LCD ((LCD_TypeDef *) LCD_BASE)
复制代码 |
|