STM32F40X系列FSMC8路驱动LCD显示屏(LY-TFT30-39P-1509 芯片hx8352)

news2025/2/24 10:32:26

hx8352_8080_8bit_FMSC板级驱动

  • 1.LCD相关
    • 1.1LCD参数
    • 1.2 LCD引脚
    • 1.3 LCD实物
    • 1.4 LCD引脚解释
  • 2.接线关系
  • 3.STM32F40x基于FMSC@16bit修改
    • 1)地址偏移
    • 2)删除多余GPIO
    • 3)修改FMSC的配置
    • 4)LCD初始化寄存器
  • 3.板驱动程序
  • 4.运行结果

1.LCD相关

1.1LCD参数

LCD控制芯片:HX8352
LCD控制芯片通信方式:8080@8bit
LCD分辨率:240pix * 430pix

1.2 LCD引脚

通过LCD电路图可知,带斜杠的为低电平有效。
RS为判断DBx传输的为数据或命令,高为数据,低为命令
WR、RD分别为读写使能,低电平有效
RESET为复位、CS为片选,
DB10-17为数据/命令传输端口,相当于8位同步传输,

图1:LCD输出引脚

1.3 LCD实物

图上AB位置与12标注依次对应,注意B上端有个2个空引脚。
图上C位置,由于3处没有焊接触摸屏的处理芯片和电容,所以触摸屏无效,C引脚无效。
图上D位置为4对应的SD卡引脚,为SPI驱动,此教程未使用。

图1:LCD实物图

1.4 LCD引脚解释

LCD的驱动芯片为HX8352, 驱动芯片会在出厂时,设定IM0-2,从而确定LCD控制模式,如图选定8位数据8080通信,选定的通信引脚为D8-17。

2.接线关系

这个要对应上,需要插一会。

3.STM32F40x基于FMSC@16bit修改

其实只要在FSMC16位数据通信模式上修改即可,需要修改以下几处。

1)地址偏移

FSMC为8位bit,不需要偏移一位。
只要将FSMC_Ax的x位设置为1或者0即可。
如实例:
片选选择FSMC_NE2,对应引脚PG9,储存起始位为0x64000000,
RS连接FSMC_A13,对应引脚PG2,
传输数据FSMC地址写入0x64000000+0<<13 =0x64000000
传输数据FSMC地址写入0x64000000+1<<13 = 0x64002000

/******************************* HX8352 显示屏的 FSMC 参数定义 ***************************/

#define      FSMC_Addr_HX8352_CMD         ( ( uint32_t ) 0x64000000 )  //FSMC_Bank1_NORSRAM用于LCD命令操作的地址
#define      FSMC_Addr_HX8352_DATA        ( ( uint32_t ) 0x64002000 )  //FSMC_Bank1_NORSRAM用于LCD数据操作的地址 

#define      FSMC_Bank1_NORSRAMx           FSMC_Bank1_NORSRAM2          //由片选引脚决定的NOR/SRAM块
/******************************* HX8352 显示屏8080通讯引脚定义 ***************************/
//片选,选择NOR/SRAM块
#define      LCD_CS_CLK                RCC_AHB1Periph_GPIOG  
#define      LCD_CS_PORT               GPIOG
#define      LCD_CS_PIN                GPIO_Pin_9
#define      LCD_CS_PinSource          GPIO_PinSource9
//DC引脚,使用FSMC的地址信号控制,本引脚决定了访问LCD时使用的地址
//PG2为FSMC_A13
#define      LCD_DC_CLK                RCC_AHB1Periph_GPIOG  
#define      LCD_DC_PORT               GPIOG
#define      LCD_DC_PIN                GPIO_Pin_3
#define      LCD_DC_PinSource          GPIO_PinSource3

在这里插入图片描述

2)删除多余GPIO

删除FSMC_D0-7所有对应的引脚控制,包括引脚时钟、引脚输入输出配置复用。

	GPIO_InitTypeDef GPIO_InitStructure;

	/* 使能FSMC对应相应管脚时钟*/
	RCC_AHB1PeriphClockCmd ( 	
													/*控制信号*/
													LCD_CS_CLK|LCD_DC_CLK|LCD_WR_CLK|
													LCD_RD_CLK	|LCD_RST_CLK|//LCD_BK_CLK|
													/*数据信号*/
													RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOD , ENABLE );

	/* 配置FSMC相对应的数据线,FSMC-D0~D15 */	
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
		
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1//|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10
																	|GPIO_Pin_14|GPIO_Pin_15; 					//PD 0 1  14 15	 //8 9 10																			
    GPIO_Init(GPIOD, &GPIO_InitStructure);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;//|GPIO_Pin_11
																					//|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;  //PE7-10  11-15																				
    GPIO_Init(GPIOE, &GPIO_InitStructure);
		
		GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC); 
		GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC); 
