浙江工业大学单片机第六次实验文档格式.docx
《浙江工业大学单片机第六次实验文档格式.docx》由会员分享,可在线阅读,更多相关《浙江工业大学单片机第六次实验文档格式.docx(32页珍藏版)》请在冰点文库上搜索。
幅画面更新。
液晶的彩色都是透明的必须给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