野火书籍《STM32库开发指南》 第26章LCD代码勘误

 第26章LCD代码,P303代码写错。

原来的代码写错,因为是D/CX引脚,高电平(1)意味着数据,低电平(0)意味着命令:

#define FSMC_Addr_ILI9341_CMD     ((uint32_t)) 0x60020000
#define FSMC_Addr_ILI9341_DATA     ((uint32_t)) 0x60000000

因此应该将两个宏定义对换。

正确的为:

#define FSMC_Addr_ILI9341_CMD     ((uint32_t)) 0x60000000
#define FSMC_Addr_ILI9341_DATA     ((uint32_t)) 0x60020000

 

另外,我不明白为什么地址中0x60000000中的那个6不需要左移。

地址格式有两种, HADDR总线格式和 FSMC_A  总线地址格式。

书中讲解的是 STM32 是通过  HADDR总线来访问 FSMC 的,代码中表示的是 FSMC_A  总线地址格式的地址。

若要访问数据,

那就是要访问 FSMC_A 的地址格式的 0x6000000+2<<(16) = 0x60010000,

也就是访问HADDR总线格式的(0x6000000+2<<(16) )<1 = 0xC0020000,也就是整体左移1位(包括6)

但是书中公式为 0x6000000+2<<(16+1) = 0x60020000,只有指定的第16位左移了。

一个解释是:0xFFFF FFFF 这样的地址总共有32位,而具体的偏移的地址只有[0:25]/[1:25](26位),高位的[25:31](6位)不受影响。

此时的0x60000000中的6位于高6位当中,因此不需要左移。

posted @ 2023-04-03 12:33  FBshark  阅读(49)  评论(0编辑  收藏  举报