//		GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC); 
//		GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
//		GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
		GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
		GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC); 
 
		GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);  
		GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
		GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
		GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
//		GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
//		GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
//		GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
//		GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
//		GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC); 

3)修改FMSC的配置

重要是修改 FSMC_NORSRAMInitTypeDef类型 的结构体参数 FSMC_MemoryDataWidth

FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth =	FSMC_MemoryDataWidth_8b;    //数据宽度为8bit  

4)LCD初始化寄存器

LCD控制芯片的寄存器需要初始化,其和芯片信号相关,这里为hx8352

	 LCD_W_CMD( 0x1A);LCD_W_DATA(0x02); //BT
	 LCD_W_CMD( 0x1B);LCD_W_DATA(0x88); //VRH
	 //****VCOM offset**///
	 
	 LCD_W_CMD( 0x23);LCD_W_DATA(0x00); //SEL_VCM
	 LCD_W_CMD( 0x24);LCD_W_DATA(0x64); //
	 LCD_W_CMD( 0x25);LCD_W_DATA(0x15); //VDV
	 LCD_W_CMD( 0x2D);LCD_W_DATA(0x03); //NOW[2:0]=001
	 //****OPON**//
	 LCD_W_CMD( 0xE8);LCD_W_DATA(0x60);
	 //Power on Setting
	 LCD_W_CMD( 0x18);LCD_W_DATA(0x04); //Frame rate 72Hz
	 LCD_W_CMD( 0x19);LCD_W_DATA(0x01); //OSC_EN='1', start Osc
	 LCD_W_CMD( 0x01);LCD_W_DATA(0x00); //DP_STB='0', out deep sleep
	 LCD_W_CMD( 0x1F);LCD_W_DATA(0x88); //STB=0
	 //delayms(50);
	 LCD_W_CMD( 0x1F);LCD_W_DATA(0x80); //DK=0
	 //delayms(50);
	 LCD_W_CMD( 0x1F);LCD_W_DATA(0x90); //PON=1
	 //delayms(50);
	 LCD_W_CMD( 0x1F);LCD_W_DATA(0xD0); //VCOMG=1
	 //delayms(50);
	 //262k/65k color selection
	 LCD_W_CMD( 0x17);LCD_W_DATA(0x05); //default 0x06 262k color // 0x05 65k color
	 //SET PANEL
	 LCD_W_CMD( 0x36);LCD_W_DATA(0x03);//12    //屏幕正反向,红蓝交换,背景,放大屏幕等
	 														// 0x03 正常
	 														// 0x04 上下反向
	 LCD_W_CMD( 0x29);LCD_W_DATA(0x31); //400 lines
	 LCD_W_CMD( 0x71);LCD_W_DATA(0x1A); //RTN
	 //Gamma 2.2 Setting
	 LCD_W_CMD( 0x40);LCD_W_DATA(0x00);
	 LCD_W_CMD( 0x41);LCD_W_DATA(0x45);
	 LCD_W_CMD( 0x42);LCD_W_DATA(0x45);
	 LCD_W_CMD( 0x43);LCD_W_DATA(0x04);
	 LCD_W_CMD( 0x44);LCD_W_DATA(0x00);
	 LCD_W_CMD( 0x45);LCD_W_DATA(0x08);
	 LCD_W_CMD( 0x46);LCD_W_DATA(0x23);
	 LCD_W_CMD( 0x47);LCD_W_DATA(0x23);
	 LCD_W_CMD( 0x48);LCD_W_DATA(0x77);
	 LCD_W_CMD( 0x49);LCD_W_DATA(0x40);
	 LCD_W_CMD( 0x4A);LCD_W_DATA(0x04);
	 LCD_W_CMD( 0x4B);LCD_W_DATA(0x00);
	 LCD_W_CMD( 0x4C);LCD_W_DATA(0x88);
	 LCD_W_CMD( 0x4D);LCD_W_DATA(0x88);
	 LCD_W_CMD( 0x4E);LCD_W_DATA(0x88);
	 LCD_W_CMD( 0x02);LCD_W_DATA(0x00);
	 LCD_W_CMD( 0x03);LCD_W_DATA(0x00); //Column Start
	 LCD_W_CMD( 0x04);LCD_W_DATA(0x00);
	 LCD_W_CMD( 0x05);LCD_W_DATA(0xEF); //Column End
	 LCD_W_CMD( 0x06);LCD_W_DATA(0x00);
	 LCD_W_CMD( 0x07);LCD_W_DATA(0x00); //Row Start
	 LCD_W_CMD( 0x08);LCD_W_DATA(0x01);
	 LCD_W_CMD( 0x09);LCD_W_DATA(0x8F); //8f//Row End
	 //Display ON Setting
	 LCD_W_CMD( 0x28);LCD_W_DATA(0x38); //GON=1, DTE=1, D=10
	 //delayms(40);
	 LCD_Delay(0xFFFFF );
	 LCD_W_CMD( 0x28);LCD_W_DATA(0x3F); //3//3c//GON=1, DTE=1, D=11
	 //LCD_W_CMD( 0x22); //Start GRAM write
	 
	 //LCD_W_CMD( 0x16);LCD_W_DATA(0xaa);  //填充方向

