历史上的今天
返回首页

历史上的今天

今天是:2024年12月30日(星期一)

正在发生

2020年12月30日 | STM32驱动LCD实战

2020-12-30 来源:eefocus

01 驱动时序

我们通常说的MCU-LCD接口,就是8080接口,8080接口的详细介绍请看《STM32驱动LCD原理》。


下面是LMT028DN给出的8080模式总线时序

下面是总线时序中的参数

时序参数

  • Tast->地址设置时间

  • Taht->地址保持时间(写)

  • Tchw->芯片选择高脉冲宽度

  • Tcs->芯片选择设置时间(写)

  • Tcsf->芯片选择等待时间(写)

  • Twc->写入周期

  • Twrh->控制脉冲高电平时间

  • Twrl->控制脉冲低电平时间

  • Tdst->数据设置时间

  • Tdht->数据保持时间

根据FSMC的配置和时序图,我们需要的3个时序参数是

 

3个重要参数

1、地址建立时间:5ns

2、地址保持时间:13ns

3、数据建立时间:13ns

 

以上数据均是满足时序图的最小时间,实际应用中,不能设置成最小值,也不能大于最大值(如果有的话),以实际应用为主,如果设置时间太快,反而不稳定。

因为我们把LCD使用8080接口驱动SRAM的方式,所以可以选择FSMC的模式1和模式A,但是/RD的切换,也就是FSMC的NOE的切换,所以只能选择模式A,观察时序图,读写时序一致,所以可以选择读写一致的配置。


02 FSMC外设配置

FSMC外设配置代码,具体FSMC外设解析请看《STM32的FSMC外设简介》


readWriteTiming.FSMC_AddressSetupTime = 0x02;   //地址建立时间(ADDSET)为2个HCLK 2*1/120M=16ns

readWriteTiming.FSMC_AddressHoldTime = 0x02;   //地址保持时间(ADDHLD),16ns  

readWriteTiming.FSMC_DataSetupTime = 0x06;     //数据建立时间,50ns

readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;//总线恢复时间

readWriteTiming.FSMC_CLKDivision = 0x00;// 时钟分频因子 

readWriteTiming.FSMC_DataLatency = 0x00;//数据产生时间

readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;   //模式A

 

FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;//  这里我们使用NE1 ,也就对应BTCR[6],[7]。

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;// 不复用数据地址

FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; 

FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;//存储器数据宽度为8bit   

FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; 

FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;  

FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;

FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;

FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;

FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;//  存储器写使能

FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;

FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;// 读写使用相同的时序

FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;

FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;//读写时序

FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;//写时序

读写接口代码:


结构体定义,这里利用了结构体地址递增特性


typedef struct

{

  uint8_t LCD_CMD;//用于LCD命令操作

  uint8_t LCD_DATA;//用于LCD数据操作

} LCD_TypeDef;

#define LCD_BASE        ((uint32_t)(0x60000000 | 0x0000FFFF))

#define LCD             ((LCD_TypeDef *) LCD_BAS

读写接口


void LMT028_Write_Cmd ( uint8_t usCmd )

{

  LCD->LCD_CMD=usCmd;  

}

void LMT028_Write_Data ( uint8_t usData )

{

  LCD->LCD_DATA = usData;

}

也可以简单明了的如下写法


#define      FSMC_Addr_LMT028_CMD         ( ( uint32_t ) 0x60000000 )      

#define      FSMC_Addr_LMT028_DATA        ( ( uint32_t ) 0x60010000 )

 

void LMT028_Write_Cmd ( uint8_t usCmd )

{

 *( (uint32_t  * )FSMC_Addr_LMT028_CMD)=usCmd;  

}

void LMT028_Write_Data ( uint8_t usData )

{

  *( (uint32_t  * )FSMC_Addr_LMT028_DATA) = usData;

}


03 背光驱动

LED背光驱动,根据高电平的占空比决定的,共有32个亮度等级,使用PWM驱动最为合适,通过调节占空比,调节亮度。

 

04 复位驱动

复位脚大于10ms的低电平,然后最大170ms的高电平

05 寄存器配置

寄存器配置还是要先参考厂家给的示例demo,根据LMT028手册进行修改,LMT028手册只有重要的寄存器说明,详细的寄存器说明需要参考ST7789手册。

推荐阅读

史海拾趣

Doodle Labs公司的发展小趣事

Doodle Labs公司成立于2010年代初,由一群热衷于无线通信和物联网技术的工程师创立。在成立之初,公司就明确了自己的定位:专注于开发高性能、智能化的无线电技术产品,以满足日益增长的无人机和物联网设备的需求。通过不断的技术研发和创新,Doodle Labs成功推出了其首款智能无线电产品,为无人机提供了稳定、高效的通信解决方案。

ENERGIZER公司的发展小趣事

