【问题解决】关于STM32的FSMC模拟8080串口驱动TFT液晶显示屏的数据位/命令位(RS)控制接口的说明

画板子时出了些错误,导致 TFT RS 没有接在 FSMC Ax 接口上,第一次没有接在 FSMC Ax 端口,于是为解决这和问题,进行了验证。

目录

问题

解决


问题

关于STM32和TFT的连接线序说明:

TFT端口STM32端口
D0 ~ D15FSMC D0 ~ D15
CSFSMC NE4
RDFSMC NOE
WRFSMC 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 端口的说法就且仔细分辨吧!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值