嵌入式电子相册解析.docx

上传人:b****6 文档编号:6203609 上传时间:2023-01-04 格式:DOCX 页数:21 大小:1.14MB
下载 相关 举报
嵌入式电子相册解析.docx_第1页
第1页 / 共21页
嵌入式电子相册解析.docx_第2页
第2页 / 共21页
嵌入式电子相册解析.docx_第3页
第3页 / 共21页
嵌入式电子相册解析.docx_第4页
第4页 / 共21页
嵌入式电子相册解析.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

嵌入式电子相册解析.docx

《嵌入式电子相册解析.docx》由会员分享,可在线阅读,更多相关《嵌入式电子相册解析.docx(21页珍藏版)》请在冰豆网上搜索。

嵌入式电子相册解析.docx

嵌入式电子相册解析

 

 

信息科学与工程学院

基于STM32的电子相册系统设计

 

专业班级:

通信工程12-2班

姓名:

覃模广

学号:

3120731231

教师:

梁贵芹

 

摘  要 

本设计是一款基于STM32F103的电子相框系统读取SD卡中的图像文件通过LCD屏幕将其显示。

系统主要由SD驱动、LCD驱动和功能控制模块组成。

SD驱动主要由SD接口驱动程序、FAT文件操作程序组成;LCD驱动主要由LCD屏驱动芯片的驱动程序和图片显示程序组成;功能控制模块包括了系统初始化,显示初始页面,显示方式的设置,驱动程序调用等功能,功能控制模块是系统的主模块。

在介绍了文件系统与图像操作的基础上逐步说明了整个系统的实现。

文件系统支持FAT16/32,图像系统支持BMP等多种文件格式。

整个系统的设计以模块化为基础,易于升级。

关键词:

STM32F103电子相框系统SD卡LCD屏幕FAT文件系统

 

嵌入式系统的特点简介 

 

嵌入式系统具有以下几个重要特征:

 

①系统内核小,由于嵌入式系统一般应用于小型电子装置,系统资源相对有限,所以内核较之传统的操作系统要小得多。

比如,ENEA公司的OSE分布式系统,内核只有5KB,而Windows的内核则要大得多。

 

②专用性强,嵌入式系统的个性化很强,其中的软件系统和硬件结合非常紧密,一般要针对硬件进行系统的移植,同时针对不同的任务,往往需要对系统进行较大的更改。

另外,程序的编译下载要和系统相结合。

 

③嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能的设计及实现过于复杂,这样既利于控制系统成本,也利于实现系统安全。

 

④高实时性的操作系统软件是嵌入式软件的基本要求,而且软件要求固化存储,以提高速度,软件代码要求高质量和高可靠性。

 

⑤嵌入式软件开发要想走向标准化,就必须使用多任务操作系统。

嵌入式系统的应用程序可以没有操作系统而直接在芯片上运行,但为了更合理的调度多任务,利用系统资源、系统函数,用户必须自行选配RTOS开发平台。

 

⑥执行的实时性、可靠性,并减少开发时间,保障软件质量。

嵌入式系统开发需要专门的开发工具和环境。

由于嵌入式系统本身不具备自主开发能力,即使完成设计后,用户通常也不能对其中的程序功能进行修改,因此必须有一套基于通用计算机的开发工具和环境才能进行开发。

 

任务分析--》确定方案--》重难点--》软件设计--》硬件设计调试

一*任务分析*

基于STM32设计一个电子相册系统,系统通电后能够正常进行图片的演示并且可以通过按键控制上下张照片显示。

二*确定方案*

基于ARM单片机STM32F103RBT6的存储程序控制,从SD卡读取图片,解码后输出到TFT-LCD上显示,同时通过按键可以控制上下张显示。

 

1)硬件电路原理图的绘制; 2)硬件资料的研究; 3)软件方案的选择与论证; 4)软件运行与调试;

三*重难点*

FAT文件系统、TFT-LCD显示方法以、ARM单片机STM32F103RBT6开发版的应用和SD存储卡模块的正确使用。

通过查相关的资料得:

 

3.1SD存储卡模块 

SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地应用于便携式装置上,例如数码相机、个人数码助理(PDA)和多媒体东

播放器等。

SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。

大小犹如一张邮票的SD记忆卡,重量只有2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性,此外它可存多种格式数据文件,具有很强的可扩展性;用户可方便使用SD卡读卡器对其进行用户信息修改。

2G金士顿SD卡实物如下图2-5所示。

 

