请问一下STM32F407在用FSMC液晶显示的时候,程序下载后LCD不显示,但是在调试模式的时候可以正常显示,LCD为ILI9486。
这个问题可能由以下几种原因造成:
在使用FSMC控制LCD时,因为时序关系比较复杂,可能由于时序设置不正确导致数据无法正常显示在屏幕上。建议根据LCD datasheet中提供的时序参数来设置FSMC时序参数,确保FSMC在读写LCD时序时与LCD保持一致。
ILI9486 LCD有两个电源引脚,其中一个是电源引脚,另一个是控制显示器背光的引脚。可能由于AC/DC接口电容未正确配置或者电源电压设置不正确导致背光未亮。建议检查AC/DC接口电容是否正确配置、电源电压是否稳定。
因为LCD连接较为复杂,可能由于某个引脚连接不正确导致FSMC无法与LCD进行正常的数据传输。建议检查各个控制信号与对应引脚是否正确连接。
还有可能是驱动程序存在问题导致LCD无法正常显示。建议检查驱动程序是否正确编写,并且在下载程序后检查芯片内存与实际代码是否一致。
综上所述,需要结合芯片手册和LCD datasheet中提供的参数以及实际情况来进行排查。可以逐步排除各种可能性,最终找到问题所在并进行相应的修复。
根据外设存储器的位宽分为8Bit和16Bit驱动
STM32内部存储单位为一个字节,也就是一个地址存储一个字节大小的数据,当外部存储器的位宽为8位时,写入一个数据需要一个字节即地址加1,当外部存储器的位宽为16位时,写入一个数据需要两个字节即地址加2,如下图所示:
外设存储器位宽8位:写入0x11 和 0x22
地址 | 内存 |
---|---|
0x6000 0000 | 0x11 |
0x6000 0001 | 0x22 |
外设存储器位宽16位:写入0x1122 和 0x3344
地址 | 内存 |
---|---|
0x6000 0000 | 0x11 |
0x6000 0001 | 0x22 |
0x6000 0002 | 0x33 |
0x6000 0003 | 0x44 |
写16位数据地址变化 | HADDR[25:0] |
---|---|
0x00 | 0000 0000 |
0x02 | 0000 0010 |
0x04 | 0000 0100 |
0x06 | 0000 0110 |
由于内存地址映射都是偶地址开始,当外设存储器的位宽为16位时,每次写数据时地址加2,相当于所有的地址为2的倍数,即写16位数据时地址位右移1位。FSMC将使用内部的HADDR[25:1]地址来作为对外部存储器的寻址地址FSMC_A[24:0]。
当FSMC模拟80并口时序驱动LCD外设时,以A6为例,作为LCD_RS信号控制线,A6输出0写命令,A6输出1写数据。当外设是8位位宽时,FSMC以HADDR[25:0] (映射FSMC_A[25:0])对外寻址,只要HADDR[25:0]的Bit6为0写命令,为1写数据。当外设是16位位宽时,FSMC以HADDR[25:1](映射FSMC_A[24:0])对外寻址,相当于整个地址右移一位,原来的Bit6输出实则是FSMC_A5输出,要让A6输出需要设置Bit7输出。如下所示:
外设为8位:Bit6->0100 0000->0x40
写命令->A6输出0 地址0x6000 0000用HADDR[25:0]表示,FSMC_A6为0
写数据->A6输出1 地址(0x6000 0000|0x40)用HADDR[25:0]表示,FSMC_A6为1
外设为16位:Bit6->0100 0000->0x40 Bit7->1000 0000->0x80
写命令->A6输出0 地址0x6000 0000用HADDR[25:1]表示即右移1位写入FSMC_A[24:0],FSMC_A6仍为0
写数据->A6输出1 地址(0x6000 0000|0x40)用HADDR[25:1]表示即右移1位写入FSMC_A[24:0],FSMC_A6变为0, FSMC_A5变为1,要使FSMC_A6输出1,地址需或上Bit7即地址(0x6000 0000|0x80)
LCD存储地址表示
LCD存储地址表示方式有两种,宏定义表示和结构体表示,结构体表示跟结构体成员所占空间大小有关。
FSMC_A6为LCD_RS信号控制线,控制命令和数据的读写,2^6=0x40,2^7=0x80,