注:资料借鉴正点原子正点精英板STM32F1开发指南(库函数版);程序是正点精英板STM32F1实验四十三章图片显示实验。
程序地址:实验38图片显示实验.7z-嵌入式文档类资源-CSDN下载
目录
1绪论
1.1选题的背景
1.2选题的目的
1.3选题的意义
1.4设计思路和方法
1.5重点与难点分析
1.6设计的预期效果
2模块说明
2.1TFTLCD 简介
2.1.1 ILI9341 液晶控制器
2.2 FSMC 简介
2.3 SD 简介
2.3.1 SDIO 简介
2.3.2 SD电路原理图
2.4 STM32串口简介
2.5 FATFS 简介
3硬件设计
4系统软件设计
4.1开发环境与语言
4.3软件流程图
5 系统测试与实现
5.1软件调试与实现
5.2实物的调试与实现
6总结与展望
6.1总结
参考文献
1绪论
1.1选题的背景
进入新世纪的第1年,TFFLCD液晶显示的重要关键技术取得重大突破,液晶显示技术进入实用阶段的快速成长期。从现在开始,新型液晶显示技术将会逐步取代传统的CRT显示技术,从而实现工业自动化系统人机界面的全数字化。
1.2选题的目的
液晶具有低电压、微功耗、易彩色化、被动显示等特点,其显示器种类非常繁多,屏幕面积从几平方毫米到近一平方米,液晶显示方式可分为直视式显示、投影显示及虚拟式显示。因而液晶显示应用几乎覆盖所有显示应用领域。液晶显示是主流的显示技术, TFTLCD是主导的平板显示技术。所以本次课程设计主要是运用STM32对TFTLCD液晶显示屏进行开发,制作一个简易的照片查看器。
1.3选题的意义
通过本次课程设计,积累了更多项目开发的经验。在理解TFTLCD液晶显示屏的底层原理的基础下,使用STM32相关的库函数去驱动TFT LCD液晶屏并且完成照片查看器设计项目。在这个过程中更加深入的理解了STM32的基础知识,并掌握TFTLCD液晶屏的驱动原理,它主要由ILI9341液晶控制器驱动其中包含六个重要的ILI9341 命令。
1.4设计思路和方法
- 首先设置 STM32F1 与 TFTLCD 模块相连接的 IO。这一步,先将我们与 TFTLCD 模块相连的 IO 口进行初始化,以便驱动 LCD。需要用到的是FSMCFSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接,STM32的FSMC 接口支持包括 SRAM、NAND FLASH、NOR FLASH 和 PSRAM 等存储器。 STM32 的 FSMC 将外部设备分为 3 类:NOR/PSRAM 设备、NAND 设备、PC 卡设备。他们共用地址数据总线等信号,他们具有不同的 CS 以区分不同的设备,比如本次用到的 TFTLCD 就是用的 FSMC_NE4 做片选,其实就是将 TFTLCD 当成 SRAM 来控制。
- 初始化 TFTLCD 模块。 在初始化之后,LCD 才可以正常使用。
- 通过图片转换工具获取16进制数组。
- 调用相关的函数就可以实现图片了。
- 方案一想通过SD卡,进行文件的读写操作,来实现对照片的储存,但是由于SD卡的文件系统和源程序提供的系统不符合,导致读取文件一直失败。
- TFTLCD液晶屏是16 位真彩显示,ILI9341 采用 RGB565 格式存储颜色数据,这样 MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。数值越大,表示该颜色越深。另外,特别注意 ILI9341 所有的指令都是 8 位的(高 8 位无效),且参数
- 除了读写 GRAM 的时候是 16 位,其他操作参数,都是 8 位的,这个和 ILI9320 等驱动器不一 样,必须加以注意。
通过程序的烧录将照片显示在屏幕上,并且通过按键实现照片的左右切换,实现基本的照片查看器的功能。
2模块说明
2.1TFTLCD 简介
本次运用的是2.8寸的 ALIENTEK TFTLCD 模块,该模块支持 65K 色显示,显示分辨率为 320×240,接口为 16 位的 80 并口自带触摸屏。 如图一所示:
图一
ALIENTEK TFTLCD 模块采用 16 位的并方式与外部连接,因为彩屏的数据量比较大,希望速度越快越好,所以选择 16 位的接口。
如图二所示:
图二
模块的80并口有如下一些信号线:
CS:TFTLCD 片选信号;WR:向 TFTLCD 写入数据;RD:从 TFTLCD 读取数据; D[15:0]:16 位双向数据线;RST:硬复位 TFTLCD;RS:命令/数据标志(0,读写命令;1,读写数据)。
2.1.1 ILI9341 液晶控制器
ILI9341 采用 RGB565 格式存储颜色数据,此时 ILI9341 的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系如图三所示:
图三
从图中可以看出,ILI9341 在 16 位模式下面,数据线有用的是:D17~D13 和 D11~D1,D0 和 D12 没有用到,实际上在我们 LCD 模块里面,ILI9341 的 D0 和 D12 压根就没有引出来,这样,ILI9341 的 D17~D13和D11~D1对应MCU的D15~D0。这样 MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。数值越大,表示该颜色越深。
ILI9341 的六个重要命令0XD3,0X36,0X2A,0X2B,0X2C,0X2E 。一般 TFTLCD 模块的使用流程如图四:
图四
2.2 FSMC 简介
FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接, STM32 的 FSMC 接口支持包括 SRAM、NAND FLASH、NOR FLASH 和 PSRAM 等存储器。FSMC 的框图如图五所示:
图五
从上图我们可以看出,STM32 的 FSMC 将外部设备分为 3 类:NOR/PSRAM 设备、NAND设备、PC 卡设备。他们共用地址数据总线等信号,他们具有不同的 CS 以区分不同的设备,比 如本章我们用到的 TFTLCD 就是用的 FSMC_NE4 做片选,其实就是将 TFTLCD 当成 SRAM 来控制。
2.3 SD 简介
2.3.1 SDIO 简介
STM32F1的SDIO控制器支持多媒体卡(MMC 卡)、SD 存储卡、SD I/O 卡和CE_ATA 设 备等。SDIO 的主要功能如下:
➢ 与多媒体卡系统规格书版本 4.2 全兼容。支持三种不同的数据总线模式:1 位(默认)、
4 位和 8 位。
➢ 与较早的多媒体卡系统规格版本全兼容(向前兼容)。
➢ 与 SD 存储卡规格版本 2.0 全兼容。
➢ 与 SD I/O 卡规格版本 2.0 全兼容:支持良种不同的数据总线模式:1 位(默认)和 4 位。
➢ 完全支持CE_ATA 功能(与CE_ATA数字协议版本 1.1 全兼容)。8 位总线模式下数据传输速率可达 48MHz。
➢ 数据和命令输出使能信号,用于控制外部双向驱动器。
STM32F1 的 SDIO 控制器包含 2 个部分:SDIO 适配器模块和 AHB 总线接口,其功能框图
如图六所示:
图六
2.3.2 SD电路原理图
图七
2.4 STM32串口简介
STM32 的串口资源相当丰富的,功能也相当强劲。ALIENTEK 精英 STM32 开发板所使用
的 STM32F103ZET6 最多可提供5路串口,有分数波特率发生器、支持同步单线通信和半双工
单线通讯、支持 LIN、支持调制解调器操作、智能卡协议和 TRDA SIR ENDEC规范、具有DMA
等。
2.5 FATFS 简介
FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。它完 全用标准 C 语言编写,所以具有良好的硬件平台独立性,可以移植到 8051、PIC、AVR、SH、Z80、H8、ARM 等系列单片机上而只需做简单的修改。它支持 FATl2、FATl6 和 FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优化。
FATFS 的特点有:
⚫ Windows 兼容的 FAT 文件系统(支持 FAT12/FAT16/FAT32)
⚫ 与平台无关,移植简单
⚫ 代码量少、效率高
⚫ 多种配置选项
⚫ 支持多卷(物理驱动器或分区,最多 10 个卷)
⚫ 多个 ANSI/OEM 代码页包括 DBCS
⚫ 支持长文件名、ANSI/OEM 或 Unicode
⚫ 支持 RTOS
⚫ 支持多种扇区大小
⚫ 只读、最小化的 API 和 I/O 缓冲区等
FATFS 模块的层次结构如图八所示:
图八
3硬件设计
本实验用到的硬件资源有:
- 指示灯 DS0 和 DS1
图九
- KEY0、KEY1 和 KEY_UP 三个按键
图十
- 串口
图十一
- TFTLCD 模块
图十二
- SD 卡
图十三
6) SPI FLASH
图十四
4系统软件设计
4.1开发环境与语言
照片查看器的项目工程根目录文件夹下新建一个 PICTURE的文件夹。在该文件夹里面新建 bmp.c、bmp.h、tjpgd.c、tjpgd.h、integer.h、gif.c、gif.h、piclib.c和 piclib.h 等 9 个文件。同时在工程中新建 PICTURE 分组,将其中的C源文件添加到该分组下,同时将 PICTURE 文件夹加入头文件包含路径。mp.c和bmp.h 用于实现对 bmp 文件的解码;tjpgd.c 和 tjpgd.h 用于实现对 jpeg/jpg 文件的解码;gif.c 和 gif.h 用于实现对 gif 文件的解码.
1、piclib.c源文件中:
(1)piclib_init 函数,该函数用于初始化图片解码的相关信息,其中_pic_phy 是我们在 piclib.h里面定义的一个结构体,用于管理底层 LCD 接口函数,这些函数必须由用户在外部实现。_pic_info 则是另外一个结构体,用于图片缩放处理。
(2)piclib_alpha_blend 函数,该函数用于实现半透明效果,在小格式(图片分辨率小于 LCD 分辨率)bmp 解码的时候,可能被用到。
(3)ai_draw_init 函数,该函数用于实现图片在显示区域的居中显示初始化,其实就是根据图片大小选择缩放比例和坐标偏移值。
(4)is_element_ok 函数,该函数用于判断一个点是不是应该显示出来,在图片缩放的时候该函数是必须用到的。
(5)ai_load_picfile 函数,该函数是整个图片显示的对外接口,外部程序,通过调用该函数,可以实现 bmp、jpg/jpeg 和 gif 的显示,该函数根据输入文件的后缀名,判断文件格式,然后交给相应的解码程序(bmp 解码/jpeg 解码/gif 解码),执行解码,完成图片显示。注意,这里我们用到一个 f_typetell 的函数,来判断文件的后缀名,f_typetell 函数在 exfuns.c 里面实现.
(6)pic_memalloc 和 pic_memfree 分别用于图片解码时需要用到的内存申请和释放,通
过调用 mymalloc 和 myfreee 来实现。
- main.c 源文件:
初始化部分:
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
usmart_dev.init(72); //初始化USMART
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化按键
LCD_Init(); //初始化LCD
W25QXX_Init(); //初始化W25Q128
my_mem_init(SRAMIN); //初始化内部内存池
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs[0],"0:",1); //挂载SD卡
f_mount(fs[1],"1:",1); //挂载FLASH.
POINT_COLOR=RED;
此部分除了 mian 函数,还有一个 pic_get_tnum 的函数,用来得到 path 路径下,所有有效 文件(图片文件)的个数。在 mian 函数里面我们通过索引(图片文件在 PICTURE 文件夹下的编号),来查找上一个/下一个图片文件,这里我们需要用到 FATFS 自带的一个函数:dir_sdi,来设置当前目录的索引(因为 f_readdir 只能沿着索引一直往下找,不能往上找),方便定位到任何一个文件。dir_sdi 在 FATFS 下面被定义为 static 函数,所以我们必须在 ff.c 里面将该函数的 static 修饰词去掉,然后在 ff.h 里面添加该函数的申明,以便 main 函数使用。
4.3软件流程图
图十五
5 系统测试与实现
5.1软件调试与实现
- 初始方案将图片信息写在.h文件中,最多可以储存3张照片,与项目要求相差很大。
- 升级方案,采用SD卡,利用文件的读写和TFTLCD的相关功能实现,实现最终方案;
- 优化项目最终完成照片查看器项目的开发。
图十六
5.2实物的调试与实现
- 程序烧录成功就显示功能说明,然后循环显示SD卡里面的照片。
- 按下key_up关闭图片循环播放功能,并且LED1灯一直发亮,会按下key0和key1进行图片上下切换。
- 切换图片完成时指示灯闪烁,说明照片切换完成。
演示流程如下所示:
图十七
按下key_up时,LED1亮起,显示图片二:
图十八
上一张,显示文件中最后一张图片图片四:
图十九
下一张,显示文件中第二张图片,图片3:
图二十
6总结与展望
6.1总结
本次课程设计项目开发,对我们小组的每个成员来说都是一个增加自己项目经验和提高自己专业素养能力的机会。每个组员在本次的项目开发过程中,态度都是十分端正的,积极配合组长安排,按时按完成了各自任务,有效锻炼了自己团队意识和团队协作能力,提升了自己的责任感。在实践中,组员们都是积极尝试,攻坚克难,积极查阅资料解决了一个又一个困难,同时收获许多专业和项目开发经验。总的来说,我们小组每个成员通过本次课程设计都有了巨大的收获和感悟。
参考文献
[1]杨志佳,陈小平.STM32F429的TFTLCD显示驱动方案的研究[J].单片机与嵌入式系统应用,2016,16(12):44-47.
[2]刘静. 基于ARM嵌入式教学实验平台的设计与开发[D].电子科技大学,2014.
[3]焦江丽,李凤莲.以ARM Cortex-M3为基础的STM32开发板的设计与实现[J].中国新通信,2013,15(09):94-96.
[4]勾慧兰,刘光超.基于STM32的最小系统及串口通信的实现[J].工业控制计算机,2012,25(09):26-28.
[5]李世奇,董浩斌,李荣生.基于FatFs文件系统的SD卡存储器设计[J].测控技术,2011,30(12):79-81.DOI:10.19708/j.ckjs.2011.12.020.
[6]孙书鹰,陈志佳,寇超.新一代嵌入式微处理器STM32F103开发与应用[J].微计算机应用,2010,31(12):59-63.
[7]黄平.基于DRAM、FPGA的专用LCD显示接口设计与实现[J].微计算机信息,2007(14):191-192+186.
[8]黄锡珉.液晶显示技术发展轨迹[J].液晶与显示,2003(01):1-6.
[9]杨虹,凌志华,王刚,唐志勇,黄锡珉,金圣经.高画质、低功耗的TFTLCD直接驱动方法[J].液晶与显示,1999(04):296-301.
[10]黄锡珉.TFT LCD技术的进步[J].液晶与显示,1999(02):3-13.