为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于STM32在LCD上显示SD卡中BMP图片的设计

2017-09-02 39页 doc 605KB 202阅读

用户头像

is_731942

暂无简介

举报
基于STM32在LCD上显示SD卡中BMP图片的设计基于STM32在LCD上显示SD卡中BMP图片的设计 上海第二工业大学 实 训 报 告 课程名称, 电信专业综合实践 学生姓名, xx xx xx 学号,201x4820xxx 201x4820xxx 201x4820xxx 学院名称, 工学部 专业班级, xx电信A1 目录 摘要:................................................................ 1 第一章 绪 论............................................
基于STM32在LCD上显示SD卡中BMP图片的设计
基于STM32在LCD上显示SD卡中BMP图片的设计 上海第二工业大学 实 训 报 告 课程名称, 电信专业综合实践 学生姓名, xx xx xx 学号,201x4820xxx 201x4820xxx 201x4820xxx 学院名称, 工学部 专业班级, xx电信A1 目录 摘要:................................................................ 1 第一章 绪 论........................................................ 1 1.2本课题设计的背景 .............................................. 1 1.2 本课题设计内容 ................................................ 2 第二章 实验的总体设计 ............................................ 3 2.1详细设计组成框图: ............................................ 3 2.2相关硬件简介 .................................................. 3 2.3相关硬件原理图 ............................................... 12 第三章 设计流程图 ................................................... 19 第四章 硬件设计 ..................................................... 20 4.1中英文显示部分设计 ........................................... 20 4.2 BMP图片部分设计 ............................................. 21 4.3 SD卡读取的内容 .............................................. 22 第五章 软件设计 ..................................................... 23 5.1主函数部分程序设计 ........................................... 23 5.2按键程序设计 ................................................. 27 5.3 LED灯程序设计 ............................................... 33 第六章 系统调试结果及问题分析 ...................... 3错误~未定义书签。 6.1 系统调试后的实验现象 ........................ 3错误~未定义书签。 6.2 遇到的问题及解决办法 ......................................... 38 第七章 总结.......................................................... 39 7.1思考与总结 ................................................... 39 7.2参考文献: ................................................... 40 基于STM32在LCD上显示SD卡中BMP图片的设计 摘要,设计了一种基于STM32的处理器的按键式控制的BMP图片切换系统。在设计过程中采用了SD卡中读取BMP格式图片及汉字字库,使LCD屏幕显示相关提示内容及设定格式的BMP图片。完成了基于ARM最新Cortex-M3内核的处理器STM32的BMP图片切换系统的硬件电路和软件程序的设计,实现了一个能在内存有限的片上系统中进行BMP图片切换的系统。 关键词,BMP图片,SD卡,ARM微控制器,STM32,片上系统 第一章 绪 论 1.1本课题设计的背景 随着国民经济的起飞,现代社会的不断进步,广告的在新时期又有了新的发展。 进入新世纪LCD显示屏的技术和产业都取得了长足的发展,作为重要的现代信息发布媒体之一,LCD显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。伴随社会信息化进程的推进,LCD显示屏技术也在不断的推陈出新,应用领域愈加广阔。基于STM32的LCD显示可以更好的满足各种需求,也更便于操作和实现。现基于STM32在液晶显示屏幕上显示文本及图形。 目前,显示技术和显示工业的发展迅速。显示技术是传递视觉的信息技术。液晶显示器件LCD是当今最有发展前途的一种平板显示器件,它具有很多独到的优异特性。它具有显示信息多、易于多彩化、体积小、重量轻、功耗低、寿命长、价格低、无辐射、无污染、接口控制方便等优点。 截至目前,我国在液晶显示取得较大进步,我国LCD产业已经走过了近30年的历程.经历几次大的投资浪潮之后,我国内地已经成为世界最大的TN-LCD(扭曲液晶显示器)生产基地和主要的STN-LCD(超扭曲液晶显示器)生产基地,并且从2003年开始,涉足TFT-LCD(薄膜晶体管液晶显示器)领域. 1.2 本课题设计内容 本次设计采用STM32ISO开发板,实现一个从SD卡读取图片内容及汉子库在LCD显示屏上显示由按键控制图片切换的功能。本实验用到的硬件部分主要有STM32开发板、USB线、LCD液晶模块、SD卡、J-Link仿真器等主要部分组成。STM32开法板涉及Keil5程序的读取,SD卡读取裁剪过的图片,最后通过J-Link仿真器加载后,在LCD显示屏上显示相关内容,中英文内容提示通过设置延时衔接,图片通过按键直接控制。 第二章 实验方案总体设计 2.1详细设计组成框图, SD卡 STM32开发板 蜂鸣器 LED灯 按键区 LCD液晶模块 Key1 Key2 2.2相关硬件简介 本节实验功能简介,开机的时候先初始化SD卡,如果SD卡初始化完成,则读取扇区0的数据,然后通过串口打印到电脑上。如果没初始化通过,则在LCD上提示初始化失败。 同样用DS0来指示程序正在运行。 所要用到的硬件资源如下, , STM32开发板 , USB线 , LCD液晶模块 , SD卡 , J-Link仿真器 2.2.1 STM32开发板 STM32F103系列属于中低端的32位ARM微控制器,该系列芯片是意法半导体,ST,公司出品,其内核是Cortex-M3。该系列芯片按片内Flash的大小可分为三大类,小容量,16K和32K,、中容量,64K和128K,、大容量,256K、384K和512K,。芯片集成定时器,CAN,ADC,SPI,I2C,USB,UART,等多种功能。 分为三大类, LD(小于64K), MD,小于256K,, HD,大于256K,, STM32F103VET6类属第三类。 STM32F103ZET6芯片介绍 ?基于ARM Cortex-M3核心的32 位微控制器,LQFP-144封装. ?512K 片内FLASH,相当于硬盘,,64K片内RAM,相当于内存, ,片内FLASH 支持在线编程(IAP). ?高达72M 的频率,数据,指令分别走不同的流水线,以确保 CPU运行速度达到最大化 . ?通过片内BOOT区,可实现串口下载程序(ISP). ?片内双RC 晶振,提供8M和32K 的频率. ?支持片外高速晶振(8M),和片外低速晶振(32K).其中片外低速晶振可用于 CPU 的实时时钟,带后备电源引脚,用于掉电后的时钟行走. ?42个16位的后备寄存器(可以理解为电池保存的RAM),利用外置的纽扣电池,和实现掉电数据保存功能. ?支持 JTAG,SWD调试.配合廉价的J-LINK,实现高速低成本的开发调试方案. ?多达80个IO(大部分兼容5V逻辑),4个通用定时器,2个高级定时器,2个基本定时器,3路SPI接口,2路I2S 接口,2路I2C接口,5路USART,一个USB从设备接口,一个 CAN接口,SDIO接口,可兼容SRAM,NOR和NAND Flash 接口的16位总线-FSMC. ?3路共16通道的12位AD输入,2路共2 通道的12位 DA 输出.支持片外独立电压基准. ?CPU操作电压范围:2.0-3.6V STM32开发板引脚图 2.2.2 USB线 USB开发涉及主机和设备,为了避免开发驱动程序,使用Windows自带的驱动程序。所以设备枚举成HID类设备。USB鼠标就是的USB-HID设备。不过操 作系统阻止了应用程序直接访问USB鼠标返回的报告。所以本例使用自定义HID设备。一来免去了开发驱动程序,二来自定义的HID设备应用程序和设备可以自由收发数据,仅指数据内容,。 USB是一个外部总线标准,用于电脑与外部设备的连接和通讯。USB接口即插即用和热插拔功能。USB接口可连接127种外设,如鼠标和键盘等。USB是在1994年底由英特尔等多家公司联合在1996年推出后,已成功替代串口和并口,已成为当今电脑与大量智能设备的必配接口。USB版本经历了多年的发展,到如今已经发展为3.0版本. 对于大多数工程师来说,开发USB2.0 接口产品主要障碍在于,要面对复杂的USB2.0、自己编写USB设备的驱动程序、熟悉单片机的编程。这不仅要求有相当的VC编程经验、还能够编写USB接口的硬件,固件,程序。所以大多数人放弃了自己开发USB产品。为了将复杂的问题简单化,西安达泰电子特别设计了USB2.0协议转换模块。USB20D模块可以被看作是一个USB2.0协议的转换器,将电脑的USB2.0接口转换为一个透明的并行总线,就象单片机总线一样。从而几天之内就可以完成USB2.0产品的设计。 本实验用到的USB线 2.2.3 液晶显示器LCD 控制器简介 液晶显示器(Liquid Crystal Display: LCD)的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。LCM(LCD Module)即LCD显示模组、液晶模块,是指将液晶显示器件,连接件,控制与驱动等外围电路,PCB电路板,背光源,结构件等装配在一起的组件。LCD,由于液晶显示屏功耗低、体积小,承载的信息量大,因而被广泛用于信息输出、与用户进行交互。由于 STM32 内部没有集成专用的液晶屏和触摸屏的控制接口,所以在显示面板中应自带含有驱动芯片的驱动电路(液晶屏和触摸屏的驱动电路是独立的),STM32 芯片通过驱动芯片来控制液晶屏和触摸屏。以本实验3.2 寸液晶屏(240*320)为例,它使用 ILI9341 芯 片控制液晶屏,通过 XPT2046 芯片控制触摸屏。LCD 为非发光性的显示装置,它需要借助背光源才能达到显示功能,LED 控制器就是用来控制液晶屏中的 LED 背光源。 液晶显示器在内部电路结构上主要有以下几个部分构成, 1、 驱动板,也叫主板,,主要是用以接收、处理从外部送进来的模拟,VGA,或者数字,DVI,视频信号,并通过屏线送出信号去控制液晶屏,PANEL,正常工作。驱动板上含有MCU单元,它是液晶显示器的检测控制中心和大脑。 2、 电源板,用于将90,240V 的交流电压转变为12V、5V、3V 等的直流电供给显示器工作。 本实验用的STM32开发板 3、 背光板,也叫高压板,,用于将主板或电源板输出的12V 的直流电压转变为PANEL 需要的高频的1500,1800V 的高压交流电,用于点亮PANEL的背光灯。电源板和背光板有时会做在一起也就是所谓的电源背光二合一板。 4、 液晶屏,液晶显示用模块,它是液晶显示器的核心部件,其包含液晶板和驱动电路。其中,液晶屏是液晶显示器内部最为关键的部件,它对液晶显示器的性能和价格具有决定性的作用。 本实验对应的背光板程序,程序很多不一一列举,仅取部分, ,1, ILI9341控制器结构 液晶屏的控制芯片内部结构非常复杂 ,最主要的是位于中间GRAM(Graphics RAM),可以理解为显存。GRAM 中每个存储单元都对应着液晶面板的一个像素点。它右侧的各种模块共同作用把 GRAM 存储单元的数据转化成液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。 接口与 MCU 进行通讯,MUC 通过 8080 接口与 ILI9341进行通讯,从而访问它的控制寄存器(CR)、地址计数器(AC)、及 GRAM。 ,2,像素点的数据格式 图像数据的像素点由红(R)、绿(G)、蓝(B)三原色组成,三原色根据其深浅程度被分为0~255 个级别,它们按不同比例的混合可以得出各种色彩。ILI9341 最高能够控制 18 位的 LCD,但为了数据传输简便,我们采用它的 16 位控制模式,以 16 位描述的像素点。按照标准格式,16 位的像素点的三原色描述的位数为 R,G,B =5,6,5,描述绿色的位数较多是因为人眼对绿色更为敏感。 ,3,ILI9341的通讯时序 目前,大多数的液晶控制器都使用 8080 或 6800 接口与 MCU 进行通讯,它们的时序十分相似,本实验以 ILI9341 使用的 8080 通讯时序进行分析. ILI9341 的 8080 接口有 5 条基本的控制信号线, , 用于片选的 CSX 信号线, , 用于写使能的 WRX 信号线, , 用于读使能的 RDX 信号线, , 用于区分数据和命令的 D/CX 信号线, , (用于复位的 RESX 信号线。 见图 23-2。 使用18条数据线的8080接口写命令时序 由图可知,写命令时序由 CSX 信号线拉低开始,D/CX 信号线也置低电平表示写入的是命令地址(可理解为命令编码,如软件复位命令,0x01),以 WRX 信号线为低,RDX 信号为高表示数据传输方向为写入,同时,在数据线[17:0]输出命令地址,在第二个传输阶段传送的为命令的参数,所以 D/CX 要置高电平,表示写入的是命令数据。 当我们需要向 GRAM 写入数据的时候,把 CSX 信号线拉低后,把 D/CX 信号线置为高电平,这时由 D[17:0]传输的数据则会被 ILI9341 保存至它的 GRAM 中。 ,4,给整个屏幕上色 再次回到 ILI9341_Init 函数,它调用完 ILI9341_REG_Config()初始化了液晶屏后,向ILI9341 发送了一个命令——写 GRAM 内容,即后面发送的数据都被解析为显示到屏幕像素点的数据。代码中使用 for 循环把语句 ILI9341_Write_Data(GBLUE)执行了 320*240 次,即把所有像素点都显示为 GBLUE 颜色。 ,5,液晶屏画点函数 LCD_Init ()初始化了液晶屏后,可以控制液晶上每个像素点的颜色。如果能够实现一个画点函数,在指定的(x,y)坐标像素点上显示指定的颜色,那么就能够实现一切液晶屏最复杂的显示功能,如在液晶屏指定位置显示形状、文字、图像,都可以通过调用画点函数或以类似 的 方 式 控 制 液 晶 的 像 素 点 。 本 实 验 中 的 画 点 函 数 ILI9341_SetPointPixel() 在bsp_ili9341_lcd.c 文件中定义,见代码清单 ,5,。 代码清单,5,, ILI9341_SetPointPixel()函数 代码清单,5, 2.2.4 J-Link ARM主要特点 J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器。配合IAR EWAR,ADS,KEIL,WINARM,RealView等集成开发环境支持所有ARM7/ARM9/ARM11,Cortex M0/M1/M3/M4, Cortex A5/A8/A9等内核芯片的仿真, 与IAR,Keil等编译环境无缝连接,操作方便、连接方便、简单易学,是学习开发ARM最好最实用的开发工具。产品规格,电源USB供电,整机电流 <50mA 支持的目标板电压 1.2 , 3.3V,5V兼容 目标板供电电压 4.5 , 5V (由USB提供5V) 目标板供电电流 最大300mA,具有过流保护功能 工作环境温度 +5?, +60? 存储温度 -20? , +65? 湿度 <90%尺寸,不含电缆, 100mm x 53mm x 27mm 重量,不含电缆,70g 电磁兼容 EN 55022, EN 5502 。 J-Link连接线 2.2.5 SD卡 SD卡,Secure Digital Memory Card,中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。SD记忆卡虽然体积小质量轻,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。SD卡控制器主要 实现两大功能,一是产生控制时序,复位、初始化以及设置SD卡,二是从SD卡中读出或写入数据。当处理器对初始化使能寄存器IER写使能操作时,主控模块启动SDlnit(复位,初始化模块),由SDlnit完成SD卡的初始化工作,当处理器将命令和地址分别写入命令控制寄存器CCR和地址偏移寄存器AOR时,主控模块启动SDcmd(命令控制)模块并将命令和地址传递给后者,由SDcmd模块完成与命令相应的操作。初始化模块SDlnit的作用是完成SD卡的初始化工作。当总线接口模块使能SDlnit后,SDinit通过SPITrans模块向SD卡发送复位命令(CMD40),然后等待复位命令的回执。如果复位成功(返回值为Ox01),则继续向SD卡发送初始化命令(CMD41),然后等待初始化命令的回执并将执行结果返回给主控模块以便处理器。对SD卡进行读写或其他操作前应首先将其初始化。命令控制模块SDCmd的作用是完成SD卡命令、参数、命令校验值的发送和命令回执的读取(如果是读写操作,还要进行数据的发送和接收)。主控模块使能SDCmd前会将SD命令、参数传递给后者。这样SDCmd使能后,首先将得到的命令、参数通过主控模块发送到SD卡,然后等待命令回执。如果当前命令是读、写之外的其他命令,则将执行结果返回给主控模块即可,如果是读、写命令,则收到正确的命令回执后,还要将数据接收并存至缓存或发送到SD卡。选择器模块Mux的作用是根据当前操作从SDlnit模块和SDCmd模块的输出信号中选择一路送至SPITrans模块。双口RAM是SD控制器的缓存,用来存储要送到SD卡和从SD卡上读取的数据。 SD记忆卡的结构 SD记忆卡具有机械式写入保护开关,以免至关重要的数据意外丢失。卡两侧的导槽可防止其插反了方向,一个凹口可防止器械掉落或撞击时,卡跳出其插孔。肋条可保护金属触点,以减少静电所引起的损坏可能性,或触碰损坏,如擦伤等。 端子护板, 保护结构可防止处理和插入期间,直接去针接触。 写入保护开关 可设置滑动开关来保护数据 可设置滑动开关来保护数据 可正确插入的楔形设计 这种形状有助于用户插入正确的方向。 凹口设计,当卡受到物理冲击时,可防止卡从主设备上掉落 导槽:可保证正确地插入主设备 2.3相关硬件原理图 硬件原理图表示电路板上各器件之间连接,主要涉及了硬件接口及硬件配置以及相应的连接线,方便了解STM32开发板的内部结构及相应芯片构造。 SD卡电路原理图, SD卡一般支持2种操作模式, ,1,SD卡模式, ,2,SPI模式, SD卡初始化过程, ,1,初始化STM32的SPI接口 使用低速模式 2. 延时至少74clock ,2,发送CMD0,需要返回0x01,进入Idle状态 ,3,循环发送CMD55+ACMD41,直到返回0x00,进入Ready状态 ,4,设置读写block大小为512byte ,5,把STM32的SPI设置为高速模式。 SD卡的复位, ,1,上电时要延时足够长的时间给SD卡一个准备过程,根据不同的卡设置不同的 延时时间,SD卡初始化第一步在发送CMD命令之前,在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能初始化的问题。 ,2,然后发送CMD0,如果返回正确,0x01,,在发送CMD1,如果返回正确,0x00,则初始化成功 . ,本实验SD初始化对应的部分程序) SD卡,最大支持32GB外扩, LCD液晶屏 USB 转串口 STM32电源电路由电容滤波、三端电压、电容滤波组成,其中的电容作用都是一样滤除电路中寄生的锯齿波,不同电容的容值通过的频率不一样,所以电路中使用了不同容值的电容把所有的锯齿波变为平滑的脉动波。 电源 在STM32F103系列的GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BSRR)和一个32位锁定寄存器(GPIOx_LCKR,。 GPIO口 按键电路 通过按键来选择系统的功能,完成对系统的访问控制。本实验使用了 两个按键,分别定义为上,key1,、下键,key2,,上、下两个按键是对设置或访问的液晶显示对象进行选择,key1控制BMP图片顺序显示,key2控制BMP图片逆序显示,这样便实现了用按键来实现对系统的设置,按键电路的实现比较简单,具体电路实现如下, KEY1,控制本实验的图片翻页-下翻, KEY2,控制本实验的图片翻页-下翻, LED灯,本实验图片页脚为奇数时LED灯亮, 第三章 设计流程图 本实验设计流程是基于实验原理、实际的操作过程及实验现象的基础上绘制的。 第四章 硬件设计 4.1中英文显示部分设计 显示屏要显示内容设置,由于程序中有定义的中英文显示程序(如下,,实验程序较多,此处只显示部分程序,为定义字符及字符串,所以 SD 卡根目录命名为“HZLIB.bin”的汉子字库文件保存到SD 卡中,STM32 芯片通过文件系统读取汉字字库文件即可获得字库的数据。 4.2 BMP图片部分设计 BMP图片格式BMP文件格式,又称为位图,Bitmap,或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。它是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP 文件所占用的空间很大。而且JPEG 是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别。图像的扫描方式是按从左到右、从下到上的顺序。 BMP文件保存了一幅图像中所有的像素。BMP格式可以保存单色位图、16色或256色索引模式像素图、24位真彩色图象,每种模式中单一像素点的大小分别为1/8字节,1/2字节,1字节和32字节。目前最常见的是256位色BMP和24位色BMP。Windows所使用的BMP文件,在开始处有一个文件头,大小为54字节。保存了包括文件格式标识、颜色数、图像大小、压缩方式等信息,由于本实验我们仅讨论24位色不压缩的BMP,所以文件头中的信息基本上不需要注意,只有“大小”这一项比较有用。本实验使用240x320像素bmp的图片,对应图片格式形式如下, 240*320像素BMP图片格式设置 BMP格式图片对应程序设置,仅取部分程序, 4.3 SD卡读取的内容 由于本实验的LCD显示的相关内容是从SD卡读取的,所以这里需将程序目录里的“需放置SD卡文件”用读卡器读进SD卡,再将SD卡插入STM32开发板的卡槽内,待程序加载后仿真时相应程序直接调用汉子字库及BMP格式图片。SD卡读取的内容包括以下部分, 第五章 软件设计 5.1主函数部分程序设计 #include "stm32f10x.h" //库函数 #include "bsp_lcd.h" #include "bsp_bmp.h" #include "bsp_led.h" #include "bsp_key.h" void Delay(__IO uint32_t nCount) //简单的延时函数 { for(; nCount != 0; nCount--); //当自变量不等于0时,自变量依次递减 } int i=0; //初始值i=0 int main ( void ) { Sd_fs_init(); //初始化SDIO LCD_Init (); //LCD 初始化 Key_GPIO_Config(); //key配置 LED_GPIO_Config(); //LED配置 ILI9341_DispString_EN_CH ( 20, 5, "lcd ?高利 石燕 张冰", macBACKGROUND, macRED ); //在第20行,第五列显示lcd,高利,石燕,张冰,背景为黑色,字体为红色 Delay(0xAFFFFF); ILI9341_DispString_CH ( 50, 50, "上海第二工业大学", macBACKGROUND, macRED ); Delay(0xAFFFFF); //在第50行,第50列显示上海第二工业大学,背景为黑色,字体为红色 ILI9341_DispString_EN_CH ( 30, 90, 欢迎您--", macBACKGROUND, macRED );Delay(0xAFFFFF);//在第30行,第90列显示 欢迎您—背景为黑色,字体为红色 ILI9341_DispString_EN( 40, 120, "begin", macBACKGROUND, macGREEN );Delay(0xAFFFFF); //在第40行,第120 列显示begin 背景为黑色,字体为绿色 while(1){ LED1( ON ); //LED灯亮 if( Key_Scan(macKEY1_GPIO_PORT,macKEY1_GPIO_PIN) == KEY_ON ){ i++; if(i>13) i=13; } //按key1键,图片按顺序显示下一 张图片, 直到i=13 if( Key_Scan(macKEY2_GPIO_PORT,macKEY2_GPIO_PIN) == KEY_ON ){ i--; if(i<0) i=0;} ////按key2键,图片按顺序显示上一张图片,直到i=0 switch(i) // 用于多分支选择的switch语句 switch(表达式){ case 常量表达式1: 语句1; case 常量表达式2: 语句2; case 常量表达式n: 语句n; default: 语句n+1;} { case0: Lcd_show_bmp(0,0,"/wildfire_1.bmp"); break; //显示wildfire_1.bmp图片 case 1: Lcd_show_bmp(0, 0,"/logo1_1.bmp");break; //显示logo1_1.bmp图片 case 2: LED1( OFF );Lcd_show_bmp( 0,0,"/pic1_1.bmp");break;//灯灭,显示pic1_1.bmp图片 case3: LED1( ON ); Lcd_show_bmp( 0,0,"/pic2_1.bmp");break;//灯亮,显示pic2_1.bmp图片 case 4: LED1( OFF );Lcd_show_bmp( 0,0,"/pic3_1.bmp");break;//灯灭,显示pic3_1.bmp 图片 case5: LED1( ON ); Lcd_show_bmp( 0,0,"/pic4_1.bmp");break; //灯亮,显示 pic4_1.bmp图片 case 6: LED1( OFF );Lcd_show_bmp( 0,0,"/pic5_1.bmp");break;//灯灭,显示pic5_1.bmp图片 case7: LED1( ON ); Lcd_show_bmp( 0,0,"/pic6_1.bmp");break;//灯亮,显示pic6_1.bmp图片 case8: LED1( OFF );Lcd_show_bmp( 0,0,"/pic7_1.bmp");break;//灯灭,显示pic7_1.bmp图片 case 9: LED1( ON ); Lcd_show_bmp( 0,0,"/pic8_1.bmp");break;//灯亮,显示pic6_1.bmp图片 case10: LED1( OFF );Lcd_show_bmp( 0,0,"/pic9_1.bmp");break;//灯灭,显示pic9_1.bmp图片 case11: LED1( ON ); Lcd_show_bmp( 0,0,"/pic10_1.bmp");break;//灯亮,显示pic10_1.bmp图片 case 12: LED1( OFF ); Lcd_show_bmp( 0,0,"/pic11_1.bmp");break; default:;//灯灭,显示pic10_1.bmp图片 } } } /* ------------------------------------------end of file---------------------------------------- */ 主程序这里用到了switch语句,以达到按键key1和key2控制BMP图片页数上翻下翻的目的,switch语句后面圆括号中表达式的值,然后用此值依次与各个case语句的表达式比较,即执行其后的语句,然后不断进行判断,继续执行后面所有的case后的语句。若圆括号中表达式都不等,则执行default后面的语句,然后退出switch语句,程序流程转向开关语句的下一个语句。 在实验操作的过程中,由于要按下按键,每按一次由上面程序可以看出i会对应不同的数,从而会对应switch,i,中不同的情况,从而对应不同的BMP图片,由i的不同控制本实验图片的切换。下面是不同的BMP图片在i变化时对应出现的情况, 5.2按键程序设计 这里由于USER文件里没有bsp_key.c,为了能使按键被调用,需要重建路径,在USER文件里加入bsp_key.c文件,以达到兼容的目的,当USER中出现bsp_key.c时,重新加载后便可正常使用按键,这里由于设计需要KEY1和KEY2两个键,则需对相关程序进行修改。 注,源程序key.c中只有key1键发挥作用,这里由于实验设计需要,进行了相应的程序修改、添加,使得key1和key2都可以在程序下载后发挥作用,从而控制实验现象。 USER/bsp_key.c路径创建过程如下: USER文件下加入bsp_key.c后,按键程序才可以真正意义上被调用,程序加 载后,按键才可以发挥作用,否则对应库函数无法被调用。 Key 路径的生成bep_key.c正常加入后USER文件下显示 由于本实验在设计是用到了LED灯及蜂鸣器,由于USER文件下无相应文件,均按照此处路径创建添加,以实现相应的功能,最终添加完成的USER文件下显示 由于本实验要用到key1和key2两个键,以控制图片的切换,则需对原有程序进行相应的修改,这里对应更改后的key.c程序如下, #include "bsp_key.h" /// 不精确的延时 static void Key_Delay(__IO u32 nCount) { for(; nCount != 0; nCount--); } /** * @brief 配置按键用到的I/O口 * @param 无 * @retval无 */ void Key_GPIO_Config(void) //按键配置 { GPIO_InitTypeDef GPIO_InitStructure; /*开启按键端口,PA,的时钟 */ RCC_APB2PeriphClockCmd(macKEY1_GPIO_CLK,ENABLE); GPIO_InitStructure.GPIO_Pin = macKEY1_GPIO_PIN; // IO 口做输入口时,不用设置输出频率 //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(macKEY1_GPIO_PORT, &GPIO_InitStructure); } /* * 函数名,key _Scan * 描述,检测是否有按键按下 * 输入, GPIOx,x可以使A,B,C,D或者E * GPIO_Pin,待读取的端口位 * 输出,KEY_OFF,没按下按键,、KEY_ON,按下按键, */ uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin) { /*检测是否有按键按下 */ if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) { /*等待按键释放 */ while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON); return KEY_ON; } else return KEY_OFF; } /*********************************************END OF FILE**********************/ 使用KEY1和KEY2键的程序 #ifndef __KEY_H #define __KEY_H #include "stm32f10x.h" #define KEYI_PA0 #define macKEY1_GPIO_CLK RCC_APB2Periph_GPIOA #define macKEY1_GPIO_PORT GPIOA #define macKEY1_GPIO_PIN GPIO_Pin_0 #define KEY2_PC13 #define macKEY2_GPIO_CLK RCC_APB2Periph_GPIOC #define macKEY2_GPIO_PORT GPIOC #define macKEY2_GPIO_PIN GPIO_Pin_13 /******* *按键按下标置,按键k1和k2默认是低电平,按键按下的时候是高电平 KEY_ON 0 KEY_OFF 1 ********/ #define KEY_ON 1 #define KEY_OFF 0 void Key_GPIO_Config(void); uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin); #endif /* __LED_H */ 5.3 LED灯程序设计 由于本实验在图片页数为奇数时LED灯点亮,而原程序无相应的配置程序,按 照上述按键程序的方式加入相应的程序,这里LED灯配置程序如下, void LED_GPIO_Config(void){ /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启GPIOB和GPIOF的外设时钟*/ RCC_APB2PeriphClockCmd( macLED1_GPIO_CLK|macLED2_GPIO_CLK|macLED3_GPIO_CLK, ENABLE); /*选择要控制的GPIOB引脚*/ GPIO_InitStructure.GPIO_Pin = macLED1_GPIO_PIN; /*设置引脚模式为通用推挽式输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIOB0*/ GPIO_Init(macLED1_GPIO_PORT, &GPIO_InitStructure); /*选择要控制的GPIOF引脚*/ GPIO_InitStructure.GPIO_Pin = macLED2_GPIO_PIN; /*调用库函数,初始化GPIOF7*/ GPIO_Init(macLED2_GPIO_PORT, &GPIO_InitStructure); /*选择要控制的GPIOF引脚*/ GPIO_InitStructure.GPIO_Pin = macLED3_GPIO_PIN; /*调用库函数,初始化GPIOF7*/ GPIO_Init(macLED3_GPIO_PORT, &GPIO_InitStructure); /* 关闭所有LED灯 */ GPIO_SetBits(macLED1_GPIO_PORT, macLED1_GPIO_PIN); /* 关闭所有LED灯 */ GPIO_SetBits(macLED2_GPIO_PORT, macLED2_GPIO_PIN); /* 关闭所有LED灯 */ GPIO_SetBits(macLED3_GPIO_PORT, macLED3_GPIO_PIN); } 第六章 系统调试结果及问题分析 6.1 系统调试后的实验现象 将STM32开发板供电,把文件 HZLIB.bin与BMP格式图片wildfire_1.bmp、logo1_1.bmp、pic1_1.bmp、pic2_1.bmp、pic3_1.bmp、pic4_1.bmp、pic5_1.bmp、pic6_1.bmp、pic7_1.bmp、pic8_1.bmp、pic9_1.bmp、pic10_1.bmp、pic11_1.bmp保存到 SD 卡中,再把该SD 卡插入开发板的 SD 卡接口,然后将 STM32 开发板供电(DC5V),插上 JLINK,插上串口线(两头都是母的交叉线),接上液晶屏,将编译好的程序下载到开发板。程序运行之后中英文逐行添加显示,每行都对应于一个时间延时,蜂鸣器发出声响后提示第一张图片出现,当第一张图片显示时,按下k1键,图片顺序显示,可顺序序显示到第13张图片,,按下K2键时图片逆序显示,可逆序显示到第一张图片,,且图片页脚的页数为奇数时LED灯亮,图片页数为偶数时LED灯熄灭。本实验的中英文的显示和 BMP 图片的显示和截图如下图所示, ,中英文逐行显示部分,这里由时间延时控制, ,按键切换时所涉及到的所有BMP格式图片由以上两图涵盖, 6.2 遇到的问题及解决办法 问题 原因 解决办法 1 软件与硬件只安装了部分库文件,本实在原有库文件的基础上继续添加所需要的 无法正常连验用到的相关库文件没有安库文件,并把Cortex JLink/JTrace Target 接,用keil5装上,另外没有安装Driver setup/ Programming Algorithm设 打开相关程JLinkARM_V458a连接器。 置STM32F10x High-density Flash 521K 序时闪退 on-chip Flash Device Family Package,并 且为计算机设备安装JLink连接器。 2 延时函数调将延时放在主函数中的把延时函数以一个单独的形式放在主函数 用不了。 while语句中里了。 上面且独立存在,延时函数被调用,显示 屏上中英文按照预先设定的时间间隔显 示,中英文显示完毕后按照预定延时时间 设置的蜂鸣器发出声响。 3 图片在显示仔细检查后发现图片格式为用Photoshop将图片格式设置为BMP格 屏上无法显JPEG搁置,实验过程中忽式,并且将图片旋转为竖屏的形式,将改 示。 略了图片的格式为BMP格为BMP格式的图片再次放在SD卡里。重 式以及图片的显示为竖屏导新加载后,图片正常显示。 致显示屏空白及显示凌乱的 条纹。 4 按键无法控只是在主程序里加了按键相在Options for Target/C/C++/Include 制图片的切关的代码,在工程USER下Paths下重新为工程USER/bsp_key.c创换,在工程加入USER/bsp_key.c文件建新的路径,路径创建成功后,头文件出USER下加后没有创建新的路径 红色X消失,重新加载后,key1可以控制入bsp_key.c图片的切换,修改bsp_key.h文件中的相后,在头文件关程序后,key2也可以正常使用,即key1处有一个红与key2按键可以发挥各自的作用。 色X。 5 图片与LED由于一开始写程序时用到的查询相关资料与书籍,尝试了很多种方式,灯无法按照是for语句,SD卡放入多张最后选用了switch语句,按照语句结构进预先的设定BMP格式图片后不适用,图行相应的编写,将编写好的程序嵌在主函显示,图片无片进入死循环,key2键无法数里的while语句里,从而实现对BMP图法一张张按控制图片逆序返回。 片以及LED灯的顺序控制,重新加载后,次序正常切图片及LED灯的显示情况与预期相同。 换。 第七章 总结 7.1思考与总结 通过此次试验设计,使我对嵌入式有了进一步的理解与认识,因为之前的实验 虽然做出了预期实验结果,但是我并不明白程序设置的含义,而现在通过自己的设计与运行,理解了程序是如何运行的以及相应语句的含义及设置原因。 嵌入式对于学习电子信息的我们来说是一门非常重要的课程,此次我们小组设计的实验主要涉及到LCD液晶显示屏、LED灯、蜂鸣器、按键等,作为小组的主要负责人,我参与了主要的设计与调试,按照我的设计原理及相关程序的调试,出现的结果应该是中英文逐行添加显示,每行都对应于一个时间延时,蜂鸣器发出声响后提示第一张图片出现,当第一张图片显示时,按下k1键,图片顺序显示,可顺序序显示到第13张图片,,按下K2键时图片逆序显示,可逆序显示到第一张图片,,且图片页脚的页数为奇数时LED灯亮,图片页数为偶数时LED灯熄灭。由于LCD液晶显示屏的像素是有点组成的,对应程序函数有相关点的绘制以及显示屏上相关内容的颜色背景显示。嵌入式知识覆盖范围比较大,对C语言的学习要求较高。每一步的设置都是有理有据的,而不是凭空想象的,预先设计是要加入触摸屏的,由于自己水平有限,加上触摸屏对应的程序后,后续试验现象消失,加之试验时间的急促,触摸屏在本次试验中就由按键完全取而代之,而自己更要加强嵌入式的学习。在本试验的过程中,我测试了呼吸灯、触摸屏画板、App等相关试验,并在老师的指导下理解了相关原理已意义,学到了很多知识,获益颇深。 整个实验结束后,我对学过的知识点有了充分的理解,并对本实验过程中接触到的相关试验的程序也有了进一步的认识,同时更加认识到自己对嵌入式的了解是很肤浅的,自己今后将会更加努力去学好嵌入式实时操作系统这门课程,并将理论与实践结合。 7.2参考文献, 何伟 赵巍”邢岚 李佳(重庆大学通信工程学院,重庆400044)第33卷第4期世界科技研究与磙展2011年8月 578—580页 STM32F10xxx_RM0008_参考手册_中文版_2010年 STM32单片机多串口通信仿真测试技术研究 基于FPGA的数字图像处理------2009 李德桥,丁克勤,LI De-qiao,DING Ke-qin. SD卡控制器的FPGA实现[J].仪表技术 2010.doi:10.3969/j.issn.1006-2394.2010.08.016 许峥,李明,李成金,赵勋杰. 基于SOPC的实时图像处理系统设计[J].光电技 术应用 2011.doi:10.3969/j.issn.1673-1255.2011.04.002 陈启军,余有灵,张伟,潘登,周伟. 嵌入式系统及应用——基于Cortex— M3内核和STM32F系列微控制器的系统与开发,2014.2,
/
本文档为【基于STM32在LCD上显示SD卡中BMP图片的设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索