浙江工业大学单片机第六次实验文档格式.docx

上传人:聆听****声音 文档编号:323834 上传时间:2023-04-28 格式:DOCX 页数:32 大小:425.93KB
下载 相关 举报
浙江工业大学单片机第六次实验文档格式.docx_第1页
第1页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第2页
第2页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第3页
第3页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第4页
第4页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第5页
第5页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第6页
第6页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第7页
第7页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第8页
第8页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第9页
第9页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第10页
第10页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第11页
第11页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第12页
第12页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第13页
第13页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第14页
第14页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第15页
第15页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第16页
第16页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第17页
第17页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第18页
第18页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第19页
第19页 / 共32页
浙江工业大学单片机第六次实验文档格式.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

浙江工业大学单片机第六次实验文档格式.docx

《浙江工业大学单片机第六次实验文档格式.docx》由会员分享,可在线阅读,更多相关《浙江工业大学单片机第六次实验文档格式.docx(32页珍藏版)》请在冰点文库上搜索。

浙江工业大学单片机第六次实验文档格式.docx

幅画面更新。

液晶的彩色都是透明的必须给LCD衬以白色的背光板上才能将五颜六色表达

出来,而要使白色的背光板有反射就需要在四周加上白色灯光。

因此在TFTLCD的底部都

组合了灯具,如CCFL或LED。

2.OTM4001A控制芯片简介

OTM4001A是一款262144色,用于中小型TFTLCD显示屏的片上系统(SoC)驱动芯

片,通过指定用于图形数据的RAM能支持达240xRGBx432分辨率。

OTM4001A内部的时

序控制器能为不同的需求提供不同接口方式,OTM4001A提供了系统接口,包括8/9/16/18

位并口和SPI串口方式(本实验采用16位并口方式);

OTM4001A也提供了6/16/18位RGB

接口,用于动态显示图片。

OTM4001A的主要特性还有窗口地址功能能限制数据重写区域,

并减少数据传输;

内部6位D/A转换器输出的64γ颜色校准;

内部233280字节的RAM;

背光引脚输出控制的内置自适应背光控制功能(CABC);

逻辑供电电压范围2.5~3.6V,IO接口支持操作电压1.65~3.6V,模拟供电电压范围2.5~3.6V;

内置的内部晶振与硬件复位。

本实验中,采用80系统总线的16位并口方式,对TFTLCD的常规写操作时序特征和

时序图分别如下表10-1和图10-1所示:

表10-116位并口方式时序特征

图10-116位并口方式时序图

为使液晶正常工作,我们需要在初始化之前先复位液晶,复位液晶的时序特征和时序图

分别如下表10-2和图10-2所示:

表10-2TFTLCD复位时序特征

图10-2TFTLCD复位时序图

为减少数据访问次数,OTM4001A还有窗口访问功能,能指定对液晶的操作区域,相关

寄存器如下:

HSA7-0和HEA7-0代表了水平方向的窗口起始和结束地址,VSA8-0和VEA8-0代表垂

直方向的窗口起始和结束地址。

要使用窗口功能需满足下式:

“00”h≤HSA7-0<

HEA7-0≤“EF”handHEA-HAS>

=”04h”

“00”h≤VSA8-0<

VEA8-0≤9’h1AF

对窗口访问功能定义如下图10-3所示:

图12-3窗口访问功能定义

通过上述寄存器设置好访问的RAM之后,写入一个数据将会写到指定的区域,不需要

完全擦除所有数据,这样大大减少了操作时间。

理解OTM4001A的操作时序与窗口访问功能后,我们就能进行对TFTLCD进行初始

化,让LCD显示我们需要的文字或图片。

OTM4001A有运行模式,睡眠模式,深度睡眠模

式,睡眠模式和深度睡眠模式用于当不用显示时,节省电量开销,对于其他寄存器的操作,

请参考TFTdisplay.pdf。

3.TivaWareCseries的数学库IQmathLib.h

Tiva™IQmath.h是一个高度优化和高精度的数学函数库,帮助C/C++程序员在Tiva器

件上无缝地将浮点运算转化为定点计算。

计算速度将显著快于浮点运算。

IQmath库采用32

位定点带符号数作为基本数据类型。

这些定点数的格式从IQ1到IQ30,这里IQ数据格式代

表了数的小数位数。

C语言中要调用IQmath函数,需要先包含头文件“IQmath/IQmathLib.h”。

然后,才能使用_iq和_iqN的数据类型以及库中的函数,以下代码是对IQmath库函数的简

单调用:

#include"

IQmath/IQmathLib.h"

intmain(void)

{

_iq24X,Y,Z;

X=_IQ24(1.0);

Y=_IQ24(7.0);

Z=_IQ24div(X,Y);

}

IQmath库函数的具体使用请参阅TivaWare™IQmathLibraryUSER’SGUIDE。

