0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MM32F3270 FSMC驱动OLED

jf_pJlTbmA9 来源:灵动MM32MCU 作者:灵动MM32MCU 2023-09-27 15:30 次阅读

交互式界面被越来越多地集成于多种应用中,例如医疗设备、过程控制、手机和其它手持设备。这些界面主要基于使用彩色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。

wKgaomUD8ziAeNCQAADpa9c_-iE854.png 图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支持的外部接口

wKgZomUD8zqAZJh8AAAid0QA-Go866.png 表1 FSMC控制器外部信号

3、6800和8080总线的区别

OLED的可支持串行接口(SPI,I2C)和并行接口(主要又可以分为8080模式和6800模式);8080模式和6800模式都需数据总线和地址总线,数据位传输可支持8位,9位,16位,18位,24位,32位,对于数据的寻址,都是一样的。8080模式和6800模式的区别主要是总线的控制方式上。

以SSD1306 的OLED 驱动芯片为例,其接口与MCU连接所需要的信号线为:

wKgaomUD8zuAN25SAADpK5gt4b4502.png

I(intel)8080模式

I8080模式管脚的控制脚有5个及Data信号:

wKgZomUD8z2AG8y6AAAU4e5WOcU560.png
wKgZomUD8z-Acqd3AADzXjRYl7s663.png

M(Motorola)6800模式

wKgaomUD80CAHXHzAAAcD9DHuUw815.png
wKgZomUD80KABbUkAABqBlLwUs8140.png

通过上面分析,其实不难发现,它们主要区别就是:

● 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。

wKgaomUD80aAeoSBAAHRQn3Zxpw688.png 图2 OLED模块实物图

下图是OLED模块接口原理图:

wKgZomUD80eAczfhAAFodE54mvs211.png 图3 OLED接口原理图

各个信号作用对应如下:

wKgaomUD80iAH_DhAAAuZdGEIbU981.png 表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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15235

    浏览量

    171206
  • OLED
    +关注

    关注

    118

    文章

    5986

    浏览量

    221465
  • 人机界面
    +关注

    关注

    5

    文章

    497

    浏览量

    43723
  • FSMC
    +关注

    关注

    0

    文章

    54

    浏览量

    37932
收藏 人收藏

    评论

    相关推荐

    灵动微课堂 (第188讲) | 使用MM32F3270 FSMC驱动TFT-LCD

    的需求在全世界范围内极大增长。本文介绍了如何使用 MM32F3270FSMC(灵活的静态存储控制器)来驱动8080接口的TFT-LCD。 01 MM32F3270
    发表于 10-29 17:12

    MM32F3270系列32位MCU的特点有哪些

    上海灵动微电子推出全新主流型MM32F3270系列32位MCU,此款MM32F3270系列是基于M3内核的32位微控制器,MM32F3270适用于要求高集成度的高性能控制领域,如:工业控制、消防监控
    发表于 11-03 07:20

    灵动微课堂 (第189讲) | 使用MM32F3270 FSMC驱动SRAM

    _SRAM\下章的题目为《使用MM32F3270FSMC驱动外部NOR Flash》讲解通过FSMC外扩并口Flash的实现。
    发表于 11-10 09:22

    灵动微课堂 (第190讲) | 使用MM32F3270 FSMC驱动外部NOR Flash

    /mm32f_mainstream/mm32f3270/ 工程路径如下:~MM32F327x_Samples\LibSamples\FSMC\FSM
    发表于 11-19 09:29

    灵动微课堂 (第191讲) | 使用MM32F3270 FSMC驱动OLED

    了如何使用 MM32F3270FSMC(灵活的静态存储控制器)来驱动6800接口的OLED。1//MM32F3270
    发表于 11-29 10:45

    灵动微电子MM32F3270系列MCU的特点介绍

    上海灵动微电子推出全新主流型MM32F3270系列32位MCU,此款MM32F3270系列是基于M3内核的32位微控制器,MM32F3270适用于要求高集成度的高性能控制领域,如:工业控制、消防监控
    发表于 03-22 16:57 1946次阅读

    如何采用MM32F3270单片机的FSMC接口来扩展SRAM

    够支持应用的需要,就要用外扩SRAM/PSRAM的方式来扩展。这时可以采用MM32F3270片内的FSMC接口来扩展SRAM/PSRAM。   灵动微MM32F3270系列32位MCU是基于M3内核
    发表于 11-19 16:32 514次阅读

    【国产MCU移植】MM32F3270 EVBoard

    【国产MCU移植】MM32F3270 EVBoard
    发表于 12-03 17:21 5次下载
    【国产MCU移植】<b class='flag-5'>MM32F3270</b> EVBoard

    MM32F3270 勘误表(中文版)

    MM32F3270 勘误表(中文版)
    发表于 02-23 18:42 0次下载
    <b class='flag-5'>MM32F3270</b> 勘误表(中文版)

    使用MM32F3270的SDIO驱动SD卡

    使用MM32F3270的SDIO驱动SD卡
    的头像 发表于 09-27 15:56 421次阅读
    使用<b class='flag-5'>MM32F3270</b>的SDIO<b class='flag-5'>驱动</b>SD卡

    基于MM32F3270 I2S使用

    基于MM32F3270 I2S使用
    的头像 发表于 09-27 15:50 503次阅读
    基于<b class='flag-5'>MM32F3270</b> I2S使用

    使用MM32F3270 FSMC驱动外部NOR Flash

    使用MM32F3270 FSMC驱动外部NOR Flash
    的头像 发表于 09-21 17:37 543次阅读
    使用<b class='flag-5'>MM32F3270</b> <b class='flag-5'>FSMC</b><b class='flag-5'>驱动</b>外部NOR Flash

    使用MM32F3270 FSMC驱动TFT-LCD

    使用MM32F3270 FSMC驱动TFT-LCD
    的头像 发表于 09-27 15:34 474次阅读
    使用<b class='flag-5'>MM32F3270</b> <b class='flag-5'>FSMC</b><b class='flag-5'>驱动</b>TFT-LCD

    基于MM32F3270以太网Client使用

    基于MM32F3270以太网Client使用
    的头像 发表于 09-27 15:44 442次阅读
    基于<b class='flag-5'>MM32F3270</b>以太网Client使用

    基于MM32F3270以太网UDP使用

    基于MM32F3270以太网 UDP使用
    的头像 发表于 09-27 15:42 283次阅读
    基于<b class='flag-5'>MM32F3270</b>以太网UDP使用