SD卡一般支持两种操作模式:

SD卡模式与SPI模式。

 

主机可以选择以上任意一种模式同SD卡通信,SD卡模式允许4线的高速数据传输。

SPI模式允许简单的通过SPI接口来和SD卡通信,这种模式同SD卡模式相比就是丧失了速度。

SD卡的引脚排序如下图2-6所示

图2-5 Kingston SD卡图2-6 SD卡引脚排序图

SD卡要进入SPI模式很简单,就是在SD卡收到复位命令(CMD0)时,CS为有效电平(低电平)则SPI模式被启用。

不过在发送CMD0之前,要发送>74个时钟,这是因为SD卡内部有个供电电压上升时间,大概为64个CLK,剩下的10个CLK用于SD卡同步,之后才能开始CMD0的操作,在卡初始化的时候,CLK时钟最大不能超过400KHZ。

 

3.2LCD模块 

Thin Film Transistor(薄膜场效应晶体管),是指液晶显示器上的每一液晶象素点都是由集成在其后的薄膜晶体管来驱动。

从而可以做到高速度、高亮度、高对比度显示屏幕信息,TFT-LCD(薄东南大

膜晶体管液晶显示器)是多数液晶显示器的一种。

TFT屏幕的优点如下:

1).大面积2).高集成度3).功能强大4).低成本5).工艺灵活6).应用领域广泛

TFT液晶显示屏亮度好、对比度高、层次感强、颜色鲜艳,其广泛应用于手机、MP4等消费品。

因此,本系统选用2.8英寸TFT-LCD屏(如图2-2所示)可显26万色,分辨率320*240,控制器为ILI9320,采用16位的80并口,配合触摸屏专用芯片XPT2046,可对屏幕进行触摸操作,更显智能化和个性化。

为了方便用户使用,我们存储方式采用兼容FAT的文件系统,同时该文件系统也兼容FAT32等电脑主流的

文件系统方式进行存储。

 

2.8英寸TFT-LCD模块

该模块的80 并口有如下一些信号线:

 CS:

TFT-LCD片选信号。

 WR:

向TFT-LCD写入数据。

 RD:

从TFT-LCD读取数据。

 D[15:

0]:

16位双向数据线。

 RST:

硬复位TFT-LCD。

 RS:

命令/数据标志(0,读写命令;1,读写数据)。

TFT-LCD模块的RST 信号线是直接接到STM32 的复位脚上,并不由软件控制,这样可以省下来一个I/O口。

另外我们还需要一个背光控制线来控制TFT-LCD的背光。

所以我们总共需要的I/O口数目为21个。

该控制器自带显存,其显存总大小为172820(240*320*18/8),即18位模式(26万色)下的显存量。

模块的16位数据线与显寸的对应关系为565方式,如下图所示

16位数据与显存对应关系图

最低5位代表蓝色,中间6位为绿色,最高5 位为红色。

数值越大,表示该颜色越深。

接下来介绍一下ILI9320的几个重要命令,因为ILI9320的命令很多,这里不一一介绍。

通过以上介绍,我们可以得出TFT-LCD显示需要的相关设置步骤如下:

 

1)设置STM32与TFT-LCD模块相连接的I/O。

 

这一步,先将我们与TFT-LCD模块相连的I/O口设置为输出,具体使用哪些I/O口,这里需要根据连接电路以及TFT-LCD模块的设置来确定。

 

2)初始化TFT-LCD模块。

 

通过向TFT-LCD写入一系列的设置,来启动TFT-LCD的显示。

为后续显示字符和数字做准备。

 3)通过函数将字符和数字显示到TFT-LCD模块上。

 

这里就是通过我们设计的程序,将要显示的字符送到TFT-LCD模块就可以了,这些函数将在软件设计部分向大家介绍。

通过以上三步,我们就可以使用TFT-LCD模块来显示字符和数字了,并且可以显示各种颜色的背景。

3.3液晶显示部分电路设计

液晶显示部分主要由微控制器STM32F103RBT6驱动AM240320LSTNQW-00H完成人机界面状态的显示,通过发送命令字,完成液晶模块的初始化,完成对内容的显示,显示部分的硬件电路接口图如图2所示

 

系统液晶接口原理图

3.4ARM单片机STM32F103RBT6开发版简介

STM32F103RBT6使用高性能的ARMCortex-M332位的RISC内核,工作频率为72MHz,内置高速存储器(高达128K字节的闪存和20K字节的SRAM),丰富的增强I/O端口和连接到两条APB总线的外设。