4.TM4C129xSeriesCortex-M4的EPI工作原理与方式

外围设备接口(EPI,ExternalPeripheralInterface),是一种用于外设或存储设备的高速并

行总线。

有3种主要的工作方式,能无缝对接众多类型的外部设备。

EPI类似于标准的微处

理器地址/数据总线,通常必须和1种外设连接,不能一次和2种不同的外设连接。

增强了

包括支持uDMA,时钟控制和支持外部FIFO缓冲区等功能。

EPI模块有以下主要特性:

Ø

用于外围设备和存储器的专用8/16/32位并行总线;

存储器接口支持连续存储访问,不限数据总线宽度,允许程序直接从SDRAM,

SRAM和Flash存储器中运行;

阻断和非阻断读取;

使用内部写FIFO将处理器从严格时序要求中分离;

采用uDMA控制器高效地传输数据;

EPI的3种主要的工作模式为SDRAM模式,传统的Host-Bus模式和通用模式,本实

验选用EPI的Host-Bus模式。

Host-Bus模式主要特点有:

支持8位,16位MCU总线接口;

兼容类似PIC,ATmega,8051等其他类似设备;

访问SRAM,NORFlash和其他器件时,在非复用工作方式下,支持高达1MB的地

址访问,在多路复用工作方式下,支持256MB访问(16位总线模式不带字节选择

的情况下,支持512MB);

对于一系列无地址的8位/16位FIFO接口,支持外部FIFO(XFIFO)EMPTY和

FULL信号;

带有读和写数据等待状态计数器;

多种片选方式,包括单芯片,双芯片,四芯片片选。

5.实用到的主要库函数简介

voidEPIModeSet(uint32_tui32Base,uint32_tui32Mode)函数用于选择EPI的工作方式。

ui32Base为EPI模块的基地址;

ui32Mode为EPI的工作模式,本实验选择为EPI_MODE_HB16,

配置成16位总线模式。

voidEPIConfigHB16Set(uint32_tui32Base,uint32_tui32Config,uint32_tui32MaxWait)函数用于16位总线工作模式的详细设置。

ui32Config为16位总

线工作方式的配置参数;

ui32MaxWait为等待的最大外部时钟数。

voidEPIAddressMapSet(uint32_tui32Base,uint32_tui32Map)函数用于配置外部设备的地

址映射。

ui32Map是地址映射参数,由一些宏定义的参数通

过逻辑与组成。

对于存储设备,EPI将外设视为一块连续的存储空间;

对于无地址设备,EPI

将外设视为一个地址。

6.简化的EPI模块配置步骤(左)和实验程序流程图(右)

图10-5简化EPI初始化流程图10-6液晶显示程序流程图

三、实验代码、注释(最好每条注释)及现象

实验代码:

#include<

stdbool.h>

stdint.h>

string.h>

inc/hw_memmap.h"

inc/hw_types.h"

inc/hw_epi.h"

inc/hw_ints.h"

driverlib/epi.h"

driverlib/gpio.h"

driverlib/sysctl.h"

driverlib/rom.h"

driverlib/rom_map.h"

driverlib/pin_map.h"

driverlib/systick.h"

driverlib/interrupt.h"

driverlib/ssi.h"

driverlib/fpu.h"

utils/uartstdio.h"

TFTinit/TFT_400x240_OTM4001A_16bit.h"

EPIinit/EPIinit.h"

//ProvideadefinitionforM_PI,ifitwasnotprovidedbymath.h.

#ifndefM_PI

#defineM_PI3.14159265358979323846F

#endif

uint32_tg_ui32SysClock;

//SystemclockrateinHz.

//Acounterforsystemclockticks,usedfortrackingtime.

staticvolatileunsignedlongg_ulTickCount;

#defineSERIES_LENGTH240

//Createsabufferforholdingthevaluesofthedataseries.Itmustbe

//largeenoughtoholdthemaximumnumberofdatapointsintheseriesthat

//willbeshownonthestripchart.

typedefstruct_Series

uint32_txAxis;

int32_tdata;

}tSeries;

statictSeriesg_cSeries[240];

//ThenumberofSysTicktickspersecond.

#defineTICKS_PER_SECOND40

#defineFSECONDS_PER_TICK(1.0F/(float)TICKS_PER_SECOND)

//ThisisthehandlerforthisSysTickinterrupt.Itsimplyincrementsa

//counterthatisusedfortiming.

void

SysTickIntHandler(void)

//Updateourtickcounter.

g_ulTickCount++;

if(g_ulTickCount>

=320)

g_ulTickCount=0;

//ConfiguretheUARTanditspins.ThismustbecalledbeforeUARTprintf().

ConfigureUART(void)

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

//EnabletheGPIOPeripheralusedbytheUART.

SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

//EnableUART0

//ConfigureGPIOPinsforUARTmode.