3.板驱动程序

stm32f40x_hx8352_LCD驱动下载连接
ask码字模font.c自带
中文字模需要导入到外部flash上
在这里插入图片描述

4.运行结果

bsp_hx8352_lcd.c 中的 test_HX8352_LCD_3() 运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/897342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C数据结构与算法——无向图(最小生成树) 应用

实验任务 (1) 掌握Kruskal最小生成树算法&#xff1b; (2) 掌握Prim最小生成树算法。 实验内容 (1) 随机生成一个无向网 G ( V, E )&#xff0c;V { A, B, C, D, E, F }&#xff0c;| E | 11&#xff0c;边的权值取值范围为 [ 1, 40 ]&#xff1b; (2) 使用Prim算法求出图…

离散化思想——只处理有效数据的优化思想

离散化思想——只处理有效数据的优化思想 什么是离散化离散化题目——校门外的树&#xff08;超强版&#xff0c;1e9&#xff09;题目描述输入格式输出格式样例样例输入样例输出 提示 思路分析朴素做法离散化&#xff01;&#xff01;代码分析数组循环 什么是离散化 离散化思想…

C语言之浮点数_数据存储篇(2)

目录 浮点数 什么是浮点数呢&#xff1f; 为什么叫浮点数&#xff1f; 浮点数家族 浮点数表示的范围&#xff1f; 浮点数存储的例子 浮点数的存储方式 写成规定形式是怎样的&#xff1f; 那SME在内存中如何分配的呢&#xff1f; 为什么要这样存储&#xff1f; 浮点…

44、TCP报文(二)

接上节内容&#xff0c;本节我们继续TCP报文首部字段含义的学习。上节为止我们学习到“数据偏移”和“保留”字段。接下来我们学习后面的一些字段&#xff08;暂不包含“检验和”的计算方法和选项字段&#xff09;。 TCP首部结构&#xff08;续&#xff09; “数据偏移”和“保…

人工智能在车牌识别中的应用与影响

引言&#xff1a;车牌识别技术是基于人工智能的一种重要应用&#xff0c;通过对监控视频中的车辆图像进行处理和分析&#xff0c;可以快速、准确地识别车牌号码。这项技术的广泛应用可以帮助交通管理、停车场管理&#xff0c;甚至追踪犯罪嫌疑人的车辆。本文将详细探讨车牌识别…

从LeakCanary看ViewModel生命周期监控

前面两篇文章中已经了解了LeakCanary中Service和Fragment生命周期监控的实现&#xff0c;那么ViewModel生命周期监控又是怎么实现的呢&#xff1f; 同样的&#xff0c;要了解ViewModel生命周期监控&#xff0c;我们首先应该清楚在代码结构中ViewModel是如何存储获取的&#xf…

【零基础自用】理解python为什么要用虚拟环境

不知道学过MATLAB或者R的小伙伴刚刚接触python的时候会不会被各种python版本&#xff0c;包版本&#xff0c;虚拟环境之类的搞的头晕眼花。 问题一 包版本 先来假设&#xff0c;我们自己开发了一个包MyPackage 1.0&#xff0c;里面包含一个模块叫PreTrained&#xff0c;然后去…

