完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
交互式界面被越来越多地集成于多种应用中,例如医疗设备、过程控制、手机和其它手持设备。这些界面主要基于使用彩色TFT-LCD的图形HMI(人机界面)。随着技术的变革,OLED技术的显示方案也得到长足的发展与广泛的应用。 OLED技术与其它技术相比,具有以下优点: (1)功耗低 (2)响应速度快 (3)较宽的视角 (4)能实现高分辨率显示 (5)宽温度特性 (6)OLED能够实现软屏 (7)OLED成品的质量比较轻 电子产品领域中,OLED应用最为广泛的就是智能手机,其次是笔记本、显示屏、电视、平板、数码相机等领域,嵌入式应用领域中,OLED有很大一部分用作工业仪表、GPS手环、可视电话等小尺寸的显示屏。 本文介绍了如何使用 MM32F3270的FSMC(灵活的静态存储控制器)来驱动6800接口的OLED。 1 // MM32F3270 FSMC的简要介绍 FSMC是Flexible static memory controller(灵活的静态存储控制器)的简称,支持并行接口的SRAM、PSRAM 、NOR FLASH 、TFT-LCD和OLED。 图1 FSMC的功能框图 2 // FSMC 的功能特性 MM32的FSMC具有以下特性: 1) 可配置的静态存储器接口包括: a) SRAM b) PSRAM c) NOR FLASH 2) 支持 Intel 8080 协议 3) 支持 Moto 6800 协议 4) 8位,16位,32位可配置的数据总线宽度,支持非复用与复用模式 5) BANK1 分为 4 块子 BANK,每块 64Mbit 空间 6) 时序可编程以满足不同的需求 a) 等待周期可编程 b) 总线恢复周期可编程 c) 写,读控制周期可编程 7) 可将32位的AHB访问请求,转换为对外接设备连续的8位,16位的访问 MM32F3270的FSMC提供了对多个并行外设的控制与连接,具体配置取决于存储器类型,主要涉及如下寄存器设置。 (1)SMCTLR 的 sm_data_width[2:0],定义了外部存储器的数据宽度,需根据实际数据宽度配置为8位,16位,32 位,此时需要保障实现数据传输的一致性。 (2)SMCTLR的sm_data_width_set0/1/2 来设置存储器的数据宽度,有三种情况:AHB 操作的数据宽度与存储器数据宽度相同,无数据传输一致性的问题;AHB 操作的数据宽度大于存储器的数据宽度时,AHB 接口将对 hwdata[15:0],hwdatabit[31:16]进行连续写操作,以适应外部设备的数据宽度,读操作时,hrdata[31:0]的低 16 位是有效数据;AHB 操作的数据宽度小于存储器的数据宽度时,若存储设备没有高低字节片选,不允许进行写操作,若存储设备有高低字节选择,通过 BL 控制访问对应字节。可以进行读操作,但有效数据需要用户自己处理。 (3)SYSCFG_CFGR1[30:29]:mode_sel来配置不同模式,默认值为 01 00:兼容 NOR FLASH 接口 01:兼容 8080 协议接口 10:兼容 6800 协议接口 (4)SMSKR0[10:8]用来选择三组不同的寄存器 register set0/set1/set2,以配置不同的时序 FMSC支持的外部接口 表1 FSMC控制器外部信号 // 6800和8080总线的区别 OLED的可支持串行接口(SPI,I2C)和并行接口(主要又可以分为8080模式和6800模式);8080模式和6800模式都需数据总线和地址总线,数据位传输可支持8位,9位,16位,18位,24位,32位,对于数据的寻址,都是一样的。8080模式和6800模式的区别主要是总线的控制方式上。 以SSD1306 的OLED 驱动芯片为例,其接口与MCU连接所需要的信号线为: I8080模式管脚的控制脚有5个及Data信号:
通过上面分析,其实不难发现,它们主要区别就是: 8080通过“读使能(RD)”和“写使能(WR)”进行读写操作 6800通过“总使能(E)”和“读写选择(W/R)”进行读写操作 4 // FSMC 控制OLED的硬件设计 FSMC是如何控制OLED的呢? OLED控制使用:DC信号可以使用地址线(如A0~A18中的一根)、数据线(如D0~D7)、使能信号(E)、读写信号(RW)、片选信号(CS)。OLED通过DC信号来决定传送的数据是数据还是命令,本质上可以理解为一个地址信号,比如MB039是把DC接在A18上面,那么当FSMC控制器写地址0的时候,会使得A18 变为0,对OLED来说,就是写命令。而FSMC写地址1的时候,A0 将会变为1,对OLED来说,就是写数据。这样,就把数据和命令区分开了,其实就是对应 OLED 操作两个地址。当然DC也可以接在其他地址线上,MB039是把DC连接在PD13上面的。MM32F3270的FSMC支持8/16/32位数据宽度,我们这里用到的OLED是8位宽度的,在设置的时候需要选择8位宽。 FSMC 控制OLED 的Demo应用中,使用的开发板为MB-039,它支持外接使用SSD1306为驱动器的128 x 24 点阵OLED。 下图是OLED模块接口原理图: 图3 OLED接口原理图 表2 OLED信号对应的电源、复位与MCU接口的引脚说明 5 // FSMC 控制OLED的软件设计 FMSC Demo应用中,使在库函数样例工程中使用选用: MM32F327x_SamplesLibSamplesFSMCFSMC_Ex6800OLED 中的 FSMC_Ex6800OLED.uvprojx 样例展示如何初始化OLED接口与实现OLED并行驱动显示。 软件分为两个部分: (1)FSMC接口GPIO与FSMC接口参数初始化 (2)OLED显示初始化与OLED显示 FSMC接口GPIO与FSMC接口参数初始化 void FSMC_Ex6800OLED_Demo(void) { u8 t = 0; u8* p = (u8*)0x60080000; OLED_nRST_Pin_Config(); OLED_GPIO_Init(); FSMC_Init_6800(); OLED_nRST_Setting(); OLED_Init(); //其他用户代码 } ① 在OLED_GPIO_Init ()中实现OLED对应IO初始化 包括OLED对应nRST引脚,背光控制引脚,FSMC相关的片选,读写,E信号,数据/命令,数据D0~D7引脚的初始化。 ② 在FSMC_Init_6800 ()中实现FSMC功能配置初始化 A. 写操作周期 B. 单个bit数据写入保持时间 C. 写操作时,地址线的建立时间 D. 读操作周期长度设置 E. 存储器数据总线位宽 F. 模式选择:6800模式 G. 外接设备的内存大小 void FSMC_Init_6800(void) { FSMC_InitTypeDef FSMC_InitStructure; FSMC_NORSRAM_Bank_InitTypeDef FSMC_BankInitStructure; FSMC_NORSRAM_BankStructInit(&FSMC_BankInitStructure); FSMC_NORSRAMStructInit(&FSMC_InitStructure); RCC_AHB3PeriphClockCmd(RCC_AHB3ENR_FSMC, ENABLE); FSMC_BankInitStructure.FSMC_SMReadPipe = 0; FSMC_BankInitStructure.FSMC_ReadyMode = 0; FSMC_BankInitStructure.FSMC_WritePeriod = 7; FSMC_BankInitStructure.FSMC_WriteHoldTime = 0; FSMC_BankInitStructure.FSMC_AddrSetTime = 1; FSMC_BankInitStructure.FSMC_ReadPeriod = 9; FSMC_BankInitStructure.FSMC_DataWidth = FSMC_DataWidth_16bits; FSMC_NORSRAM_Bank_Init(&FSMC_BankInitStructure, FSMC_NORSRAM_BANK0); FSMC_InitStructure.FSMC_Mode = FSMC_Mode_6800; FSMC_InitStructure.FSMC_TimingRegSelect = FSMC_TimingRegSelect_0; FSMC_InitStructure.FSMC_MemSize = FSMC_MemSize_64MB; FSMC_InitStructure.FSMC_MemType = FSMC_MemType_NorSRAM; FSMC_InitStructure.FSMC_AddrDataMode = FSMC_AddrDataMUX; FSMC_NORSRAMInit(&FSMC_InitStructure); } OLED显示初始化 Bank0地址为0x60000000,0x80000=(0x01 << 19)则是地址线A18的偏移量。首先完成写OLED_WR_REG和OLED_WR_DATA驱动: void OLED_WR_DATA(u16 data) { *(vu16*)0x60000000 = data; } void OLED_WR_REG(u16 regval) { *(vu16*)(0x60000000 | (0x01 << 19)) = regval; } void OLED_WR_Byte(u8 dat, u8 cmd) { if(cmd) { OLED_WR_REG(dat); } else { OLED_WR_DATA(dat); } } 读DATA和REG是一样的操作,不同的是从相应地址读取数据。 通过OLED_Refresh_Gram()函数,可以实现数据的实时刷新。void OLED_Refresh_Gram(void) { u8 i, n; for(i = 0; i < 8; i++) { OLED_WR_Byte (0xb0 + i, OLED_CMD); // Set page address (0~7) OLED_WR_Byte (0x00, OLED_CMD); // Set display location - column low address OLED_WR_Byte (0x10, OLED_CMD); // Set display location - column height address for(n = 0; n < 128; n++) { OLED_WR_Byte(OLED_GRAM[n], OLED_DATA); } } } 结合OLED_Fill和OLED_ShowChar函数可以实现OLED的显示填充与字符输出。 通过演示,观察到在OLED上显示出了MindMotion 的字符与年月日等打印信息。 Demo程序可登录MindMotion的官网下载MM32F3270 lib_Samples: https://www.mindmotion.com.cn/pr ... instream/mm32f3270/ 工程路径如下: ~MM32F327x_SamplesLibSamplesFSMCFSMC_Ex6800OLED。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2248个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11657 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5920 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
10943 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4568 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4296 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
962浏览 1评论
791浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:55 , Processed in 0.605712 second(s), Total 66, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号