GPIOPinConfigure(GPIO_PA0_U0RX);

GPIOPinConfigure(GPIO_PA1_U0TX);

GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0|GPIO_PIN_1);

UARTStdioConfig(0,115200,g_ui32SysClock);

//InitializetheUARTforconsoleI/O.

voidmain()

{

uint16_tui32Loop=0,ulItemCount=0,FinishCalculateFlag=0,ulLastTickCount=0;

floatfElapsedTime;

_iq24fRadians,fSine;

FPUEnable();

FPULazyStackingEnable();

//RunfromthePLLat120MHz.

g_ui32SysClock=SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ|

SYSCTL_OSC_MAIN|SYSCTL_USE_PLL|

SYSCTL_CFG_VCO_480),120000000);

SysTickPeriodSet(g_ui32SysClock/TICKS_PER_SECOND);

IntMasterEnable();

//Enableinterruptstotheprocessor.

SysTickIntEnable();

//EnabletheSysTickInterrupt.

SysTickEnable();

//EnableSysTick.

ConfigureUART();

EPIGPIOinit();

UARTprintf("

TFTLCDtest\n"

);

EPIType:

host-bus16-bitinterface\n"

TFT_400x240_OTM4001Ainit(g_ui32SysClock);

GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_0);

//OpenBackLight.

GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,GPIO_PIN_0);

TFTLCD_ShowString(50,10,"

GC211TFTLCDtest!

"

CYAN,LIGHTBLUE);

TFTLCD_ShowString(60,40,"

y=sin(pi*t/2)"

GREEN,BLACK);

TFTLCD_DrawHorizontalLine(0,240,63,GREEN);

TFTLCD_DrawHorizontalLine(0,240,128,GREEN);

TFTLCD_DrawHorizontalLine(0,240,193,GREEN);

TFTLCD_DrawVerticalLine(64,193,0,GREEN);

TFTLCD_DrawVerticalLine(64,193,239,GREEN);

TFTLCD_ShowString(12,46,"

1"

WHITE,BLACK);

TFTLCD_ShowString(2,195,"

-1"

while

(1)

{

//Waitforthenexttimertick.

while(ulLastTickCount==g_ulTickCount){}

ulLastTickCount=g_ulTickCount;

//Preparingtoaddanewdatapointtothestripchart...

//Ifthenumbercountofitemsinthestripcharthasreachedthe

//maximumvalue,thenthedatapointsneedto"

slidedown"

inthe

//buffersonewdatacanbeaddedattheend.

if(ulItemCount==SERIES_LENGTH)

{

FinishCalculateFlag=1;

}

//Otherwise,theseriesdatabufferislessthanfullsojust

//incrementthecountofdatapoints.

else

//Incrementthenumberofitemsthathavebeenaddedtothestrip

//chartseriesdatabuffer.

g_cSeries[ulItemCount].xAxis=++ulItemCount;

//Computetheelapsedtimeindecimalseconds,infloatingpoint

//format.

fElapsedTime=(float)g_ulTickCount*FSECONDS_PER_TICK;

//Convertthetimetoradians.

//fRadians=fElapsedTime*(float)M_PI;

fRadians=_IQ24(fElapsedTime*(float)M_PI);

//_IQ24convertsafloating-pointconstantorvariableintoanIQnumber.

//Adjusttheperiodofthewave.Thiswillgiveusawaveperiod

//of4seconds,or0.25Hz.Thisnumberwaschosenarbitrarilyto

//provideanicelookingwaveonthedisplay.

fRadians=_IQdiv2(fRadians);

//_IQdiv2dividesfRadiansbytwo.

//Computethesine.Multiplyby0.5toreducetheamplitude.

fSine=_IQ24sin(fRadians);

//Computesthesineoftheinputvalue.

g_cSeries[ulItemCount-1].data=_IQ24mpyI32int(fSine,64);

//_IQ24mpyI32intmultipliesanIQnumberfSinebyaninteger32,returning

theintegerportionoftheresult.

if(!

FinishCalculateFlag)

//Ifwehaven'

tcalculatethesinevalue,continuetocalculate.

TFTLCD_DrawPoint(g_cSeries[ulItemCount-1].xAxis,g_cSeries[ulItemCount-1].data+128,BLUE);

{

//WeneedtoupdatesinevalueperSystickperiod.

for(ui32Loop=2;

ui32Loop<

SERIES_LENGTH;

ui32Loop++)

{

//Cleartheformerdata. TFTLCD_DrawPoint(g_cSeries[ui32Loop-1].xAxis,g_cSeries[ui32Loop-1].data+128,0);

g_cSeries[ui32Loop-1].data=g_cSeries[ui32Loop].data;

//Updatedata. TFTLCD_DrawPoint(g_cSeries[ui32Loop-1].xAxis,g_cSeries[ui32Loop

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2