STM32开发--- F429IG+3.5寸显示屏( ILI9486) +汉字驱动
本文未完,更新中........2020.04.05
先上图,有图有真相:
文章结构:
实验平台
3.5寸ILI9486的特点
编写初始化代码
编写点读、写函数
英文字符显示代码
汉字显示代码
汉字字库的使用
一、实验平台搭建
屏幕:
- 材料器件:信泰微 3.5寸TFT_ILI9486驱动
- 选择理由:1:接口兼容正点原子的TFT34针; 2:够便宜,才43元入手的, 但买的时候没留意是不带触摸, 可惜
板子:
- 材料器件:魔女的开发板 STM32F429IGT6
- 选择理由:1:内置CMSIS-DAP下载器、虚拟串口,接线方便; 2:价钱实,这是硬道理
软件:
- Keil 5.27, 近来Keil又升级了,进入界面漂亮了,
- 没用库函数,没用HAL,全寄存器,并详细注释 ;用寄存器操作,查错除BUG就是速度
二、3.5寸驱动ILI9486的特点
这货最大的特点: 省钱! 所以3.5寸就它最大存量了. 比原子哥的3.5寸便宜一半以上, 但原子哥的代码中没它影子. 咱造一个呗!
参数上的特点 , 懒得百度了, 你也别管了, 做开发用啥的不是用, 来来去去就是写寄存器, 读寄存器。最直接的就是提取厂商的代码再根据项目优化, 别造轮子.
编写初始化代码
共需要初始化3个小部份
1:GPIO的初始化,因为板子、屏幕接口都和正点原子的一样,没必要造轮子,将在正点原子的代码基础上修改完善。
- 引脚有两种: 背光引脚推挽输出、FMS引脚使用复用功能
- 使用了魔女开发板团队提供的函数GPIOSet()对GPIO的初始化,比较简洁,函数会使能引脚时钟,并可设置引脚复用功能,就如下面只用了3行代码,就完成了屏幕所需21个引脚的初始化,和指定了引脚复用FMC功能。
// 控制背光引脚,推挽输出
GPIOSet(GPIOB, PIN5, G_MODE_OUT , G_OTYPE_PP , G_OSPEED_50M , G_PUPD_UP , 0); // GPIOD中需要的引脚, 使用FMC复用功能
GPIOSet(GPIOD, PIN0|PIN1|PIN4|PIN5|PIN7|PIN8|PIN9|PIN10|PIN13|PIN14|PIN15, G_MODE_AF , G_OTYPE_PP , G_OSPEED_100M , G_PUPD_UP , G_AF_FMC);
// GPIOE中需要的引脚, 使用FMC复用功能
GPIOSet (GPIOE, PIN7|PIN8|PIN9|PIN10|PIN11|PIN12|PIN13|PIN14|PIN15, G_MODE_AF , G_OTYPE_PP , G_OSPEED_100M , G_PUPD_UP , G_AF_FMC );
2:FMS的初始化,这个没啥好说的,如果想要理解FMC的原理,可以翻翻正点原子和野火的书,会比PDF详尽很多。
//bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。//这里我们使用NE1 ,也就对应BTCR[0],[1]。 FMC_Bank1->BTCR[0]=0X00000000;FMC_Bank1->BTCR[1]=0X00000000;FMC_Bank1E->BWTR[0]=0X00000000;//操作BCR寄存器 使用异步模式FMC_Bank1->BTCR[0]|=1<<12; //存储器写使能FMC_Bank1->BTCR[0]|=1<<14; //读写使用不同的时序FMC_Bank1->BTCR[0]|=1<<4; //存储器数据宽度为16bit //操作BTR寄存器 //读时序控制寄存器 FMC_Bank1->BTCR[1]|=0<<28; //模式A FMC_Bank1->BTCR[1]|=0XF<<0; //地址建立时间(ADDSET)为15个HCLK 1/192M=5.2ns*15=78ns //因为液晶驱动IC的读数据的时候,速度不能太快,尤其是个别奇葩芯片。FMC_Bank1->BTCR[1]|=70<<8; //数据保存时间(DATAST)为60个HCLK =5.2*70=360ns//写时序控制寄存器 FMC_Bank1E->BWTR[0]|=0<<28; //模式A FMC_Bank1E->BWTR[0]|=15<<0; //地址建立时间(ADDSET)为15个HCLK=78ns//10个HCLK(HCLK=180M),某些液晶驱动IC的写信号脉宽,最少也得50ns。 FMC_Bank1E->BWTR[0]|=15<<8; //数据保存时间(DATAST)为5.2ns*15个HCLK=78ns//使能BANK1,区域1FMC_Bank1->BTCR[0]|=1<<0; //使能BANK1,区域1
初始化了GPIO和FMC,不着急初始化屏幕芯片ILI9486, 先测试一下能否读取屏幕型号,以判断连接和之前的初始化是否正确。
//判断LCD TFT 9486是否连通:尝试ILI9486 ID的读取 delay_ms(10); // delay 50 ms LCD_REG = 0XD3 ; xLCD.ID = LCD_RAM; // dummy read xLCD.ID = LCD_RAM; // 读到0X00xLCD.ID = LCD_RAM; // 读取93 xLCD.ID <<=8;xLCD.ID |=LCD_RAM; // 读取41 if(xLCD.ID!=0x9486) // 判断是否连通{printf("错误: 没检测到TFT_3.5寸; 型号值读取:0x%X; 将放弃本屏幕的使用!\r", xLCD.ID);xLCD.InitOK = 0; return;}
其中:LCD_REG是在h文件中的宏定义, 使用指针直接读写内存中的值,这个内存段是FMC使用的区域,可理解显存区域。
#define LCD_REG (*(u16 *)(0x6007FFFE)) // (*(u16 *)(0x60000000 | 0x0007FFFE))
#define LCD_RAM (*(u16 *)(0x6008000E)) // (*(u16 *)((0x60000000 | 0x0007FFFE)+16)))
还有一个xLCD,是一个结构体,习惯了每个外设的c文件都初始化一个独立的结构体,存放设备自己数据
//LCD重要参数集struct { u8 InitOK; u16 width; //LCD 宽度u16 height; //LCD 高度u16 ID; //LCD IDu8 dir; //横屏还是竖屏控制:0,竖屏;1,横屏。 u16 wramcmd; //开始写gram指令u16 setxcmd; //设置x坐标指令u16 setycmd; //设置y坐标指令 }xLCD;
回到判断连接的思路上,语句if(xLCD.ID!=0x9486)进行判断,如果读取的值不是0x9486, 就退出,不再继续9486芯片的配置。
3:屏幕芯片ILI9486的初始化、配置
这部分按照厂家的步骤进行,几乎都是复制+粘贴了。
//************* Start Initial Sequence **********// LCD_REG = 0XF9;LCD_RAM = 0x00;LCD_RAM = 0x08;LCD_REG = 0xC0;LCD_RAM = 0x19;//VREG1OUT POSITIVELCD_RAM = 0x1a;//VREG2OUT NEGATIVELCD_REG = 0xC1;LCD_RAM = 0x45;//VGH,VGL VGH>=14V.LCD_RAM = 0x00;LCD_REG = 0xC2;LCD_RAM = 0x33;LCD_REG = 0XC5;LCD_RAM = 0x00;LCD_RAM = 0x28;//VCM_REG[7:0]. <=0X80.LCD_REG = 0xB1;LCD_RAM = 0xA0;//0XB0 =70HZ, <=0XB0.0xA0=62HZLCD_RAM = 0x11;LCD_REG = 0xB4;LCD_RAM = 0x02; //2 DOT FRAME MODE,F<=70HZ.LCD_REG = 0xB6;LCD_RAM = 0x00;LCD_RAM = 0x42;//0 GS SS SM ISC[3:0];LCD_RAM = 0x3B; LCD_REG = 0xB7;LCD_RAM = 0x07;LCD_REG = 0xE0;LCD_RAM = 0x1F;LCD_RAM = 0x25;LCD_RAM = 0x22;LCD_RAM = 0x0B;LCD_RAM = 0x06;LCD_RAM = 0x0A;LCD_RAM = 0x4E;LCD_RAM = 0xC6;LCD_RAM = 0x39;LCD_RAM = 0x00;LCD_RAM = 0x00;LCD_RAM = 0x00;LCD_RAM = 0x00;LCD_RAM = 0x00;LCD_RAM = 0x00;LCD_REG = 0XE1;LCD_RAM = 0x1F;LCD_RAM = 0x3F;LCD_RAM = 0x3F;LCD_RAM = 0x0F;LCD_RAM = 0x1F;LCD_RAM = 0x0F;LCD_RAM = 0x46;LCD_RAM = 0x49;LCD_RAM = 0x31;LCD_RAM = 0x05;LCD_RAM = 0x09;LCD_RAM = 0x03;LCD_RAM = 0x1C;LCD_RAM = 0x1A;LCD_RAM = 0x00;LCD_REG = 0XF1;LCD_RAM = 0x36;LCD_RAM = 0x04;LCD_RAM = 0x00;LCD_RAM = 0x3C;LCD_RAM = 0x0F;LCD_RAM = 0x0F;LCD_RAM = 0xA4;LCD_RAM = 0x02;LCD_REG = 0XF2;LCD_RAM = 0x18;LCD_RAM = 0xA3;LCD_RAM = 0x12;LCD_RAM = 0x02;LCD_RAM = 0x32;LCD_RAM = 0x12;LCD_RAM = 0xFF;LCD_RAM = 0x32;LCD_RAM = 0x00;LCD_REG = 0XF4;LCD_RAM = 0x40;LCD_RAM = 0x00;LCD_RAM = 0x08;LCD_RAM = 0x91;LCD_RAM = 0x04;LCD_REG = 0XF8;LCD_RAM = 0x21;LCD_RAM = 0x04;LCD_REG = 0x36;LCD_RAM = 0x48;LCD_REG = 0x3A;LCD_RAM = 0x55;LCD_REG = 0x11;delay_ms(20);LCD_REG = 0x29; //重新配置写时序控制寄存器的时序 FMC_Bank1E->BWTR[0]&=~(0XF<<0); // 地址建立时间(ADDSET)清零 FMC_Bank1E->BWTR[0]&=~(0XF<<8); // 数据保存时间清零FMC_Bank1E->BWTR[0]|=4<<0; // 地址建立时间(ADDSET)为4个HCLK =21ns FMC_Bank1E->BWTR[0]|=4<<8; // 数据保存时间(DATAST)为5.2ns*4个HCLK=21nsSetDir(1); // 横屏 1,3 竖屏0,3ScanDir(3); // 默认扫描方向 LCD_On();
上面代码的最后,有两处要注意:重新配置FMC的一些时序, 设置了屏幕的显示方向,其中的3个小函数,可以完整代码中查看。
未完,待续.....
读写操作已优化,文件、函数结构也已优化,直接调用即可。
c文件可不用修改,主要是按h文件的函数声明调用。
注意字库的使用,本代码使用的是w25q128, GBK字库起始地址:0x00200000
字库
显示ASCII字符
显示汉字
STM32开发--- F429IG+3.5寸显示屏( ILI9486) +汉字驱动相关推荐
- 基于STM32的0.96寸OLED显示屏显示汉字+数字
文章目录 一.SPI协议 1.什么是SPI协议 2. SPI 协议的物理层和协议层 二.0.96寸OLED屏 三.使用OLED屏显示数据 1.下载程序 2.打开工程 3.部分代码 4.编译并烧录 5. ...
- STM32开源代码——0.96寸OLED显示屏IIC(可显示汉字)
正点原子精英开发板 模块化封装,入口函数简明,易上手操作 展示main.c代码,完整代码请下载 点击下载代码 #include "led.h" #include "del ...
- 开发实践丨用小熊派STM32开发板模拟自动售货机
摘要:本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代码,通过云端开发和设备终端开发,实现终端数据在的华为云平台显示. 本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代 ...
- 野火洋桃STM32开发版学习指导完整版
该文章是我历时一个月整理总结而成,专门针对想要通过野火&洋桃STM32开发板入门stm32的读者.由于csdn编辑限制,该学习指导只包含文字信息.如需查看含图片的完整版可进入我的博客下载页.完 ...
- 野火stm32开发板给定一个脉冲程序_STM32开发板哪个好,推荐一款高性价比stm32MP157开发板...
一款能跑Linux的STM32开发板: 一款既可以玩Linux又可以玩单片机的开发板: 一款可同时学习A7和M4的双核异构开发板: 一款支持最新的Linux 5.4.31系统和u-boot 20200 ...
- 正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植
正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植 正点原子官方CSDN 4.3 寸多点电容触摸屏测试问题 正点原子gt9xx系列linux驱动移植 1. ...
- NBIOT 移远BC28模块+stm32开发板例程、教程(打通TCP、COAP协议)
为了开发者能够快速入门BC28的开发,加快开发者的项目进度,开发出此款针对BC28的stm32开发板和完善的发送网络数据的示例程序(TCP协议.COAP协议),程序流程逻辑清楚,注释完善,上手就可以玩 ...
- buntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立
之前在e络盟的意法半导体掏了一个STM32开发板挺好的,却不想在window下开发,也不想用那么占内存的IAR MDK等软件,所以决定在ubuntu下建立该开发环境,像之前avr linux一样,找了 ...
- STM32开发 -- UCOSII移植
一.UCOS简介 之前讲过一部分UCOSII,参看:STM32开发 – UCOSII 但是讲的有点糙了,现在参看正点原子的STM32F4 UCOS开发手册 V3.0,重点看一下UCOSII和UCOSI ...
最新文章
- 知乎千万级高性能长连接网关是如何搭建的
- Django View使用装饰器捕获数据库连接异常
- java IO(输入输出) 字节缓冲流
- 【openSUSE】软件源和软件搜索
- Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?
- SAP云平台上部署应用时遇到disk quota不够的问题
- 为什么个体户贷款那么难
- mysql8 授权远程登录_MySQL8 远程授权访问
- 他是哈佛计算机博士,却成落魄画家,后逆袭为硅谷创业之父 |人物志
- 在Zuul中设置服务访问限流
- 中国的脑部研究--脑网络组图谱
- Mysql数据库课程设计
- ARM一面(二轮技术面)
- Matlab 简单图像分割实战
- 图解RAM结构与原理,系统内存的Channel、Chip与Bank
- libpqxx 库安装configure: error:Linking a call to libpq failed in C++, even though it succeeded in C.
- 查询oracle数据库表名和中文名
- 蓝绿部署、金丝雀发布(灰度发布)、A/B测试的准确定义
- android动态分区AB升级,Android A/B System OTA分析(四)系统的启动和升级
- 蚂蚁金服入职考试_阿里巴巴蚂蚁金服面试通过,多久给offer?