交互式界面被越来越多地集成于多种应用中,例如医疗设备、过程控制、手机和其它手持设备。这些界面主要基于使用彩色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控制器外部信号
3、6800和8080总线的区别
oled的可支持串行接口(spi,i2c)和并行接口(主要又可以分为8080模式和6800模式);8080模式和6800模式都需数据总线和地址总线,数据位传输可支持8位,9位,16位,18位,24位,32位,对于数据的寻址,都是一样的。8080模式和6800模式的区别主要是总线的控制方式上。
以ssd1306 的oled 驱动芯片为例,其接口与mcu连接所需要的信号线为:
i(intel)8080模式
i8080模式管脚的控制脚有5个及data信号:
m(motorola)6800模式
通过上面分析,其实不难发现,它们主要区别就是:
● 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。
图2 oled模块实物图
下图是oled模块接口原理图:
图3 oled接口原理图
各个信号作用对应如下:
表2 oled信号对应的电源、复位与mcu接口的引脚说明
mb039可通过转接板接到oled模块。
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][i], oled_data); } }}
结合oled_fill和oled_showchar函数可以实现oled的显示填充与字符输出。
通过演示,观察到在oled上显示出了mindmotion 的字符与年月日等打印信息。
来源:灵动mm32mcu
得可推出PV3000光伏太阳能电池丝网印刷解决方案
2018年6月6日 | 周三 | 区块链早报
fireflyAIO-3288J主板定制Android固件简介
如何选择适用于不同行业的X-ray无损探伤设备?
越南邮政通信集团越南首家获得使用 5G 频段许可的运营商
使用MM32F3270 FSMC驱动OLED
泰克示波器显示屏上不显示信号什么原因?该怎么办呢?
射频放大器测试系统中的电源噪声
HK-TrueNAS版本大揭秘!一文教您如何选择合适的TrueNAS软件
太阳能下个景气 将在2013年来临
科幻或将变成现实 超导加速未来新科技
LIN总线简介
集和诚科技的KAGO系列边缘控制器详解
0glass荣获国家高新技术企业认证_知识产权有一百余项
任天堂Wii主机大量Logo设计曝光
CAN-bus总线在冷链运输中的应用
IDT推出业界领先相位噪声性能的超灵活频率转换器件
奥乐科技发布2.4G RF键盘加密芯片OK103
机器学习作为AI技术中的重要一环,助力人工智能产业的发展
5G的关键是什么