基于STM32F103ZET6使用STM32CubeMX配置FSMC模块驱动LCD屏(基于正点原子历程)

这篇具有很好参考价值的文章主要介绍了基于STM32F103ZET6使用STM32CubeMX配置FSMC模块驱动LCD屏(基于正点原子历程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在学习STM32的过程中,刚好学到了LCD屏,我使用的是STM32F103ZET6,屏幕是正点原子的。但是在我自己新建工程点亮显示LCD屏时遇到了很多问题。解决之后分享在此,希望能帮助到遇到此困惑的朋友。
想要快速驱动LCD屏请直接跳转到CubeMX配置

FSMC简单介绍

FSMC全名叫可变静态存储控制器(Flexible Static Memory Controller,FSMC)是单片机的一种接口,它能够连接同步或异步存储器、16位PC存储卡和LCD模块。FSMC连接的所有外部存储器共享地址、数据和控制信号,但有各自的片选信号,所以,FSMC一次只能访问一个外部器件。
FSMC接口用于驱动外部存储器,也可以用于驱动8080接口的TFT LCD。
从FSMC的角度来看,外部存储器被划分为4个固定大小的存储区域,每个存储区域大小为256MB,各个区域的作用描述如下。
stm32cubemx配置lcd,stm32,单片机,嵌入式硬件
Bank1可连接多达4个NOR Flash或PSRAM/SRAM存储器件,因为它被分为4个子区(subbank),每个子区容量为64MB,有专用的片选信号。这些子区适合于连接TFT LCD。
Bank 1 -NOR/PSRAM 1,片选信号NE1。
Bank 1 -NOR/PSRAM 2,片选信号NE2。
Bank 1 -NOR/PSRAM 3,片选信号NE3。(开发板上用于连接外部SRAM)
Bank 1 -NOR/PSRAM 4,片选信号NE4。(开发板上用于连接TFT LCD)

Bank2 和 Bank3用于访问NAND Flash存储器,每个存储区域连接一个设备。

Bank4 用于连接PC卡设备。

TFT LCD简单介绍

TFT LCD 即薄膜晶体管(Thin Film Transistor)LCD,具有辐射低、功耗低、全彩色等优点, 是各种电子设备常用的一种显示设备。TFT LCD(后面也会简称为LCD)通常使用标准的8080并口,这种接口有16位数据线,还有几根控制线。TFTLCD的8080并行接口线的功能如下图所示。
stm32cubemx配置lcd,stm32,单片机,嵌入式硬件

CubeMX配置

FSMC子区配置
stm32cubemx配置lcd,stm32,单片机,嵌入式硬件
开发板上LCD原理图
stm32cubemx配置lcd,stm32,单片机,嵌入式硬件
通过原理图也可知要将子区配置为NE4。
LCD_Register Select寄存器根据原理图RS位可知设为A10.。
同时要将LCD_BL对应的引脚设置为输出模式即可(背光引脚)。(我这里对应的是PB0)
FSMC相关参数配置
stm32cubemx配置lcd,stm32,单片机,嵌入式硬件
RCC时钟配置
stm32cubemx配置lcd,stm32,单片机,嵌入式硬件
配置时钟树时默认将HCLK配置为72MHz(最大)即可。

LCD驱动程序改写

因为每块开发板对应的LCD历程会有所不一样,且为了保证不同芯片驱动的LCD都能够点亮。所以请下载正点原子资料下载中心的STM32F103最小系统板的TFT LCDHAL库历程进行改写。

将LCD相关文件导入到新建的例程中。

头文件的替换

(1)lcd.c文件中包含lcd.h、font.h和main.h即可
(2)lcd.h文件中只需包含main.h即可

基础数据类型的替换

使用快捷健CTRL+F来到替换界面。两个文件中将u8、u16和u32替换成uint8_t、uint16_t和uint32_t。
stm32cubemx配置lcd,stm32,单片机,嵌入式硬件
再将vuint16_t替换成__IO uint16_t。

函数的替换

采用上一点的方法将所有的delay_ms和delay_us替换成HAL_Delay(实测不影响程序运行)。

注释lcd.c中重复的代码

此环节说是重复代码注释,其实主要目的是为了便于移植程序。因为fsmc.
文件和原始的lcd.c文件中会有相同的初始化部分。
1.注释LCD_Init()函数最开始的fsmc初始化部分
即将以下部分的代码全部注释(此部分在MX_FSMC_Init()函数中已执行过)。

//    GPIO_InitTypeDef GPIO_Initure;
//    FSMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;
//    FSMC_NORSRAM_TimingTypeDef FSMC_WriteTim;

//    __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
//    GPIO_Initure.Pin=GPIO_PIN_0;            //PB0,背光控制
//    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
//    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
//    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
//    HAL_GPIO_Init(GPIOB,&GPIO_Initure); 

//    TFTSRAM_Handler.Instance=FSMC_NORSRAM_DEVICE;                
//    TFTSRAM_Handler.Extended=FSMC_NORSRAM_EXTENDED_DEVICE;    

//    TFTSRAM_Handler.Init.NSBank=FSMC_NORSRAM_BANK4;                         //使用NE4
//    TFTSRAM_Handler.Init.DataAddressMux=FSMC_DATA_ADDRESS_MUX_DISABLE;      //地址/数据线不复用
//    TFTSRAM_Handler.Init.MemoryType=FSMC_MEMORY_TYPE_SRAM;                  //SRAM
//    TFTSRAM_Handler.Init.MemoryDataWidth=FSMC_NORSRAM_MEM_BUS_WIDTH_16;     //16位数据宽度
//    TFTSRAM_Handler.Init.BurstAccessMode=FSMC_BURST_ACCESS_MODE_DISABLE;    //是否使能突发访问,仅对同步突发存储器有效,此处未用到
//    TFTSRAM_Handler.Init.WaitSignalPolarity=FSMC_WAIT_SIGNAL_POLARITY_LOW;  //等待信号的极性,仅在突发模式访问下有用
//    TFTSRAM_Handler.Init.WaitSignalActive=FSMC_WAIT_TIMING_BEFORE_WS;       //存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT
//    TFTSRAM_Handler.Init.WriteOperation=FSMC_WRITE_OPERATION_ENABLE;        //存储器写使能
//    TFTSRAM_Handler.Init.WaitSignal=FSMC_WAIT_SIGNAL_DISABLE;               //等待使能位,此处未用到
//    TFTSRAM_Handler.Init.ExtendedMode=FSMC_EXTENDED_MODE_ENABLE;            //读写使用不同的时序
//    TFTSRAM_Handler.Init.AsynchronousWait=FSMC_ASYNCHRONOUS_WAIT_DISABLE;   //是否使能同步传输模式下的等待信号,此处未用到
//    TFTSRAM_Handler.Init.WriteBurst=FSMC_WRITE_BURST_DISABLE;               //禁止突发写
//    
//    //FMC读时序控制寄存器
//    FSMC_ReadWriteTim.AddressSetupTime=0x06;        //地址建立时间(ADDSET)为7个HCLK 13.8ns*7=96.6ns
//    FSMC_ReadWriteTim.AddressHoldTime=0;
//    FSMC_ReadWriteTim.DataSetupTime=26;             //数据保存时间为27个HCLK	=13.8*27=372.6ns
//    FSMC_ReadWriteTim.AccessMode=FSMC_ACCESS_MODE_A;//模式A
//    //FMC写时序控制寄存器
//    FSMC_WriteTim.BusTurnAroundDuration=0;          //总线周转阶段持续时间为0,此变量不赋值的话会莫名其妙的自动修改为4。导致程序运行正常
//    FSMC_WriteTim.AddressSetupTime=3;               //地址建立时间(ADDSET)为4个HCLK =55.2ns 
//    FSMC_WriteTim.AddressHoldTime=0;
//    FSMC_WriteTim.DataSetupTime=0x06;               //数据保存时间为13.8ns*7个HCLK=96.6ns
//    FSMC_WriteTim.AccessMode=FSMC_ACCESS_MODE_A;    //模式A
//    HAL_SRAM_Init(&TFTSRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);	

//    HAL_Delay(50); // delay 50 ms 

2.注释函数void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram)
此函数是对fsmc相关的引脚进行GPIO配置。