所有型号的器件都包含2个12位的ADC、3个通用16位定时器和一个PWM定时器,还包含标准和先进的通信接口:

多达2个I2C和SPI、3个USART、一个USB和一个CAN.供电电压2.0~3.6V,一系列的省电模式保证低功耗应用的要求

3.5FAT文件系统

常用的文件系统有FAT12/16/32等,FAT12是最古老的文件系统,只能管理8M左右的空间。

现在基本淘汰了。

FAT16则可以管理2G的空间(通过特殊处理也能管理2G以上的空间),而FAT32则能管理到2TB(2048GB)的空间。

FAT32较FAT16的优势还在于FAT32采用了更小的簇,可以更有效的保存信息,而不会造成多的浪费。

本系统设计过程中采用了FAT32文件系统,它的主要组成部分如下:

1、MBR称为主引导记录区,该区存储了分区表等信息,位于SD卡的扇区0(物理扇区),在其分区信息里面记录了DBR所在的位置,SD卡一般只会有一个分区,所以也就只要找到分区1的DBR所在位置就可以了。

2、DBR称为操作系统引导记录区,如果没有MBR,那么DBR就位于0扇区;如果有,则必须通过MBR区得到DBR所在的地址,然后读出DBR信息。

在DBR区,可以知道每个扇区所占用的字节数、每个簇的扇区数、FAT表的份数、每个FAT表的扇区敷、跟目录簇号、FAT表1所在的扇区等一系列非常重要的信息。

3、FAT称为文件分配表(FAT表),一个卡上会存在2个FAT表,一个用作备份,一个使用。

FAT表一般紧随DBR,另一个FAT表则紧随第一个FAT表,这样只要知道了第一个FAT表的位置及大小,那么第二个FAT表的位置也就确定了。

FAT表记录了每个文件的位置和区域,是一种链式结构。

4、FDT称为文件根目录表,这个区域固定为32个扇区,假设每个扇区为512个字节。

那么根目录下最多存放512个文件(假设都用短文件名存储,每个短文件名占32个字节)。

文件目录表是另一个重要的部分,FAT文件系统中(仅以短文件名介绍),文件目录项在目录表下以32个字节的方式记录。

4、软件设计

由于本设计直接在ARM单片机STM32F103RBT6开发版实现,而且程序的工程是直接通过利用现有的通过修改而来的,所以在这里只是重点说明主函数程序。

4.1这是主程序的流程图

 

 

 

 

 

4.2主函数如下:

#include"stm32f10x.h"

#include"hardware.h"

#include"usart.h"

#include"ili932x.h"

#include"fat.h"

#include"picture.h"

#defineEEPROM_WriteAddress0

#defineEEPROM_ReadAddress0

#defineTEXT_Size(Get_Size(TEXT_Buffer)-1)

#defineGet_Size(a)(sizeof(a)/sizeof(*(a)))

uint8_tTEXT_Buffer[]={"MINI-STM32SDTEST"};

uint8_tREXT_Buffer[TEXT_Size];

uint8_tFill_Buffer[]={""};

externuint8_tgImage_11[];

static__IOuint32_tTimingDelay;

voidGPIO_Configuration(void);

voidNVIC_Configuration(void);

voidTime_Display(uint32_tTimeVar);

uint8_tKEY_Scan(void);

voidDelay(__IOuint32_tnTime);

intmain(void)//主函数

