第8章真彩图像显示_第1页
第8章真彩图像显示_第2页
第8章真彩图像显示_第3页
第8章真彩图像显示_第4页
第8章真彩图像显示_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章真彩图像显示

本项目引入具有32位、三级流水处理功能的ARMCortex-M3内核嵌入式系统——STM32F107单片机,在ST提供的STM32固件库基础上,利用ARM-MDK开发环境,快速、方便地实现彩色液晶真彩图形显示【城市交通地图显示】。通过本项目的学习,了解ARMCortex™-M3内核结构,掌握ARMCortex™-M3

内核单片机的基本应用,及采用MDK开发环境操作、编程和下载方法;了解STM32固件库,并学会使用;了解32位单片机的应用市场及发展动态。

8.1任务描述8.2电路设计8.3软件设计8.1任务描述

利用AT公司提供的固件库,在给出的用STM32F107【stm32】为控制核心的LED_LCD目标板上,用MDK开发软件编程,通过两个案例的实验,最终实现项目要求:TFT_LCD显示真彩色图像,实物效果见图8.1。图8.1TFT_LCD显示真彩图像实物图实现项目案例功能的电路图见图8.2和8.3。图8.2是真彩图像显示系统主要应用模块结构图。8.3是真彩图像显示系统完整电路原理图。图8.2真彩图像显示系统主要应用模块结构图图8.3真彩图像显示系统完整电路原理图8.2电路设计图8.4LED灯流水显示效果

电路原理:利用STM32F107的PA、PB、PC、PD的部分口,实现8只LED灯流水显示,流水的模式可以通过按键选择。本任务主要是掌握固件库对I/O口的操作,学会MDK操作步骤,学会JTAG调试、下载方法,并简单编程。图8.5LED彩灯流程图利用MDK与ST固件库实现LCD显示真彩图像,显示效果见图8.6。图8.6LCD真彩图像显示效果图电路原理:利用STM32F107的PE、PC、PD口,读取SD卡中的图像数据,在320x240彩色液晶屏TFT_LCD,实现真彩LCD图像显示,并通过触摸按键选择图像不同区域的显示。本任务主要是掌握固件库对中断事件的操作,进一步了解Cortex-M寄存器,学会对外设(SD卡)的操作方法,加深MDK操作步骤、JTAG调试、程序下载方法,并能进行略复杂程序的编制、调试。8.3软件分析实现本任务需要有功能的模块程序,除STM32固件库中:处理外设中断服务程序stm32f10x_it(包括按键处理)、时钟寄存器配置程序stm32f10x_rcc、端口设置处理程序stm32f10x_gpio、系统初始化system_stm3210x

、flash处理stm32f10x_flash、SD卡的读写程序、TFT_LCD驱动显示程序、BMP与JPG图像转换程序。图8.7LCD真彩图像显示流程(1)LED显示主程序(main.c)/************************************************************实验名称:流水灯功能:实现IO的输入输出,即流水灯和按键功能.左右按键负责控制流水灯方向,

上下控制速度.*************************************************************/#include"stm32f10x.h"#include"GPIO.h"#include"GPIO.c"/*******************************函数名称:Delay功能:延时参数:speed返回值:无*******************************/voidDelay(u16speed){ u16i;

while(speed!=0) { speed--;

for(i=0;i<400;i++); }}int

main(void){ u16speed=2000; u8turn=0;

SystemInit(); //系统初始化

GPIO_Configuration(); //端口初始化

while(1) { if(!turn)//向左循环

{ LED1_ON; Delay(speed); LED1_OFF; LED2_ON; Delay(speed); LED2_OFF; LED3_ON; Delay(speed); LED3_OFF; LED4_ON; Delay(speed); LED4_OFF; LED5_ON; Delay(speed); LED5_OFF; LED6_ON; Delay(speed); LED6_OFF; LED7_ON; Delay(speed); LED7_OFF; LED8_ON; Delay(speed); LED8_OFF;

Delay(speed); }else//向左循环

{ LED8_ON; Delay(speed); LED8_OFF; LED7_ON; Delay(speed); LED7_OFF; LED6_ON; Delay(speed); LED6_OFF; LED5_ON; Delay(speed); LED5_OFF; LED4_ON; Delay(speed); LED4_OFF; LED3_ON; Delay(speed); LED3_OFF; LED2_ON; Delay(speed); LED2_OFF; LED1_ON; Delay(speed); LED1_OFF; } /*判断键盘输入*/

if(GET_LEFT()) turn=1; elseif(GET_RIGHT())turn=0;

if(GET_UP()) { if(speed>200) speed-=200; } elseif(GET_DOWN()) { if(speed<20000) speed+=200; } }}(2)输入输出宏定义(GPIO.h)/****************输入输出宏定义******************/#ifndefGPIO_H#defineGPIO_H/*****************输出宏定义*********************/#defineLED1_ON GPIO_ResetBits(GPIOA,GPIO_Pin_8)#defineLED1_OFF GPIO_SetBits(GPIOA,GPIO_Pin_8)#defineLED2_ON GPIO_ResetBits(GPIOD,GPIO_Pin_7)#defineLED2_OFF GPIO_SetBits(GPIOD,GPIO_Pin_7)#defineLED3_ON GPIO_ResetBits(GPIOC,GPIO_Pin_7)#defineLED3_OFF GPIO_SetBits(GPIOC,GPIO_Pin_7)#defineLED4_ON GPIO_ResetBits(GPIOC,GPIO_Pin_5)#defineLED4_OFF GPIO_SetBits(GPIOC,GPIO_Pin_5)#defineLED5_ON GPIO_ResetBits(GPIOB,GPIO_Pin_9)#defineLED5_OFF GPIO_SetBits(GPIOB,GPIO_Pin_9)#defineLED6_ON GPIO_ResetBits(GPIOB,GPIO_Pin_8)#defineLED6_OFF GPIO_SetBits(GPIOB,GPIO_Pin_8)#defineLED7_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5)#defineLED7_OFF GPIO_SetBits(GPIOB,GPIO_Pin_5)#defineLED8_ON GPIO_ResetBits(GPIOB,GPIO_Pin_0)#defineLED8_OFF GPIO_SetBits(GPIOB,GPIO_Pin_0)/*********************输入宏定义****************************/#defineGET_LEFT() (!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3))#defineGET_UP() (!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4))#defineGET_RIGHT() (!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5))#defineGET_DOWN() (!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6))#endif(3)管脚配置程序(GPIO.c)/****************************************函数名称:GPIO_Configuration功能:设置PA8、PD7、PC7、PC5、PB9、PB8、PB5、PB0为输出LED灯设置PD3、PD4、PD5、PD6为键盘输入参数:无返回值:无****************************************/voidGPIO_Configuration(void){ GPIO_InitTypeDef

