基于ARM嵌入式系统接口技术课程设计报告.doc
基于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 班级,姓名 里程: x x x x km2利用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 debug b HandlerUndef /handlerUndef b HandlerSWI /SWI interrupt handler b HandlerPabort /handlerPAbort b HandlerDabort /handlerDAbort b . /handlerReserved b IsrIRQ b 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 table ldr pc,=HandlerEINT1 / ldr pc,=HandlerEINT2 / ldr pc,=HandlerEINT3 / ldr pc,=HandlerEINT4567 / ldr pc,=HandlerTICK /mGA b . b . ldr pc,=HandlerZDMA0 /mGB ldr pc,=HandlerZDMA1 / ldr pc,=HandlerBDMA0 / ldr pc,=HandlerBDMA1 / ldr pc,=HandlerWDT / ldr pc,=HandlerUERR01 /mGB b . b . ldr pc,=HandlerTIMER0 /mGC ldr pc,=HandlerTIMER1 / ldr pc,=HandlerTIMER2 / ldr pc,=HandlerTIMER3 / ldr pc,=HandlerTIMER4 / ldr pc,=HandlerTIMER5 /mGC b . b . ldr pc,=HandlerURXD0 /mGD ldr pc,=HandlerURXD1 / ldr pc,=HandlerIIC / ldr pc,=HandlerSIO / ldr pc,=HandlerUTXD0 / ldr pc,=HandlerUTXD1 /mGD b . b . ldr pc,=HandlerRTC /mGKA b . / b . / b . / b . / b . /mGKA b . b . ldr pc,=HandlerADC /mGKB b . / b . / b . / b . / b . /mGKB b . b ./*0xe0=EnterPWDN*/ ldr pc,=EnterPWDNHandlerFIQ:.word HandleFIQHandlerIRQ:.word HandleIRQHandlerUndef:.word HandleUndefHandlerSWI:.word HandleSWIHandlerDabort:.word HandleDabortHandlerPabort:.word HandlePabortHandlerADC:.word HandleADCHandlerRTC:.word HandleRTCHandlerUTXD1:.word HandleUTXD1HandlerUTXD0:.word HandleUTXD0HandlerSIO:.word HandleSIOHandlerIIC:.word HandleIICHandlerURXD1:.word HandleURXD1HandlerURXD0:.word HandleURXD0HandlerTIMER5:.word HandleTIMER5HandlerTIMER4:.word HandleTIMER4HandlerTIMER3:.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,r14bl IRQldmia r13!,r0-r8,r12,r14subs pc,r14,#0x4IRQ: sub sp,sp,#4 /reserved for PC stmfd sp!,r8-r9 ldr r9,I_ISPR ldr r9,r9 mov r8,#0x0F0: movs r9,r9,lsr #1 bcs F1 add r8,r8,#4 b F0F1: ldr r9,HandleADC add r9,r9,r8 ldr r9,r9 str r9,sp,#8 ldmfd sp!,r8-r9,pc/* *START * */ResetHandler: ldr r0,WTCON /watch dog disable ldr r1,=0x0 str r1,r0 ldr r0,INTMSK ldr r1,MASKALL /all interrupt disable str r1,r0/* * *Set clock control registers* */ ldrr0,LOCKTIME ldrr1,=800 / count = t_lock * Fin (t_lock=200us, Fin=4MHz) = 800 strr1,r0ldrr0,PLLCON/temporary setting of PLLldrr1,PLLCON_DAT /Fin=10MHz,Fout=40MHzstrr1,r0 ldr r0,CLKCON ldr r1,=0x7ff8 /All unit block CLK enable str r1,r0/* * *Set memory control registers* */ adr r0,SMRDATA ldmia r0,r1-r13 ldr r0,=0x01c80000 /BWSCON Address stmia r0,r1-r13/* * *Initialize stacks* */ ldr sp, SVCStack/Why? bl InitStacks/* * *Setup IRQ handler* */ ldr r0,HandleIRQ/This routine is needed ldr r1,IsrIRQ/if there isn't 'subs pc,lr,#4' at 0x18, 0x1c str r1,r0 BLMain /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,cpsr bic r0,r0,#0X1F orr r1,r0,#0xDB/UNDEFMODE|NOINT msr cpsr,r1/UndefMode ldr sp,UndefStack orr r1,r0,#0XD7/ABORTMODE|NOINT msr cpsr,r1 /AbortMode ldr sp,AbortStack orr r1,r0,#0XD2/IRQMODE|NOINT msr cpsr,r1 /IRQMode ldr sp,IRQStack orr r1,r0,#0XD1/FIQMODE|NOINT msr cpsr,r1 /FIQMode ldr sp,FIQStack bic r0,r0,#0XDF/MODEMASK|NOINT orr r1,r0,#0X13 msr cpsr,r1 /SVCMode ldr 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=CLKCON ldr r0,REFRESH ldr r3,r0 mov r1, r3 orr r1, r1, #0x400000 /self-refresh enable str 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, r0 nop nop nop nop/*enter POWERDN mode*/ ldr r0,CLKCON str r2,r0/*wait until enter SL_IDLE,STOP mode and until wake-up*/ mov r0,#0xff B0: subs r0,r0,#1 bneB0/*exit from DRAM/SDRAM self refresh mode.*/ ldr r0,REFRESH str 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=OM1:0, Bank1Bank7=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:.word0xc7ffa00SVCStack:.word0xc7ffb00UndefStack:.word0xc7ffc00AbortStack:.word0xc7ffd00IRQStack:.word0xc7ffe00FIQStack:.word0xc7fff00HandleReset:.word0xc7fff00HandleUndef:.word0xc7fff04HandleSWI:.word0xc7fff08HandlePabort:.word0xc7fff0cHandleDabort:.word0xc7fff10HandleReserved:.word0xc7fff14HandleIRQ:.word0xc7fff18HandleFIQ:.word0xc7fff1c/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:.word0xc7fff20HandleRTC:.word0xc7fff24HandleUTXD1:.word0xc7fff28HandleUTXD0:.word0xc7fff2cHandleSIO:.word0xc7fff30HandleIIC:.word0xc7fff34HandleURXD1:.word0xc7fff38HandleURXD0:.word0xc7fff3cHandleTIMER5:.word0xc7fff40HandleTIMER4:.word0xc7fff44HandleTIMER3:.word0xc7fff48HandleTIMER2:.word0xc7fff4cHandleTIMER1:.word0xc7fff50HandleTIMER0:.word0xc7fff54HandleUERR01:.word0xc7fff58HandleWDT:.word0xc7fff5cHandleBDMA1:.word0xc7fff60HandleBDMA0:.word0xc7fff64HandleZDMA1:.word0xc7fff68HandleZDMA0:.word0xc7fff6cHandleTICK:.word0xc7fff70HandleEINT4567:.word0xc7fff74HandleEINT3:.word0xc7fff78HandleEINT2:.word0xc7fff7cHandleEINT1:.word0xc7fff80HandleEINT0:.word0xc7fff84/* 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:.long40000000PLLCON_DAT: .long (2 << 0) + (3 << 4) +( 0x48<< 12)MASKALL:.long 0x07ffffff(2)44blcd.c#include <string.h>#include <malloc.h>#include ".incoption.h"#include ".incdef.h"#include ".inc44b.h"#include ".inc44blib.h"/#include ".inclcd.h"#include ".inclcdlib.h"#include ".inc44blcd.h"#include ".incclock.h"#include ".incplm.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_MONO<<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_MONO<<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+) pbufferi =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+) pbuffer20*i+320*line+xdot=(RTclockCode.Datai*2)+(RTclockCode.Datai*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 = (Bufi*4+3 << 24) + (Bufi*4+2 << 16) + (Bufi*4+1 << 8) +(Bufi*4); pbufferi = 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=hzk2*i;for(j=0;j<8;j+) if(hz & (flag>>j) PutPixelColor(xx+j,yy+i,color);hz=hzk2*i+1;for(j=0;j<8;j+) if(hz & (flag>>j)