{

uint8_ti;

uint8_tkey;

FileInfoStruct*FileInfo;

uint16_tpic_cnt=0;//当前目录下图片文件的个数

uint16_tindex=0;//当前选择的文件编号

uint16_ttime=0;

SystemInit();//配置系统时钟72M(包括clock,PLLandFlashconfiguration)

while(SysTick_Config(SystemFrequency/1000));//Systick配置延时n*ms

GPIO_Configuration();//引脚配置

USART_Configuration();//异步通信初始化

NVIC_Configuration();//系统中断配置

LCD_Init();//LCD初始化

LCD_Clear(WHITE);//清屏

SPI_Configuration();//SPI初始化

M45PE_Init();//M45PE16初始化

SD_Init();//SD卡初始化

USART_Send_Str(menu);

POINT_COLOR=RED;

Show_Str(60,50,"MiniSTM32开发板",16,0);

Show_Str(60,70,"简易电子相册",16,0);

Show_Str(60,90,"通信12-2班",16,0);

Show_Str(60,110,"2015年7月1日",16,0);

SD_Init();

while(FAT_Init())//FAT错误

{

Show_Str(60,130,"文件系统错误!

",16,0);

i=SD_Init();

if(i)Show_Str(60,150,"SD卡错误!

",16,0);//SD卡初始化失败

Delay(500);

LCD_Fill(60,130,240,170,WHITE);//清除显示

Delay(500);

LED1=!

LED1;

}

while(SysInfoGet

(1))//得到图片文件夹

{

Show_Str(60,130,"图片文件夹未找到!

",16,0);

Delay(500);

FAT_Init();

SD_Init();

LED1=!

LED1;

LCD_Fill(60,130,240,170,WHITE);//清除显示

Delay(500);

}

Show_Str(60,130,"开始显示...",16,0);

Delay(1000);

Cur_Dir_Cluster=PICCLUSTER;

while

(1)

{

pic_cnt=0;

Get_File_Info(Cur_Dir_Cluster,FileInfo,T_JPEG|T_JPG|T_BMP,&pic_cnt);//获取当前文件夹下面的目标文件个数

if(pic_cnt==0)//没有图片文件

{

LCD_Clear(WHITE);//清屏

while

(1)

{

if(time%2==0)Show_Str(32,150,"没有图片,请先COPY图片到SD卡的PICTURE文件夹,然后后重启!

",16,0);

elseLCD_Clear(WHITE);

time++;

Delay(300);

}

}

FileInfo=&F_Info[0];//开辟暂存空间.

index=1;

while

(1)

{

Get_File_Info(Cur_Dir_Cluster,FileInfo,T_JPEG|T_JPG|T_BMP,&index);//得到这张图片的信息

//LCD_Clear(WHITE);//清屏,加载下一幅图片的时候,一定清屏

AI_LoadPicFile(FileInfo,0,0,240,320);//显示图片

POINT_COLOR=RED;

while

(1)//延时3s

{

key=KEY_Scan();

if(key==1)break;//下一张

elseif(key==2)//上一张

{

if(index>1)index-=2;

elseindex=pic_cnt-1;

break;

}

Delay

(1);

time++;

if(time%100==0)LED1=!

LED1;

if(time>3000)

{

time=0;

break;

}

}

index++;

if(index>pic_cnt)index=1;//显示第一副,循环

}

}

}

/*****************************************************************************

**函数名称:

GPIO_Configuration

**功能描述:

配置IO口

**作 者:

Dream

**日 期:

2010年12月17日

*****************************************************************************/

voidGPIO_Configuration(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB

|RCC_APB2Periph_USART1,ENABLE);//使能端口时钟,重要!

/*配置LED1、LED2引脚的功能*********************/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出模式

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出最大频率为50MHz

GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA2、PA3

/*配置KEY1、KEY2引脚的功能*********************/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入模式

GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA0、PA1

 

/*配置USART1Tx(PA9)*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用开漏输出模式

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出最大频率为50MHz

GPIO_Init(GPIOA,&GPIO_InitStructure);

/*配置USART1Rx(PA10)*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入模式

GPIO_Init(GPIOA,&GPIO_InitStructure);

//PB0映射到通道8作为模拟输入引脚,ADC转换

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;

GPIO_Init(GPIOB,&GPIO_InitStructure);

}

/*****************************************************************************

**函数名称:

KEY_Scan

**功能描述:

按键处理函数

0,没有任何按键按下1,KEY1按下

2,KEY2按下

**作 者:

Dream

**日 期:

2010年12月17日

*****************************************************************************/

uint8_tKEY_Scan(void)

{

staticuint8_tKEY_UP=1;//按键按松开标志

if(KEY_UP&&(KEY1==0||KEY2==0))

{

Delay(10);//去抖动

KEY_UP=0;

if(KEY1==0)return1;

elseif(KEY2==0)return2;

}elseif(KEY1==1&&KEY2==1)KEY_UP=1;

return0;//无按键按下

}

/*****************************************************************************

**函数名称:

Delay

**功能描述:

用Systick延时

**作 者:

Dream

**日 期:

2010年12月17日

*****************************************************************************/

voidDelay(__IOuint32_tnTime)

{

TimingDelay=nTime;

while(TimingDelay!

=0);

}

/*****************************************************************************

**函数名称:

TimingDelay_Decrement

**功能描述:

Systick中断进入函数

*

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1