
嵌入式系统及应用实验报告.docx
27页实验一 1实验二 3实验三 6实验四 9实验五 17实验因1、实验名称:中断编程实例U!S2TDJ5EAS3EINT2TD-15E\ S42、实验任务(1) 利用按键S2控制D10的点亮和熄灭2) 分别利用按键S2、S3和S4控制DIO、D11和D12的 点亮和熄灭3、电路原理图EINTDEINT11EINT19TD-15E\S5图3-1 I/O应用实例电路原理图4、原理分析中断是I/O端口或部件在完成一个I/O操作后,产生一个信 号给微处理器,这个信号叫做“中断请求”,微处理器响应这个 请求信号,停止其当前的程序操作,而转向对该I/O端口或部件 进行新的读/写操作即中断发生时,程序计数器(PC)的值发生 变化,指向一个管理I/O端口或部件的中断服务程序例程(也称 作设备驱动程序),完成向I/O端口或部件写一个数据或从I/O 端口或部件读取刚准备好的数据在本实验中,GPF4对应nLEDl、GPF5对应nLED2、GPF6 对应 nLED3o EINTO 对应 GPFO、EINT2 对应 GPF2、EINT11 对 应 GPG3o5、程序设计//#include ”S3C244()A.h”〃看门狗register#define WTCON (^(volatile unsigned long*)()x53000()()0) //GPIO register(^(volatile unsigned long*)0x4A000000) (*(volatile unsigned long*)0x4A000004) (^(volatile unsigned long*)0x4A000008) (^(volatile unsigned long*)0x4A00000C) (*(volatile unsigned long*)0x4A000010) (*(volatile unsigned long*)0x4A000014)#define GPFCON (^(volatile unsigned long*)0x56000050) #define GPFDAT (^(volatile unsigned Iong*)0x56000054) #define GPFUP (^(volatile unsigned long*)0x56000058) #define GPGCON (*(volatile unsigned long*)0x56000060) #define GPGDAT (^(volatile unsigned long*)0x56000064) #define GPGUP (^(volatile unsigned Iong*)0x56000068) //inten-upt register #define SRCPND #define INTMOD #define INTMSK #define PRIORITY #define INTPND #define INTOFFSET #define SUBSRCPND (^(volatile unsigned long*)0x4A000018) #define INTSUBMASK (^(volatile unsigned long*)0x4A00001C) //extemal interrupt register#define EINTMASK (*(volatile unsigned long*)0x560000A4)#define EINTPEND (*(volatile unsigned long*)0x560000A8)#define EINTFLT2 (^(volatile unsigned long*)0x5600009C)#define EINTFLT3 (^(volatile unsigned long*)0x4C6000A0)#define EXTINTO#define EXTINT 1#dcfine EXTINT2(•(volatile unsigned long*)0x56000088) (^(volatile unsigned long*)0x5600008C) (^(volatile unsigned long * )0x56000090) ;init.sEXPORT initAREA init, CODE, READONLY ENTRY;设置中断向量;0x00:复位Reset异常B Reset;0xl8: HandlelRQB HandlelRQReset;关闭看门狗LDR R0, =0x53000000MOV Rl, #0x0000STRR1,[R0];#define WTCON (^(volatile unsignedIong*)0x53000000);WTCON = 0x0000;BL initmenLDR SP, =0x32000000 ;设置管理模式栈指针IMPORT irq_initBL irq_init ;系统中断初始化IMPORT keyjnitBL key_init ;按键初始化IMPORT ledjnitBL ledjnit ;LED 初始化MSR cpsr_cxsf, #()xD2 ;切换到中断模式下LDR SP =0x31000000 ;设置中断模式栈指针MSR cpsr_cxsf, #0x 13 ;返回管理模式 LDR LR, =halt_Ioop ;设置管理模式下返回地址liIMPORT mainLDR PC, =main ;跳转到主函数main;中断处理Han 出 cIRQSUB LR, LR, #4 ;修正返回地址STMDB SP!,(R0-R12, LR);保存程序执行现场LDR LR, =init_return ;设置中断处理程序的返回地址IMPORT handle.irqLDR PC, =handle_irq ;跳转到中断处理程序 handle_irqinit_returnLDMIA SP!,{R0-R12, PC)A ;恢复程序执行现场 haltjoop initmen 的起始地址B haltjoopLDR RO, =0x48000000 ;内存控制寄存器LDR R1, =0x48000034 ;内存控制寄存器的结束地址ADR R2, memdatainitmenloopLDR R3, [R2], #4STR R3, [R0], #4TEQ R0,RlBNE initmenloop ;循环设置每一个寄存器MOV PC, LRmemdataDCD 0x22000000;BWSCQNDCD 0x00000700;BANKCON0DCD 0x00000700:BANKCON 1DCD 0x00000700;BANKCON2DCD 0x00000700;BANKCON3DCD 0x00000700;BANKCQN4DCD 0x()00(X)7()0;BANKCON5DCD 0x00018005;BANKCON6DCD 0x00018005;BANKCON7DCD 0x()08E07A3;REFRESHDCD 0x()()()(X)()Bl ;BANKSIZEDCD 0x00000030;MRSRB6DCD OxOOOOOO3O;MRSRB7 END//sys_init.c#include "stdio.h"#include ”S3C2440A.h”#dcfincD10 1«4#defineDll 1«5#define D12 1«6〃系统中断初始化void irq_init(){INTMSK &= ~((1 «5)| (1«2)|(1«()));EINTMASK &= ~(1«11);}〃按键初始化void key_init(){GPFCON &= ~((1«4) |(l«0));GPFCON |=((l«5)|(l«l));GPFCON &= ~(l«6);GPFCON |= (1«7);}//LED初始化void led_init(){GPFCON &= ~((1«13)|(1«11)| (1«9));GPFCON |= ((l«12)|(l«10)| (1«8));}〃点亮全部LEDvoid all_led_on(){GPFDAT &= ~((1«6) | (1«5) |(1«4));}〃熄灭全部LEDvoid all_led_off()(GPFDAT |=((1 «6) |(1 «5)| (1 «4));)〃逐个点亮LEDvoid led_on(int num)//10-D10 11-D11 12-D12 (switch(num)(case 10:GPFDAT &=〜DIO;break;case 11:GPFDAT &=〜Dll;break;case 12:GPFDAT &= ~D12;break;default:break;)1〃逐个熄灭LEDvoid led_off(int num)(switch(num)(case 10:GPFDAT |= DIO;break;case 11:GPFDAT |= Dll;break;case 12:GPFDAT |= DI2;break;default:break;}}//handele_irq.c〃系统中断处理函数#include "stdio.h"include ”S3C2440A.h”#define S2.REQUEST l«0 //S2 中断号 #define S3_REQUEST 1«2 〃S3 中断号 #define S4_REQUEST 1«5 //S4 中断号 #define S4_EINT_BIT 1«11 //S4 子中断号 extern all_lcd_off();extern led_on(int num);〃系统中断处理函数void handle_irq(){unsigned long irqOffSet = INTOFFSET; 〃取得中断号 aH_led_off(); 〃关闭全部 LED if(S2_REQUEST == irqOffSet){led_on(10); 〃点亮 DIO}else if(S2_REQUEST == irqOffSet)(led_on(l 1); 〃点亮 D11}else if(S2_REQUEST = irqOffSet)(lcd_on(12); 〃点亮 D12EINTPEND &= S4_EINT_BIT;}SRCPND &= (1 vv irqOffSet);INTPND = INTPND;)//main.c#includc "stdio.h"#includc ”S3C2440A.h”extern void led_on(); extern void led_off();〃延时函数void delay(int msec)for(i=0; i












