本文未完,更新中........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) +汉字驱动相关推荐

  1. 基于STM32的0.96寸OLED显示屏显示汉字+数字

    文章目录 一.SPI协议 1.什么是SPI协议 2. SPI 协议的物理层和协议层 二.0.96寸OLED屏 三.使用OLED屏显示数据 1.下载程序 2.打开工程 3.部分代码 4.编译并烧录 5. ...

  2. STM32开源代码——0.96寸OLED显示屏IIC(可显示汉字)

    正点原子精英开发板 模块化封装,入口函数简明,易上手操作 展示main.c代码,完整代码请下载 点击下载代码 #include "led.h" #include "del ...

  3. 开发实践丨用小熊派STM32开发板模拟自动售货机

    摘要:本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代码,通过云端开发和设备终端开发,实现终端数据在的华为云平台显示. 本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代 ...

  4. 野火洋桃STM32开发版学习指导完整版

    该文章是我历时一个月整理总结而成,专门针对想要通过野火&洋桃STM32开发板入门stm32的读者.由于csdn编辑限制,该学习指导只包含文字信息.如需查看含图片的完整版可进入我的博客下载页.完 ...

  5. 野火stm32开发板给定一个脉冲程序_STM32开发板哪个好,推荐一款高性价比stm32MP157开发板...

    一款能跑Linux的STM32开发板: 一款既可以玩Linux又可以玩单片机的开发板: 一款可同时学习A7和M4的双核异构开发板: 一款支持最新的Linux 5.4.31系统和u-boot 20200 ...

  6. 正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植

    正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植 正点原子官方CSDN 4.3 寸多点电容触摸屏测试问题 正点原子gt9xx系列linux驱动移植 1. ...

  7. NBIOT 移远BC28模块+stm32开发板例程、教程(打通TCP、COAP协议)

    为了开发者能够快速入门BC28的开发,加快开发者的项目进度,开发出此款针对BC28的stm32开发板和完善的发送网络数据的示例程序(TCP协议.COAP协议),程序流程逻辑清楚,注释完善,上手就可以玩 ...

  8. buntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立

    之前在e络盟的意法半导体掏了一个STM32开发板挺好的,却不想在window下开发,也不想用那么占内存的IAR MDK等软件,所以决定在ubuntu下建立该开发环境,像之前avr linux一样,找了 ...

  9. STM32开发 -- UCOSII移植

    一.UCOS简介 之前讲过一部分UCOSII,参看:STM32开发 – UCOSII 但是讲的有点糙了,现在参看正点原子的STM32F4 UCOS开发手册 V3.0,重点看一下UCOSII和UCOSI ...

最新文章

  1. 知乎千万级高性能长连接网关是如何搭建的
  2. Django View使用装饰器捕获数据库连接异常
  3. java IO(输入输出) 字节缓冲流
  4. 【openSUSE】软件源和软件搜索
  5. Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?
  6. SAP云平台上部署应用时遇到disk quota不够的问题
  7. 为什么个体户贷款那么难
  8. mysql8 授权远程登录_MySQL8 远程授权访问
  9. 他是哈佛计算机博士,却成落魄画家,后逆袭为硅谷创业之父 |人物志
  10. 在Zuul中设置服务访问限流
  11. 中国的脑部研究--脑网络组图谱
  12. Mysql数据库课程设计
  13. ARM一面(二轮技术面)
  14. Matlab 简单图像分割实战
  15. 图解RAM结构与原理,系统内存的Channel、Chip与Bank
  16. libpqxx 库安装configure: error:Linking a call to libpq failed in C++, even though it succeeded in C.
  17. 查询oracle数据库表名和中文名
  18. 蓝绿部署、金丝雀发布(灰度发布)、A/B测试的准确定义
  19. android动态分区AB升级,Android A/B System OTA分析(四)系统的启动和升级
  20. 蚂蚁金服入职考试_阿里巴巴蚂蚁金服面试通过,多久给offer?

热门文章

  1. 微信小程序的民宿酒店客房预订管理系统uniapp
  2. 【VBA编程】excel表格中特定文字加上下划线
  3. 韩锋:我坚信下一轮牛市将出现在数字私有化风口上 | 《8问》
  4. 蓝牙耳机与电脑连接使用
  5. word文件名后自动加1_那些Word的使用小技巧
  6. 分享业余时间开发的一个影视采集及管理系统
  7. 平板点餐linux系统下载,基于Linux的智能点餐系统.pdf
  8. kubernetes安装Kuboard
  9. fiddler设置网速模拟弱网络测试
  10. JavaScript 深拷贝