GPIO_InitStructure; /*******允许总线CLOCK********************/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); /******在设置LED输出前,先把LED关闭*****/ LED1_OFF; LED2_OFF; LED3_OFF; LED4_OFF; LED5_OFF; LED6_OFF; LED7_OFF; LED8_OFF; /****************设置PA8为输出*******************/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; //开漏输出

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50M时钟速度

GPIO_Init(GPIOA,&GPIO_InitStructure); /**************设置PB0,5,8,9为输出*****************/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; //开漏输出

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50M时钟速度

GPIO_Init(GPIOB,&GPIO_InitStructure); /**************设置PC5,7为输出**********************/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; //开漏输出

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50M时钟速度

GPIO_Init(GPIOC,&GPIO_InitStructure); /**************设置PD7为输出**************************/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; //开漏输出

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50M时钟速度

GPIO_Init(GPIOD,&GPIO_InitStructure); /**************设置PD3,4,5,6为按键输入******************/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;

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

GPIO_Init(GPIOD,&GPIO_InitStructure);}(4)时钟配置程序(RCC.c)/****************************************函数名称:RCC_Configuration功能:寄存器配置参数:无返回值:无****************************************/#include"STM32Lib\\stm32f10x.h"RCC_ClocksTypeDef

RCC_ClockFreq;voidRCC_Configuration(void){SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置.具体请看2_RCC /**************************************************

获取RCC的信息,调试用 请参考RCC_ClocksTypeDef结构体的内容,当时钟配置完成后,

里面变量的值就直接反映了器件各个部分的运行频率 ***************************************************/

RCC_GetClocksFreq(&RCC_ClockFreq); /*这个配置可使外部晶振停振的时候,产生一个NMI中断,不需要用的可屏蔽掉*/ //RCC_ClockSecuritySystemCmd(ENABLE); //SYSTICK分频--1ms的系统时钟中断

if(SysTick_Config(SystemFrequency/1000)) { /*Captureerror*/ while(1); }}/**********************************************函数名:SysTickDelay**功能:使用系统时钟的硬延迟**注意事项:一般地,不要在中断中调用本函数,否则会存在重入问题.另外如果屏蔽了全局中断,则不要使用此函数********************************************/volatileu16Timer1,Timer2;voidSysTickDelay(u16dly_ms){ Timer1=dly_ms; while(Timer1);}(5)LED与单片机硬件连接宏定义(HAL.h)/****************输入输出宏定义******************/#ifndefHAL_H#defineHAL_H/*****************输出宏定义*********************///输出宏定义#defineLED1_ON GPIO_ResetBits(GPIOA,GPIO_Pin_8)#defineLED1_OFF GPIO_SetBits(GPIOA,GPIO_Pin_8)#defineLED2_ON GPIO_ResetBits(GPIOD,GPIO_Pin_7)#defineLED2_OFF GPIO_SetBits(GPIOD,GPIO_Pin_7)#defineLED3_ON GPIO_ResetBits(GPIOC,GPIO_Pin_7)#defineLED3_OFF GPIO_SetBits(GPIOC,GPIO_Pin_7)#defineLED4_ON GPIO_ResetBits(GPIOC,GPIO_Pin_5)#defineLED4_OFF GPIO_SetBits(GPIOC,GPIO_Pin_5)#defineLED5_ON GPIO_ResetBits(GPIOB,GPIO_Pin_9)#defineLED5_OFF GPIO_SetBits(GPIOB,GPIO_Pin_9)#defineLED6_ON GPIO_ResetBits(GPIOB,GPIO_Pin_8)#defineLED6_OFF GPIO_SetBits(GPIOB,GPIO_Pin_8)#defineLED7_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5)#defineLED7_OFF

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论