ENERGIZER在电池技术的研发上一直处于行业领先地位。1957年,公司成功研制出首粒碱性电池,这一创新性的产品迅速占领了市场,成为了当时最受欢迎的电池产品之一。随后,ENERGIZER又相继推出了纽扣电池、测电带电池等一系列创新产品,不断满足消费者对电池的多样化需求。这些创新性的产品的研发和推广,进一步巩固了ENERGIZER在全球电池市场的领先地位。

Electro-Term/Hollingsworth公司的发展小趣事

Hollingsworth公司一直以来都坚持品质至上的原则。公司投入大量资源用于产品质量控制和检测,确保每一件产品都符合最高标准。这种对品质的坚持不仅赢得了客户的信任,也帮助公司在市场上建立了良好的口碑。随着时间的推移,Hollingsworth的品牌价值不断提升,成为电子行业中的佼佼者。

ARMKEIL Microcontroller Tools公司的发展小趣事

2005年,对于Keil公司来说是一个具有里程碑意义的年份。在这一年,英国的ARM公司看中了Keil在嵌入式系统开发工具领域的领先地位和技术实力,决定对其进行收购。收购完成后,Keil公司正式成为ARM公司的一部分,继续专注于嵌入式系统开发工具的研发和销售。这一事件标志着Keil公司进入了一个新的发展阶段,也为其未来的发展奠定了坚实的基础。

Frequency Electronics Inc公司的发展小趣事

高频电子在精确时间和频率生成技术方面一直处于世界领先地位。公司不断投入研发,推出了一系列高精度、高性能的定时和频率控制产品,如铷蒸气原子振荡器、温度稳定的石英晶体振荡器等。这些产品被广泛应用于商业、政府、军事等多个领域,包括卫星通信、指挥控制系统、电子战系统等。高频电子的技术创新不仅提升了自身竞争力,还推动了整个行业的发展。

CAO Group Inc公司的发展小趣事

自创立以来,CAO Group一直致力于牙科材料和器械的研发。公司不断投入研发资源,成功推出多款具有创新性的牙科产品,如Lumist美白贴、SPRAY BOTTLE HEAD喷雾瓶头等,这些产品不仅在国内市场获得了广泛认可,还成功打入了国际市场。公司的研发实力和产品品质,使其在牙科行业中树立了良好的口碑。

问答坊 | AI 解惑

《Keil –C51 编译器用户手册 中文完整版》403页

《Keil –C51 编译器用户手册 中文完整版》403页 非常有用!!…

查看全部问答>

GSM相关的词汇中英对照

数字、英文 1/4比特数 quarter bit number AGC恢复时间 AGC recovery time AGC启动时间 AGC attack time ATM技术 asynchronous transfer technics, 异步转移模式,为多种速率信 息的情况下研究的一种合适的传输与交换方式。 GSM 泛欧数字蜂窝 ...…

查看全部问答>

常见汇编指令集

常见汇编指令集 …

查看全部问答>

如何在ATMAGE16L上写些测试程序

        第一次接触到单片机这块,前几天老师给了我一块带ATMAGE16L的开发板,上面只有一个JTAG接口,一个flash存储块,还有一个8兆的晶振元件(上面标有8.000,我对硬件不熟悉,不知道是不是这么称呼),要求我用8兆的晶振 ...…

查看全部问答>

哪里有CE 6.0 R2下载?

请问哪里有 Windows Embedded CE 6.0 R2 下载?MS网站上不能下.msi,.cab文件 …

查看全部问答>

纯C语言的程序,为什么使用 SHLoadImageFile 函数编译后执行就提示“不是有效的 Windows CE 应用程序”?

我的WinCE程序是纯 C 语言的Win32的程序(源文件的扩展名都是.c的),不使用 SHLoadImageFile 函数,程序能执行。为什么使用 SHLoadImageFile 函数编译后执行就提示“不是有效的 Windows CE 应用程序”?…

查看全部问答>

串口助手发送数据通过单片机控制l ed屏显示?

目的是 用vb通过单片机控制led屏。现在先用串口助手试下。我想用串口助手先发一个数过去,点亮led屏的一个小灯,在依次累加。led屏是用74hc595串起来的。其间也想把单片机接收的数据回显到串口助手来证明接受无误。以前直接烧程序控制屏时点亮第一 ...…

查看全部问答>

构造函数,构造函数,构造函数,构造函数,构造函数,构造函数

evc4开发环境 我自己写了一个类。 CRulers::CRulers() {         CRect rect;         GetClientRect(rect);         m_X = 20;         m_DownY =(m_rec ...…

查看全部问答>

CCS编译错误error:symbol referencing errors-`f14.out` not built

如题目。我编译的时候只有这一个错误,请问谁能帮我指点一下到底错在哪里了??…

查看全部问答>

S3C6410 IIC驱动问题

s3c6410_iic.dll 文件可以被加载,也生成了IIC0设备,但是IIC_Init()函数里的打印信息没有输出来: DEBUGMSG(1,(TEXT(\"+IIC_Init\\r\\n\"))); 打开IIC0设备进行操作也没有信号丛SCL与SDA输出。 为什么驱动被加载了,但没有跑IIC_Init()函数 ...…

查看全部问答>