文章目录[隐藏]
液晶屏显示基础
液晶屏有内嵌MCU屏和RGB屏,RGB屏要求较高 需要单片机直接控制。
其中 正点原子的4.3寸屏幕使用的液晶驱动模块是NT35510.这个芯片有多种驱动方式,比如8080并口 SPI,其中8080因为是并口所以速度较快,因此如果引脚足够的话一般使用8080驱动液晶屏.
因为STM32中只有对应SPI、IIC、CAN的通讯接口,而没有8080的通讯接口
所以stm32使用8080协议通讯方式有两种
- 使用普通IO口模拟8080时序(速率较慢且繁琐)
- 使用FSMC的NOR FLASH 模式
(因为
1、NOR FLASH的时序与8080类似
2、液晶显示屏在某种意义上也是一种存储器,只不过它会把存储器内的数据以RGB三原色的形式显示出来)
一般来说都是选择FSMC中的NOR FLASH模式
FSMC信号名称 功能
CLK 时钟
A[25:0] 地址总线(可以找出一个当作8080的D/Cx 低电平命令 高电平数据)
D[15:0] 双向数据总线
NE[x] 片选线(也就是说可以控制4个SRAM)(当作8080的片选线CSx)
NOE 输出使能(当作RDX 也就是8080读使能)
NWE 写使能(当作WRX 写使能)
NWAIT NOR 闪存要求FSMC等待的信号
NADV 地址、数据线复用时用作锁存信号
地址转换
拓展存储器大小
STM32f103中的拓展存储器有四个块,其中每个块又能分为四个存储区(也就是一个块可以连接4个存储器)
实际在STM32芯片内部没有这些存储空间,只是提供了映像来访问外部的存储器
需要注意的是 外部存储器在STM32外部的地址与STM32内部的地址不同。
也就是说,当访问0x6000 0000的地址时,是访问块1的存储区1[NE0被拉低]的第一个字节(对应的地址线A[25:0]对应的值是0)
当访问0x6400 0000的地址时,是访问块1的存储区2[NE1被拉低]的第一个字节(对应的地址线A[25:0]对应的值也是0)
可以注意到
当数据宽度为16为时,HADDR右移一位后与FSMC地址线A相连。
所以如果定义写地址和读地址,那么如果一个是0x6000 0000 那么下一个其实是0x6000 0002(其实也就类似于一次写入或者读出了2个字节)
操作外部存储器步骤
1、初始化外部存储器的对应区域(比如初始化块1存储区0)
- 定义一个变量的地址在0x6000 0000 到0x9FFF FFFF中,( 使用__attribute__((at(地址))) 或者直接强制转化为指针)
- 写这个变量时,NWE和NE[x](这里的x需要看地址位置)会被拉低
也就是说当初始化完成后,只用直接赋值对应的变量或者读取对应的变量那么单片机就会按照对应的时序进行数据传输。
液晶屏点亮实验
CubeMX配置
其中的NE4和A10是通过原理图的引脚得知, Data为16是因为使用的是8080并口,16位双向数据IO。
根据系统时钟72Mhz得到一个HCLK为14ns(向上去整)然后根据液晶屏的8080时序图进行计算,并填入cubeMX中(这里的Bus turn around 无意义 因为地址线和数据线没有复用)
过程中发生的问题以及解决方案
- 屏幕花屏(复位后的图像相同)
设置初始化坐标,进行清屏操作
2、屏幕花屏(复位后的图像不同)
设置在初始化工作后设置延时(这个很重要)
3、初始化成功,但是无法读取ID或者设置光标失败(就是有一些指令失败)
原因是忘记keil5忘记关闭优化了,关闭之后显示正常
版权声明:本文为CSDN博主「sky_ldh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sky_ldh/article/details/120577213
暂无评论