野火书籍《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位当中,因此不需要左移。