当前位置:文档之家› 基于ARM嵌入式系统接口技术课程设计报告

基于ARM嵌入式系统接口技术课程设计报告

基于ARM嵌入式系统接口技术课程设计报告课程设计题目:实时时钟设计学院:计算机科学与技术学院班级:计算机09-1班学号:姓名:指导老师:微型计算机系统与接口技术课程设计设计时间:2011年12月19日至 2011年12月23日设计环境1.硬件环境:计算机,EV44B0II实验台2.软件环境:Jediview 集成开发环境一、基本功能:利用S3C44BOX的RTC和实验箱上的LCD液晶、4*4小键盘设计一个实时时钟。

1.在LCD上显示当前日期及时间。

可按如下格式显示:日期:XXXX年XX月XX日时间:XX:XX:XX班级,姓名2.利用4*4小键盘校时校时时LCD的相应位置要有光标提示。

二、定时报警功能通过小键盘设定报警时刻,报警时刻到,则在LCD上显示(各自不同的)报警图像。

三、步骤:1.掌握预备知识:a.液晶显示b.键盘译码c.掌握S3C44BO芯片 RTC的使用方法2.设计:a.实现RTC实时时钟功能b.显示实时时钟界面c.实现校时功能d.上机调试,运行,验收e.实现定时报警功能四、硬件接口逻辑图电路连接图五、程序代码(1)44binits/* ******************************************************* * NAME : 44BINIT.S ** Version : 10.JAn.2003 ** Description: ** C start up codes ** Configure memory, Initialize ISR ,stacks ** Initialize C-variables ** Fill zeros into zero-initialized C-variables ********************************************************///#include "arm.h".globl _start_start:b ResetHandler //for debugb HandlerUndef //handlerUndefb HandlerSWI //SWI interrupt handlerb HandlerPabort //handlerPAbortb HandlerDabort //handlerDAbortb . //handlerReservedb IsrIRQb HandlerFIQ//***IMPORTANT NOTE***//If the H/W vectored interrutp mode is enabled, The above two instructions should//be changed like below, to work-around with H/W bug of S3C44B0X interrupt controller.ldr pc,=HandlerEINT0 //mGA H/W interrupt vector tableldr pc,=HandlerEINT1 //ldr pc,=HandlerEINT2 //ldr pc,=HandlerEINT3 //ldr pc,=HandlerEINT4567 //ldr pc,=HandlerTICK //mGAb .b .ldr pc,=HandlerZDMA0 //mGBldr pc,=HandlerZDMA1 //ldr pc,=HandlerBDMA0 //ldr pc,=HandlerBDMA1 //ldr pc,=HandlerWDT //ldr pc,=HandlerUERR01 //mGBb .b .ldr pc,=HandlerTIMER0 //mGCldr pc,=HandlerTIMER1 //ldr pc,=HandlerTIMER2 //ldr pc,=HandlerTIMER3 //ldr pc,=HandlerTIMER4 //ldr pc,=HandlerTIMER5 //mGCb .b .ldr pc,=HandlerURXD0 //mGDldr pc,=HandlerURXD1 //ldr pc,=HandlerIIC //ldr pc,=HandlerSIO //ldr pc,=HandlerUTXD0 //ldr pc,=HandlerUTXD1 //mGDb .b .ldr pc,=HandlerRTC //mGKA b . //b . //b . //b . //b . //mGKAb .b .ldr pc,=HandlerADC //mGKB b . //b . //b . //b . //b . //mGKBb .b ./*0xe0=EnterPWDN*/ldr pc,=EnterPWDNHandlerFIQ: .word HandleFIQ HandlerIRQ: .word HandleIRQ HandlerUndef: .word HandleUndef HandlerSWI: .word HandleSWI HandlerDabort: .word HandleDabort HandlerPabort: .word HandlePabortHandlerADC: .word HandleADC HandlerRTC: .word HandleRTC HandlerUTXD1: .word HandleUTXD1 HandlerUTXD0: .word HandleUTXD0 HandlerSIO: .word HandleSIO HandlerIIC: .word HandleIIC HandlerURXD1: .word HandleURXD1 HandlerURXD0: .word HandleURXD0 HandlerTIMER5: .word HandleTIMER5 HandlerTIMER4: .word HandleTIMER4 HandlerTIMER3: .word HandleTIMER3HandlerTIMER2: .word HandleTIMER2HandlerTIMER1: .word HandleTIMER1HandlerTIMER0: .word HandleTIMER0HandlerUERR01: .word HandleUERR01HandlerWDT: .word HandleWDTHandlerBDMA1: .word HandleBDMA1HandlerBDMA0: .word HandleBDMA0HandlerZDMA1: .word HandleZDMA1HandlerZDMA0: .word HandleZDMA0HandlerTICK: .word HandleTICKHandlerEINT4567: .word HandleEINT4567HandlerEINT3: .word HandleEINT3HandlerEINT2: .word HandleEINT2HandlerEINT1: .word HandleEINT1HandlerEINT0: .word HandleEINT0/*One of the following two routines can be used for non-vectored interrupt.*/IsrIRQ: //using I_ISPR register.stmdb r13!,{r0-r8,r12,r14}bl IRQldmia r13!,{r0-r8,r12,r14}subs pc,r14,#0x4IRQ:sub sp,sp,#4 //reserved for PCstmfd sp!,{r8-r9}ldr r9,I_ISPRldr r9,[r9]mov r8,#0x0F0:movs r9,r9,lsr #1bcs F1add r8,r8,#4b F0F1:ldr r9,HandleADCadd r9,r9,r8ldr r9,[r9]str r9,[sp,#8]ldmfd sp!,{r8-r9,pc}/****************************************************** START ******************************************************/ ResetHandler:ldr r0,WTCON //watch dog disableldr r1,=0x0str r1,[r0]ldr r0,INTMSKldr r1,MASKALL //all interrupt disablestr r1,[r0]/* ***************************************************** Set clock control registers ******************************************************/ldr r0,LOCKTIMEldr r1,=800 // count = t_lock * Fin (t_lock=200us, Fin=4MHz) = 800str r1,[r0]ldr r0,PLLCON //temporary setting of PLLldr r1,PLLCON_DAT //Fin=10MHz,Fout=40MHzstr r1,[r0]ldr r0,CLKCONldr r1,=0x7ff8 //All unit block CLK enablestr r1,[r0]/* ***************************************************** Set memory control registers ******************************************************/adr r0,SMRDATAldmia r0,{r1-r13}ldr r0,=0x01c80000 //BWSCON Addressstmia r0,{r1-r13}/* **************************************************** Initialize stacks ******************************************************/ldr sp, SVCStack //Why?bl InitStacks/* ***************************************************** Setup IRQ handler ******************************************************/ldr r0,HandleIRQ //This routine is neededldr r1,IsrIRQ //if there isn't 'subs pc,lr,#4' at 0x18, 0x1cstr r1,[r0]BL Main //Don't use main() because ......B ./*****************************************************The function for initializing stack */*****************************************************/InitStacks://Don't use DRAM,such as stmfd,ldmfd......//SVCstack is initialized before//Under toolkit ver 2.50, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'mrs r0,cpsrbic r0,r0,#0X1Forr r1,r0,#0xDB //UNDEFMODE|NOINTmsr cpsr,r1 //UndefModeldr sp,UndefStackorr r1,r0,#0XD7 //ABORTMODE|NOINTmsr cpsr,r1 //AbortModeldr sp,AbortStackorr r1,r0,#0XD2 //IRQMODE|NOINTmsr cpsr,r1 //IRQModeldr sp,IRQStackorr r1,r0,#0XD1 //FIQMODE|NOINTmsr cpsr,r1 //FIQModeldr sp,FIQStackbic r0,r0,#0XDF //MODEMASK|NOINTorr r1,r0,#0X13msr cpsr,r1 //SVCModeldr sp,SVCStack//USER mode is not initialized.mov pc,lr //The LR register may be not valid for the mode changes./****************************************************** The function for entering power down mode ******************************************************//*void EnterPWDN(int CLKCON)*/EnterPWDN:mov r2,r0 //r0=CLKCONldr r0,REFRESHldr r3,[r0]mov r1, r3orr r1, r1, #0x400000 //self-refresh enablestr r1, [r0]nop //Wait until self-refresh is issued. May not be needed.nop //If the other bus master holds the bus, ...nop // mov r0, r0nopnopnopnop/*enter POWERDN mode*/ldr r0,CLKCONstr r2,[r0]/*wait until enter SL_IDLE,STOP mode and until wake-up*/mov r0,#0xffB0: subs r0,r0,#1bne B0/*exit from DRAM/SDRAM self refresh mode.*/ldr r0,REFRESHstr r3,[r0]mov pc,lrSMRDATA:/****************************************************************** * Memory configuration has to be optimized for best performance ** The following parameter is not optimized. *******************************************************************//**** memory access cycle parameter strategy ***// 1) Even FP-DRAM, EDO setting has more late fetch point by half-clock // 2) The memory settings,here, are made the safe parameters even at 66Mhz. // 3) FP-DRAM Parameters:tRCD=3 for tRAC, tcas=2 for pad delay, tcp=2 for bus load.// 4) DRAM refresh rate is for 40Mhz. */.long 0x11110090 //Bank0=OM[1:0], Bank1~Bank7=16bit, bank2=8bit//.long 0X600 //GCS0.long 0X7bc0 //GCS1.long 0X7fc0 //GCS2.long 0X7ffc //GCS3.long 0X7ffc //GCS4.long 0X7ffc //GCS5.long 0X18000 //GCS6.long 0X18000 //GCS7.long 0x820591 //REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019.long 0x16 //SCLK power mode, BANKSIZE 32M/32M.long 0x20 //MRSR6 CL=2clk.long 0x20 //MRSR7UserStack: .word 0xc7ffa00SVCStack: .word 0xc7ffb00UndefStack: .word 0xc7ffc00AbortStack: .word 0xc7ffd00IRQStack: .word 0xc7ffe00FIQStack: .word 0xc7fff00HandleReset: .word 0xc7fff00HandleUndef: .word 0xc7fff04HandleSWI: .word 0xc7fff08HandlePabort: .word 0xc7fff0cHandleDabort: .word 0xc7fff10HandleReserved: .word 0xc7fff14HandleIRQ: .word 0xc7fff18HandleFIQ: .word 0xc7fff1c//Don't use the label 'IntVectorTable',//because armasm.exe cann't recognize this label correctly.//the value is different with an address you think it may be. //IntVectorTableHandleADC: .word 0xc7fff20HandleRTC: .word 0xc7fff24HandleUTXD1: .word 0xc7fff28HandleUTXD0: .word 0xc7fff2cHandleSIO: .word 0xc7fff30HandleIIC: .word 0xc7fff34HandleURXD1: .word 0xc7fff38HandleURXD0: .word 0xc7fff3cHandleTIMER5: .word 0xc7fff40HandleTIMER4: .word 0xc7fff44HandleTIMER3: .word 0xc7fff48HandleTIMER2: .word 0xc7fff4cHandleTIMER1: .word 0xc7fff50HandleTIMER0: .word 0xc7fff54HandleUERR01: .word 0xc7fff58HandleWDT: .word 0xc7fff5cHandleBDMA1: .word 0xc7fff60HandleBDMA0: .word 0xc7fff64HandleZDMA1: .word 0xc7fff68HandleZDMA0: .word 0xc7fff6cHandleTICK: .word 0xc7fff70HandleEINT4567: .word 0xc7fff74HandleEINT3: .word 0xc7fff78HandleEINT2: .word 0xc7fff7cHandleEINT1: .word 0xc7fff80HandleEINT0: .word 0xc7fff84/* some parameters for the board *//*Interrupt Control*/INTPND:.long 0x01e00004INTMOD:.long 0x01e00008INTMSK:.long 0x01e0000cI_ISPR:.long 0x01e00020I_CMST:.long 0x01e0001c/*;Watchdog timer*/WTCON:.long 0x01d30000/*;Clock Controller*/PLLCON:.long 0x01d80000CLKCON:.long 0x01d80004LOCKTIME:.long 0x01d8000c/*;Memory Controller*/REFRESH:.long 0x01c80024/*;Pre-defined constants*/USERMODE:.long 0x10FIQMODE:.long 0x11IRQMODE:.long 0x12SVCMODE:.long 0x13ABORTMODE:.long 0x17UNDEFMODE:.long 0x1bMODEMASK:.long 0x1fNOINT:.long 0xc0_ISR_STARTADDRESS:.long 0xc7fff00 //GCS6:64M DRAM/SDRAMPLLCLK:.long 40000000PLLCON_DAT:.long ((2 << 0) + (3 << 4) +( 0x48<< 12))MASKALL:.long 0x07ffffff(2)44blcd.c#include <string.h>#include <malloc.h>#include "..\inc\option.h"#include "..\inc\def.h"#include "..\inc\44b.h"#include "..\inc\44blib.h"//#include "..\inc\lcd.h"#include "..\inc\lcdlib.h"#include "..\inc\44blcd.h"#include "..\inc\clock.h"#include "..\inc\plm.h"void clrscreen(void);void Lcd_MonoInit(void);extern int hour,min,sec,year,month,day,ye;#define frameBuffer1 0xc400000void LcdInit(void){Lcd_MonoInit();clrscreen();//displaylcd();display(10,4,3);display(10,4,6);}void Lcd_MonoInit(void){//160x240 1bit/1pixel LCD#define MVAL_USED 0rLCDCON1=(0)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MON O<<12);// disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(10<<21);//LINEBLANK=10 (without any calculation)rLCDSADDR1= (0x0<<27) | ( ((U32)frameBuffer1>>22)<<21 ) |M5D((U32)frameBuffer1>>1);// monochrome, LCDBANK, LCDBASEUrLCDSADDR2= M5D( (((U32)frameBuffer1+(SCR_XSIZE*LCD_YSIZE/8))>>1) ) | (MVAL<<21)|(1<<29);rLCDSADDR3= (LCD_XSIZE/16) | ( ((SCR_XSIZE-LCD_XSIZE)/16)<<9 );rLCDCON1=(1)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MON O<<12);// enable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,}void clrscreen(void){int i,j;unsigned int *pbuffer;pbuffer =(U32*) frameBuffer1;for (i=0;i<4800/4;i++){pbuffer[i] =0;} //(0x0FFFFFFFF);}void DisplayRtc(void){ int ye;hour=rBCDHOUR;min=rBCDMIN;sec=rBCDSEC;year=rBCDYEAR;month=rBCDMON;day=rBCDDAY;ye=0x20;display(ye>>4,3,1);display(ye&0xf,3,2);display(year>>4,3,3);display(year&0xf,3,4);display(month>>4,3,6);display(month&0xf,3,7);display(day>>4,3,9);display(day&0xf,3,10);display(hour>>4,4,1);display(hour&0xf,4,2);display(min>>4,4,4);display(min&0xf,4,5);display(sec>>4,4,7);display(sec&0xf,4,8);}void display(unsigned int Code,unsigned char line,unsigned char xdot) {unsigned short *pbuffer;unsigned char i;pbuffer =(U16*) frameBuffer1;for (i=0;i<16;i++){pbuffer[20*i+320*line+xdot]=((RTclock[Code].Data[i*2])+(RTclock[Code] .Data[i*2+1]<<8));}}void displaylcd(void){unsigned int *pbuffer,temp_data;int i;unsigned char *Buf;Buf= (unsigned char *)plm;pbuffer =(U32*) frameBuffer1;for(i = 0; i< (4800/4) ;i++){temp_data = (Buf[i*4+3] << 24) + (Buf[i*4+2] << 16) + (Buf[i*4+1] << 8) +(Buf[i*4]);pbuffer[i] = ~temp_data;Delay(10);}}// +++void DisStrhzk(char * hzku, int x1, int y1 ,unsigned char color,int charcount){ int i;int j;unsigned char hz;int xx,yy;char * hzk;unsigned char flag = 128;for(hzk=hzku,xx=x1,yy=y1;(hzk-hzku)<charcount;hzk+=32) {for(i=0;i<16;i++){hz=hzk[2*i];for(j=0;j<8;j++){if(hz & (flag>>j)){PutPixelColor(xx+j,yy+i,color);}}hz=hzk[2*i+1];for(j=0;j<8;j++){if(hz & (flag>>j)){PutPixelColor(xx+8+j,yy+i,color);}}}xx+=16;if(xx>=(SCR_XSIZE-16)){xx=x1;yy+=16;}}}(3)44blib.c/************************************************* NAME : 44BLIB.C *************************************************/#include "..\inc\44b.h"#include "..\inc\44blib.h"#include "..\inc\def.h"#include "..\inc\option.h"#include <stdarg.h>#include <string.h>#include <stdlib.h>#include <stdio.h>#include <ctype.h>/************************* SYSTEM *************************/static int delayLoopCount=400;void Delay(int time)// time=0: adjust the Delay function by WatchDog timer.// time>0: the number of loop time// 100us resolution.{int i,adjust=0;if(time==0){time=200;adjust=1;delayLoopCount=400;rWTCON=((MCLK/1000000-1)<<8)|(2<<3); //1M/64,Watch-dog,nRESET,interrupt disablerWTDAT=0xffff;rWTCNT=0xffff;rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); // 1M/64,Watch-dog enable,nRESET,interrupt disable}for(;time>0;time--)for(i=0;i<delayLoopCount;i++);if(adjust==1){rWTCON=((MCLK/1000000-1)<<8)|(2<<3);i=0xffff-rWTCNT; // 1count/16us?????????delayLoopCount=8000000/(i*64); //400*100/(i*64/200)}}/************************* PORTS ****************************/void Port_Init(void){ //CAUTION:Follow the configuration order for setting the ports. // 1) setting value// 2) setting control register// 3) configure pull-up resistor.//PORT A GROUP//GPA9 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0// 0, 1, 1, 1, 1, 1, 1, 1, 1,1rPCONA=0x1ff;rPDATA=0x0;//PORT B GROUP//GPB10 GPB9 nGCS3 nGCS2 nGCS1 GPB5 GPB4 nSRAS nSCAS SCLK SCKE// 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1rPCONB=0x1Cf;//PORT C GROUP//IISLRCK IISD0 IISDI IISCLK VD7 VD6 VD5 VD4 nXDACK1 nXDREQ1 GPC10 GPC11 TXD1 RXD1 GPC14 GPC15//All input// 11 11 11 11 11 11 11 11 11 11 0101 11 11 01 01rPDATC=0x8400;rPCONC=0x5F5FFFFF;rPUPC=0x33ff; //should be enabled//PORT D GROUP//VFRAME VM VLINE VCLK VD3 VD2 VD1 VD0// 10,10, 10, 10, 10, 10, 10, 10rPCOND=0xaaaa;rPUPD=0xff;//PORT E GROUP//PE0:FOUT, PE1:TxD0, PE2:RxD0, GPE3, GPE4, GPE5,GPE6,GPE7, CODECLK // 10 10, 10, 01 , 01, 01, 01, 01, 10rPCONE=0x2552b;rPUPE=0x0;rPDATE=0X60;//PORT F GROUP//IICSCL IICSDA nWAIT nXBACK0 nXDREQ0 GPF5 GPF6 GPF7 GPF8// 10 10 10 10 10 0 0 0 0rPCONF=0x2A;rPUPF=0x0;//PORT G GROUP//EINT0 EINT1 EINT2 EINT3 GPG4 GPG5 GPG6 GPG7// 0x0// 11 11 11 11 01 01 01 01rPDATG=0x0;rPCONG=0x55FF;rPUPG=0x0;rSPUCR=0x7; //pull-up disablerEXTINT=0x22222022; //All EINT[7:0] will be falling edge triggered. }/************************* UART ****************************/static int whichUart=0;void Uart_Init(int mclk,int baud){int i;if(mclk==0)mclk=MCLK;rUFCON0=0x0; //FIFO disablerUFCON1=0x0;rUMCON0=0x0;rUMCON1=0x0;//UART0rULCON0=0x3; //Normal,No parity,1 stop,8 bitrUCON0=0x245; //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or pollingrUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 );//UART1rULCON1=0x3;rUCON1=0x245;rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 );for(i=0;i<100;i++);}void Uart_Select(int ch){whichUart=ch;}void Uart_TxEmpty(int ch){if(ch==0)while(!(rUTRSTAT0 & 0x4)); //wait until tx shifter is empty.elsewhile(!(rUTRSTAT1 & 0x4)); //wait until tx shifter is empty. }char Uart_Getch(void){if(whichUart==0){while(!(rUTRSTAT0 & 0x1)); //Receive data read return RdURXH0();}else{while(!(rUTRSTAT1 & 0x1)); //Receive data ready return rURXH1;}}char Uart_GetKey(void){if(whichUart==0){if(rUTRSTAT0 & 0x1) //Receive data ready return RdURXH0();elsereturn 0;}else{if(rUTRSTAT1 & 0x1) //Receive data readyreturn rURXH1;elsereturn 0;}}void Uart_GetString(char *string){char *string2=string;char c;while((c=Uart_Getch())!='\r'){if(c=='\b'){if( (int)string2 < (int)string ){Uart_Printf("\b \b");string--;}}else{*string++=c;Uart_SendByte(c);}}*string='\0';Uart_SendByte('\n');}int Uart_GetIntNum(void){char str[30];char *string=str;int base=10;int minus=0;int lastIndex;int result=0;int i;Uart_GetString(string);if(string[0]=='-'){minus=1;string++;}if(string[0]=='0' && (string[1]=='x' || string[1]=='X')) {base=16;string+=2;}lastIndex=strlen(string)-1;if( string[lastIndex]=='h' || string[lastIndex]=='H' ) {base=16;string[lastIndex]=0;lastIndex--;}if(base==10){result=atoi(string);result=minus ? (-1*result):result;}else{for(i=0;i<=lastIndex;i++){if(isalpha(string[i])){if(isupper(string[i]))result=(result<<4)+string[i]-'A'+10;elseresult=(result<<4)+string[i]-'a'+10;}else{result=(result<<4)+string[i]-'0';}}result=minus ? (-1*result):result;}return result;}void Uart_SendByte(int data){if(whichUart==0){if(data=='\n'){while(!(rUTRSTAT0 & 0x2));Delay(10); //because the slow response of hyper_terminal WrUTXH0('\r');}while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.Delay(10);WrUTXH0(data);}else{if(data=='\n'){while(!(rUTRSTAT1 & 0x2));Delay(10); //because the slow response of hyper_terminal rUTXH1='\r';}while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty.Delay(10);rUTXH1=data;}}void Uart_SendString(char *pt){while(*pt)Uart_SendByte(*pt++);}//if you don't use vsprintf(), the code size is reduced very much. void Uart_Printf(char *fmt,...){va_list ap;char string[256];va_start(ap,fmt);vsprintf(string,fmt,ap);Uart_SendString(string);va_end(ap);}/******************** S3C44B0X EV. BOARD LED **********************/ // -g-- a: data0 b: data1// a/_b_/f c: data2 d: data3 dp: data4// c/_d_/e dp e: data5 f: data6 g: data7void Led_Display(unsigned char data){unsigned char * ledbuffer = (unsigned char *)led_Address;switch(data){case 0:*ledbuffer=0x12;break;case 1:*ledbuffer=0x9F;break;case 2:*ledbuffer=0x31;break;case 3:*ledbuffer=0x15;break;case 4:*ledbuffer=0x9C;break;case 5:*ledbuffer=0x54;break;case 6:*ledbuffer=0x50;break;case 7:*ledbuffer=0x1F;break;case 8:*ledbuffer=0X10;break;case 9:*ledbuffer=0x14;break;case 0xa:*ledbuffer=0x8;break;case 0xb:*ledbuffer=0xC0;break;case 0xc:*ledbuffer=0x62;break;case 0xd:*ledbuffer=0x81;break;case 0xe:*ledbuffer=0x60;break;case 0xf:*ledbuffer=0x68;break;}}/************************* PLL ********************************/ void ChangePllValue(int mdiv,int pdiv,int sdiv){rPLLCON=(mdiv<<12)|(pdiv<<4)|sdiv;}(4)44btest.c#include <string.h>#include <ctype.h>#include<stdlib.h>#include "..\inc\option.h"#include "..\inc\44b.h"#include "..\inc\44blib.h"#include "..\inc\def.h"#include "..\inc\rtc.h"#include "..\inc\44blcd.h"#include "..\inc\lcdlib.h"#include "..\inc\shuizu.h"unsigned int (*frameBuffer1)[SCR_XSIZE/32];unsigned int (*frameBuffer4)[SCR_XSIZE/16];unsigned int (*frameBuffer16)[SCR_XSIZE/8];unsigned int (*frameBuffer256)[SCR_XSIZE/4];U8 High_Low( U8 x );void PutPixelColor(int x,int y,U8 c);void Isr_Init(void);void HaltUndef(void);void HaltSwi(void);void HaltPabort(void);void HaltDabort(void);#include "..\inc\asc.h"#include "..\inc\DC.h"#include "..\inc\option.h"#include "..\inc\def.h"#include "..\inc\44b.h"#include "..\inc\44blib.h"#include "..\inc\lcdlib.h"#include "..\inc\44blcd.h"#include "..\inc\ASII.H"void Main(void)int i;extern const unsigned char acBmp2_320_240_C256[];rSYSCFG=SYSCFG_8KB;Isr_Init();Port_Init();Uart_Init(0,115200);LcdInit(); //to avoid LCD damage.Uart_Select(0);Delay(0); //calibrate Delay()Uart_Printf("\nPlease check the VDDRTC!!!");Uart_Printf("\nRTC and WDT test");Rtc_Init();Uart_Printf("\nCLOCK DISPLAY ON LCD");while(1){Display_Rtc();DisStrhzk(sj,0,0,0x1f ,sizeof(sj));Lcd_C256_Bmp( 0, 0, 320, 240, acBmp2_320_240_C256 ) ;asm("nop");Delay(2000);}}void Isr_Init(void){U32 i;pISR_UNDEF=(unsigned)HaltUndef;pISR_SWI =(unsigned)HaltSwi;pISR_PABORT=(unsigned)HaltPabort;pISR_DABORT=(unsigned)HaltDabort;for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4){*((volatile unsigned *)i)=0xEA000000+0x1FFE;}rINTCON=0x5; // Non-vectored,IRQ enable,FIQ disablerINTMOD=0x0; // All=IRQ moderINTMSK|=BIT_GLOBAL|BIT_EINT3; // All interrupt is masked. }void HaltUndef(void){Uart_Printf("Undefined instruction exception!!!\n");while(1);}void HaltSwi(void){Uart_Printf("SWI exception!!!\n");while(1);}void HaltPabort(void){Uart_Printf("Pabort exception!!!\n");while(1);}void HaltDabort(void){Uart_Printf("Dabort exception!!!\n");while(1);}void Lcd_C256_Bmp( U16 x0, U16 y0, U16 x1, U16 y1 , unsigned char bmp[] ) {int x, y ;int m = 0;for( y = y0; y < y1; y++ ) //画16色图片{for( x = x0; x < x1; x++ ){PutPixelColor( x, y, High_Low( bmp[m] ) );m++;}}}U8 High_Low( U8 x ){x = ( (x>>1)&0x1c ) | (x>>6) | (x<<5);return x ;}void PutPixelColor(int x,int y,U8 c){if(x>=0 && x<SCR_XSIZE && y>=0 && y<SCR_YSIZE)frameBuffer256[(y)][(x)/4]=( frameBuffer256[(y)][x/4] &~(0xff000000>>((x)%4)*8) )| ( (c)<<((4-1-((x)%4))*8) );}(5)rtc.c#include "..\inc\44b.h"#include "..\inc\44blib.h"#include "..\inc\rtc.h"void Rtc_Tick(void);void Rtc_display(void);void Wdt_Int(void);char *date[8] = {"","SUN","MON","TUE","WED","THU","FRI","SAT"}; volatile unsigned int sec_tick;int year,month,day,weekday,hour,min,sec;void Display_Rtc(void){int i;Uart_Printf("\nTyping any key to exit(press 1 will reset)!!!\n"); pISR_TICK=(unsigned)Rtc_display;rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset sec_tick=1;rINTMSK=~(BIT_GLOBAL|BIT_TICK);rTICINT = 127+(1<<7); //STARTi=Uart_GetIntNum();rINTMSK |= (BIT_GLOBAL | BIT_TICK);rRTCCON=0x0; //ENDif(i==1)Test_WDTimer();}void Rtc_display(void){rI_ISPC=BIT_TICK; //clear pending_bityear =0x2000+rBCDYEAR;month=rBCDMON;day=rBCDDAY;weekday=rBCDDATE;hour=rBCDHOUR;min=rBCDMIN;sec=rBCDSEC;Uart_Printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%4x,%2x,%2 x,%s,%2x:%2x:%2x",year,month,day,date[weekday],hour,min,sec);DisplayRtc();}void Rtc_Init(void){int i,j;rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No resetUart_Printf("\nEnter Year(XX):");i=Uart_GetIntNum();rBCDYEAR = 0x2000+i+(i/10)*6;Uart_Printf("Enter month(XX):");i=Uart_GetIntNum();rBCDMON = i+(i/10)*6;Uart_Printf("Enter DAY:");i=Uart_GetIntNum();rBCDDAY = i+(i/10)*6; // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7 Uart_Printf("Enter DATE((SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7):):");i=Uart_GetIntNum();rBCDDATE = i;Uart_Printf("Enter hours:");i=Uart_GetIntNum();rBCDHOUR =i+(i/10)*6;Uart_Printf("Enter minute:");i=Uart_GetIntNum();rBCDMIN=i+(i/10)*6;Uart_Printf("Enter sec:");i=Uart_GetIntNum();rBCDSEC=i+(i/10)*6;rRTCCON = 0x00; // R/W enable, 1/32768, Normal(merge), No reset }volatile int isWdtInt;/***************************************** Watch-dog timer test *****************************************/void Test_WDTimer(void){Uart_Printf("[WatchDog Timer Test]\n");rINTMSK=~(BIT_GLOBAL|BIT_WDT);pISR_WDT=(unsigned)Wdt_Int;isWdtInt=0;rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1<<2); // t_watchdog =1/66/128, interrupt enablerWTDAT=8448/4; // t_watchdog=1/(Prescalervalue+1)/Division_factorrWTCNT=8448/4;rWTCON=rWTCON|(1<<5); // 1/40/128,interruptwhile(isWdtInt!=10);rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1); // 1/66/128, reset enableUart_Printf("\nI will restart after 2 sec!!!\n");rWTCNT=8448*2;rWTCON=rWTCON|(1<<5); // 1/40/128,interruptwhile(1);rINTMSK=BIT_GLOBAL;}void Wdt_Int(void){rI_ISPC=BIT_WDT; //clear pending_bitUart_Printf("%d ",++isWdtInt);}六、实验结果超级终端显示LCD屏幕上的显示七、体会与收获经过一周的课程设计,我深刻的体会到动手实践的重要性。

相关主题