Python爬虫(十三)_案例:使用XPath的爬虫

本篇是使用XPath的案例 案例&#xff1a;使用XPath的爬虫 现在我们用XPath来做一个简单的爬虫&#xff0c;我们尝试爬取某个贴吧里的所有帖子且将该帖子里每个楼层发布的图片下载到本地。 #-*- coding:utf-8 -*- #tieba_xpath.py"""作用&#xff1a;本案例使用…

【AGC】Publishing api怎么上传绿色认证审核材料

【问题描述】 华为应用市场会对绿色应用标上特有的绿色标识&#xff0c;代表其通过华为终端开放实验室DevEco云测平台的兼容性、稳定性、安全、功耗和性能的检测和认证&#xff0c;是应用高品质的象征。想要自己的应用认证为绿色应用就需要在发布应用时提供绿色认证审核材料&a…

Go语言基础之基本数据类型

Go语言中有丰富的数据类型&#xff0c;除了基本的整型、浮点型、布尔型、字符串外&#xff0c;还有数组、切片、结构体、函数、map、通道&#xff08;channel&#xff09;等。Go 语言的基本类型和其他语言大同小异。 基本数据类型 整型 整型分为以下两个大类&#xff1a; 按…

echarts 关于折线统计图常用的属性设置--超详细(附加源码)

文章目录 折线统计图设置x轴字体大小及字体颜色设置y轴字体大小及字体颜色设置背景颜色及设置折线颜色设置折线效果图显示阴影折线图位置及标签位置设置鼠标悬浮折线弹出窗口显示对应的数据设置自动横向滚动 总结 大家好&#xff01;近期我会分享几篇关于echarts方面的技术点&a…

easy-es 使用

1、pom中引入依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.14.0</version></dependency><dependency><groupId>org.…

CentOS ens160 显示disconnected

使用nmcli device查看网卡状态&#xff0c;显示如图&#xff1a; 检查宿主机系统VMware DHCP Sevice和VMware NAT Sevice服务是否正常运行。 右键点击我的电脑管理按钮&#xff0c;打开计算机管理点击服务

C语言实例_异或校验算法

一、异或校验算法 异或校验算法&#xff08;XOR校验&#xff09;是一种简单的校验算法&#xff0c;用于检测数据在传输或存储过程中是否发生了错误。通过将数据中的所有比特位相异或&#xff0c;生成一个校验码&#xff0c;然后将该校验码与接收到的数据进行比较&#xff0c;以…

如何大幅提高遥感影像分辨率(Python+MATLAB)

前言: 算法:NSCT算法(非下采样变换) 数据:Landsat8 OLI 遥感图像数据 编程平台:MATLAB+Python 论文参考:毛克.一种快速的全色和多光谱图像融合算法[J].测绘科学,2016,41(01):151-153+98.DOI:10.16251/j.cnki.1009-2307.2016.01.028. 左图:未进行融合的多光谱真彩色合…

ChatGPT逐句逐句地解释代码并分析复杂度的提示词prompt

前提安装chrome 插件 AI Prompt Genius&#xff0c; 请参考 3 个 ChatGPT 插件您需要立即下载 你是首席软件工程师。请解释这段代码&#xff1a;{{code}} 添加注释并重写代码&#xff0c;用注释解释每一行代码的作用。最后分析复杂度。快捷键 / 选择 Explain Code 输入代码提…

内网隧道代理技术(十七)之 NPS的使用

NPS的介绍和使用 NPS介绍 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,…

RFID技术助力汽车零配件装配产线,提升效率与准确性

随着科技的不断发展&#xff0c;越来越多的自动化设备被应用到汽车零配件装配产线中。其中&#xff0c;射频识别&#xff08;Radio Frequency Identification&#xff0c;简称RFID&#xff09;技术凭借其独特的优势&#xff0c;已经成为了这一领域的重要技术之一。本文将介绍RF…

Cpp基础Ⅰ之编译、链接

1 C是如何工作的 工具&#xff1a;Visual Studio 1.1 预处理语句 在.cpp源文件中&#xff0c;所有#字符开头的语句为预处理语句 例如在下面的 Hello World 程序中 #include<iostream>int main() {std::cout <"Hello World!"<std::endl;std::cin.get…