画板子时出了些错误,导致 TFT RS 没有接在 FSMC Ax 接口上,第一次没有接在 FSMC Ax 端口,于是为解决这和问题,进行了验证。
目录
问题
关于STM32和TFT的连接线序说明:
TFT端口 | STM32端口 |
---|---|
D0 ~ D15 | FSMC D0 ~ D15 |
CS | FSMC NE4 |
RD | FSMC NOE |
WR | FSMC NWE |
RS(数据/地址选择) | 普通I/O口 |
RST | 普通I/O口 |
BG | 普通I/O口 |
这样造就了一个问题,参考野火和正点原子的代码以及教程后,发现他们的共同特点就是将RS位连接到某一个FSMC地址端口上。这样对于写寄存器和写数据来说只要给FSMC不同的地址,就可使得RS被FSMC的地址位置高或者置低了。
但是!!!我TM没接到地址端口上。
这就导致一个问题,基本上网上的例程、开发板、小系统板子之类的都接在了 FSMC Ax 的端口上,我严重怀疑我的板子是否能够正常工作。
本着不抛弃不放弃的想法,试了一下解决了这个问题。
解决
以将 RS 端口接在 FSMC A16 为例子
代码来自野火《STM32开发实战指南》修改而来
#define FSMC_ADDR ( ( uint32_t ) 0x6C020000 ) //LCD命令操作地址
#define FSMC_DATA ( ( uint32_t ) 0x6C000000 ) //LCD数据操作地址
/*写寄存器函数*/
void LCD_WriteCMD( uint16_t CMD)
{
* (__IO uint16_t * ) (FSMC_ADDR) = CMD;
}
/*写数据函数*/
void LCD_WriteCMD( uint16_t DATA)
{
* (__IO uint16_t * ) (FSMC_DATA) = DATA;
}
接在普通I/O口时函数修改:
对于RS位的STM32接口来说,设置为推挽输出即可。
#define FSMC_ADDR ( ( uint32_t ) 0x6C000000 ) //LCD操作地址
/*写寄存器函数*/
void LCD_WriteCMD( uint16_t CMD)
{
GPIO_ResetBits(LCD_RS_PORT, LCD_RS_PIN); //将RS位置低表示命令
* (__IO uint16_t * ) (FSMC_ADDR) = CMD;
}
/*写数据函数*/
void LCD_WriteCMD( uint16_t DATA)
{
GPIO_SetBits(LCD_RS_PORT, LCD_RS_PIN); //将RS位置高表示数据
* (__IO uint16_t * ) (FSMC_DATA) = DATA;
}
其代码中还有其他地方有直接通过地址写的时候,直接在前面加上对RS位的操作即可。
例如:
* (__IO uint16_t * ) (FSMC_DATA) = DATA;
修改时地址 FSMC_DATA、FSMC_ADDR之类的地址宏定义不是必须修改(可以不改)的,只需要在前面加上一句置位 RS 端口的操作。
/*下面两行中选择一行进行设置*/
GPIO_ResetBits(LCD_RS_PORT, LCD_RS_PIN); //将RS位置低表示命令
GPIO_SetBits(LCD_RS_PORT, LCD_RS_PIN); //将RS位置高表示数据
* (__IO uint16_t * ) (FSMC_DATA) = DATA;
经过实际验证,该方法可行,稳定性暂未做出验证。
但是网上有很多人所说的什么 RS 一定要接地址位啊、不能接到普通 GPIO 端口的说法就且仔细分辨吧!