收尾工作

1.将LCD_Init()函数最后面的代码注释(如下)。

LCD_LED = 1; 

改为一下代码点亮背光(让屏幕亮起来)。

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,1);

2.将LCD_Init()函数中的printf代码行注释,如下。

printf(" LCD ID:%x\r\n", lcddev.id); //打印LCD ID

因为原历程使用串口一进行串口调试,要是没有初始化串口一的话,运行时会一直卡在这里
3.最后在主函数中包含lcd.h头文件,添加以下代码即可运行。

  LCD_Init();
  LCD_ShowString(100,100,100,24,24,"114514");

4.大家以后要移植LCD程序时,复制相关文件到对应工程,包含头文件,调用初始化函数即可使用。节省时间!
stm32cubemx配置lcd,stm32,单片机,嵌入式硬件
源码我放在网盘了,有需要的可以自取:
链接:https://pan.baidu.com/s/1EfmoR1q8q69twGvVbt93_Q?pwd=g8tk
提取码:g8tk文章来源地址https://www.toymoban.com/news/detail-617348.html

到了这里,关于基于STM32F103ZET6使用STM32CubeMX配置FSMC模块驱动LCD屏(基于正点原子历程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F103ZET6 GPIO工作模式介绍+使用寄存器点亮第一个LED灯

    目录  GPIO的工作模式介绍 1.输入模式(模拟、上拉、下拉、浮空) 2.输出模式(推挽/开漏) 3.复用功能(推挽/开漏) 4.模拟输入输出(上下拉无影响) 如何使用寄存器点亮第一个LED灯         在输入模式时,施密特触发器打开,输出被禁止。可通过输入数据寄存器 GPIOx_

    2024年02月06日
    浏览(20)
  • AD7606与STM32F103ZET6的串行通信

      本文是AD7606与STM32的串行通信的学习心得,可帮助你快速入门AD7606。   图一   图二   图三   图四   根据图一,一些引脚在置高或置低时的上升或下降沿会受时间影响,因此在编写代码时,一些对引脚的操作需要放在一起,且延时函数不能随意使用。   图

    2024年02月08日
    浏览(35)
  • 基于STM32F103ZET6单片机驱动SM16306SJ控制8个LED灯的系统设计

    1.设计要求:使用stm32f103zet6精英开发板  采用SM16306SJ驱动8个LED灯。 2.原理图 3.代码 4.实物效果图 备注:1 硬件上有一个LED灯坏了,所以才亮了7个LED灯            2 一个SM16306SJ最多可以驱动16个LED灯            3 SM16306SJ跟MBI5020程序通用

    2024年04月17日
    浏览(20)
  • 基于STM32F103ZET6的(单/三)路HC-SR04超声波测距+TFTLCD实时显示+距离报警

    一、成果图 说明:本程序的源码地址: https://github.com/Lfy-YF/Campus-Project            CSDN下载连接:https://download.csdn.net/download/weixin_58849239/87829470 源码包含四个版本,涉及单路测距、三路测距、增加外部中断(用来版本记录的~) 运行效果: 本程序实现脱机测距,共左中右

    2024年02月11日
    浏览(15)
  • 用正点原子STM32F103ZET6精英板控制舵机转动实验保姆教程

    正点原子精英板一块 Jlink4线SWD下载线一根 精英板usb供电/下载线一根(负责给开发板供电) SG90舵机一个(三线:其中红线接5V电压,棕线接GED,橙黄色为信号线接开发板PB5引脚,舵机所给为3pin杜邦线母头,可用单根杜邦线(一头子一头母)将舵机线飞开接到精英板上)。 以

    2023年04月15日
    浏览(25)
  • STM32F103ZET6 封装 LQFP-144 ST意法 单片机芯片

    STM32F103ZET6 是意法半导体(STMicroelectronics)生产的一款基于 ARM Cortex-M3 内核的 32 位微控制器。它具有高性能、低功耗的特点,广泛应用于各种嵌入式系统和工业应用中。STM32F103ZET6 的主要特点如下: 内核:ARM Cortex-M3,工作频率最高可达 72MHz。 存储器:64KB SRAM,512KB FLASH。 外

    2024年04月22日
    浏览(35)
  • STM32---stm32f103c8t6与stm32f103zet6之间的代码移植转换

    目录 一、将c8t6转换为zet6 1、修改启动文件 2、修改芯片 3、将MD修改为HD  4、下载器的修改 5、修改完成,编译成功  二、将zet6转换为c8t6 最终结果如下:   将STM32F103C8改为STM32F103ZE   基本相同,反向即可。    

    2024年02月06日
    浏览(17)
  • MDK Keil5 创建Stm32工程-理论篇(这里以Stm32F103Zet6为例)

    整个工程可以粗略的划分为几个文件夹: BSP 底层驱动比如GPIOTimer等驱动文件 CMSIS 内核相关的文件 Firmware 生成的固件下载文件 Mycode 用户编写的相关文件,主要编写的文件都在这个文件夹里 Project 工程文件 startup 芯片启动文件 STM32F10x_FWLib 标准库文件 USER 主函数等文件 readm

    2023年04月24日
    浏览(47)
  • 【LVGL】STM32F103ZET6——LVGL_GUI_GUIDER移植过程成功

    STM32F103ZET6——LVGL_GUI_GUIDER移植过程 STM32F103ZET6——LVGL_GUI_GUIDER移植过程 使用工具: 1.LVGL库8.02 2.GUI_GUIDER 3.keil5 设计出来的总体是这样 提示:以下是本篇文章正文内容,下面案例可供参考 这部分有很多大佬已经写的很成熟了,我就不赘述了 安装包在这里硬件资源 右上角可将

    2024年02月12日
    浏览(19)
  • 正点原子stmf103zet6代码移植为stm32f103c8t6(库函数版)

    目录 1、打开正点原子的工程模板template, 点击魔术棒  2、 修改芯片型号 为stm32f103c8

    2024年02月01日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包