ARM系统中断产生流程Word格式文档下载.docx
- 文档编号:22770476
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:18
- 大小:128.06KB
ARM系统中断产生流程Word格式文档下载.docx
《ARM系统中断产生流程Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ARM系统中断产生流程Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
初始值
EINT23
[23]
0=未产生中断1=产生中断
…
EINT4
[4]
保留位
[3:
0]
无
0000
(2)EINTMASK外部中断屏蔽寄存器
表3-17外部中断屏蔽寄存器(EINTMASK)
EINTMASK
0x560000A4
外部中断信号屏蔽寄存器
未屏蔽,中断可用
屏蔽中断信号
0x000FFFFF
0=未屏蔽1=屏蔽中断
1
1111
4.外部中断源的产生
外部中断产生过程读者可以根据上面中断图自行分析。
按键控制LED灯实验
本实验分三个版本,分别针对三种开发板:
友善之臂QQ2440,友善之臂MINI2440,天嵌TQ2440。
每种开发板对应工程在:
“sys_irq_开发板名”目录下。
下面实验内容为针对MINI2440开发板。
head.s:
主要实现安装异常向量表,处理复位异常,初始化必要硬件,中断入口处理等功能。
;
**********************************************************************
系统中断实验(MINI2440)
GPBCONEQU0x56000010
GPBDATEQU0x56000014
EXPORTSYS_IRQ
AREASYS_IRQ,CODE,READONLY
ENTRY
;
**********************************************************************
设置中断向量,除Reset和HandleIRQ外,其它异常都没有使用(如果不幸发生了,
将导致死机)
0x00:
复位Reset异常
bReset
0x04:
未定义异常(未处理)
HandleUndef
bHandleUndef
0x08:
软件中断异常(未处理)
HandleSWI
bHandleSWI
0x0c:
指令预取异常(未处理)
HandlePrefetchAbt
bHandlePrefetchAbt
0x10:
数据访问中止异常(未处理)
HandleDataAbt
bHandleDataAbt
0x14:
未使用异常(未处理)
HandleNotUsed
bHandleNotUsed
0x18:
一般中断异常,跳往HandleIRQ
bHandleIRQ
0x1c:
快速中断异常(未处理)
HandleFIQ
bHandleFIQ
Reset;
复位异常处理入口
关闭看门狗
ldrr0,=0x53000000
movr1,#0
strr1,[r0]
blinitmem
ldrsp,=0x32000000;
设置管理模式栈指针
IMPORTuart_init
bluart_init;
UART串口初始化
IMPORTirq_init
blirq_init;
系统中断初始化
IMPORTkey_init
blkey_init;
按键初始化
IMPORTled_init
blled_init;
LED灯初始化
msrcpsr_cxsf,#0xd2;
切换到中断模式下
ldrsp,=0x31000000;
设置中断模式栈指针
msrcpsr_cxsf,#0x13;
返回管理模式
ldrlr,=halt_loop;
设置管理模式下返回地址
IMPORTmain
ldrpc,=main;
跳入主函数main里执行
***********************************************************************
中断处理
HandleIRQ
sublr,lr,#4;
修正返回地址
stmdbsp!
{r0-r12,lr};
保存程序执行现场
ldrlr,=int_return;
设置中断处理程序返回地址
IMPORThandle_irq
ldrpc,=handle_irq;
跳入中断处理程序
int_return;
中断处理返回标签
ldmiasp!
{r0-r12,pc}^恢复程序执行现场,返回继续执行
halt_loop
bhalt_loop
initmem
ldrr0,=0x48000000
ldrr1,=0x48000034
ldrr2,=memdata
adrr2,memdata
initmemloop
ldrr3,[r2],#4
strr3,[r0],#4
teqr0,r1
bneinitmemloop
movpc,lr
memdata
DCD0x22000000;
BWSCON
DCD0x00000700;
BANKCON0
BANKCON1
BANKCON2
BANKCON3
BANKCON4
BANKCON5
DCD0x00018005;
BANKCON6
BANKCON7
DCD0x008e07a3;
REFRESH
DCD0x000000b1;
BANKSIZE
DCD0x00000030;
MRSRB6
MRSRB7
END;
代码结束
该程序主要设置异常向量表,除了Reset异常和中断处理被处理以外,其它异常都未被处理,如果发生时,会产生死循环,Reset异常里主要实现了硬件的基本初始化,如:
按键,LED灯等,设置栈指针,用于执行C程序,最后跳入C程序的main函数。
在中断处理异常处理中首先修正返回地址,保存用户执行现场,跳入到中断处理例程中执行。
sys_init.c:
硬件初始化文件,里面包含LED,KEY的初始化函数。
#include"
register.h"
comm_fun.h"
#defineTXD0READY(1<
<
2)//发送数据状态OK
#defineRXD0READY
(1)//接收数据状态OK
/*UART串口初始化*/
voiduart_init()
{
GPHCON|=0xa0;
//GPH2,GPH3usedasTXD0,RXD0
GPHUP=0x0;
//GPH2,GPH3内部上拉
ULCON0=0x03;
//8N1
UCON0=0x05;
//查询方式为轮询或中断;
时钟选择为PCLK
UFCON0=0x00;
//不使用FIFO
UMCON0=0x00;
//不使用流控
UBRDIV0=12;
//波特率为57600,PCLK=12Mhz
}
/*UART串口单个字符打印函数*/
externvoidputc(unsignedcharc)
while(!
(UTRSTAT0&
TXD0READY));
UTXH0=c;
/*UART串口接受单个字符函数*/
externunsignedchargetc(void)
RXD0READY));
returnURXH0;
/*UART串口字符串打印函数*/
externintprintk(constchar*str)
inti=0;
while(str[i]){
utc((unsignedchar)str[i++]);
}
returni;
/*按键初始化*/
intkey_init()
//设置K1,K2,K3,K4,K5,K6对应控制寄存器为中断模式
GPGCON=(2<
0)|(2<
6)|(2<
10)|(2<
12)|(2<
14)|(2<
22);
/*
01xfallingedgetriggered下降沿触发
10xRisingedgetriggered上升沿触发
11xBothedgetriggered双沿触发
*/
//设置K1,K2,K3,K4,K5按键中断触发方式为上升沿触发
EXTINT1=(3<
0)|(3<
12)|(3<
20)|(3<
24)|(3<
28);
EXTINT2=(3<
12);
//设置K6按键中断触发方式为上升沿触
printk("
按键初始化OK/r/n"
);
return0;
/*Led1~Led4初始化*/
#defineLED1(1<
5)//LED1GPBDAT[5]
#defineLED2(1<
6)//LED2GPBDAT[6]
#defineLED3(1<
7)//LED3GPBDAT[7]
#defineLED4(1<
8)//LED4GPBDAT[8]
/*点亮对应num号led灯*/
externintled_on(intnum)
switch(num)
{
case1:
GPBDAT=GPBDAT&
~LED1;
break;
case2:
~LED2;
case3:
~LED3;
case4:
~LED4;
default:
returnnum;
/*关闭num号led灯*/
externintled_off(intnum)
GPBDAT=GPBDAT|LED1;
GPBDAT=GPBDAT|LED2;
GPBDAT=GPBDAT|LED3;
GPBDAT=GPBDAT|LED4;
/*关闭全部led灯*/
externintall_led_off(void)
GPBDAT=GPBDAT|LED1|LED2|LED3|LED4;
/*led灯初始化*/
intled_init(void)
GPBCON=0x15400;
//设置GPB7为输出口
all_led_off();
led初始化OK/r/n"
/*中断初始化*/
voidirq_init(void)
//打开KEY1~KEY6的屏蔽位
INTMSK&
=~(1<
5);
EINTMASK&
=~((1<
8)|(1<
11)|(1<
13)|(1<
14)|(1<
15)|(1<
19));
中断初始化OK/r/n"
该文件是相关硬件初始化程序,主要包含了看门狗驱动,按键驱动,系统中断驱动,LED驱动。
handle_irq.c:
中断处理函数,查出中断源,中断处理,清除中断源。
#defineEINT_Key_REQUEST5//Key中断源中断号(6个按键全部使用外部子中断)
#defineK1_EINT_BIT(1<
8)//K1外部子中断位
#defineK2_EINT_BIT(1<
11)//K2外部子中断位
#defineK3_EINT_BIT(1<
13)//K3外部子中断位
#defineK4_EINT_BIT(1<
14)//K4外部子中断位
#defineK5_EINT_BIT(1<
15)//K5外部子中断位
#defineK6_EINT_BIT(1<
19)//K6外部子中断位
/*系统中断处理函数*/
voidhandle_irq()
unsignedlongirqOffSet=INTOFFSET;
//取得中断号
//关闭全部Led灯
if(EINT_Key_REQUEST==irqOffSet){//Key中断产生(6个按键使用一个总中断号)
if(K1_EINT_BIT&
EINTPEND){
led_on
(1);
//点亮Led1
Key1pressed/r/n"
EINTPEND&
=K1_EINT_BIT;
//清除外部子中断源
}elseif(K2_EINT_BIT&
led_on
(2);
//点亮Led2
Key2pressed/r/n"
=K2_EINT_BIT;
}elseif(K3_EINT_BIT&
led_on(3);
//点亮Led3
Key3pressed/r/n"
=K3_EINT_BIT;
}elseif(K4_EINT_BIT&
led_on(4);
//点亮Led4
Key4pressed/r/n"
=K4_EINT_BIT;
}elseif(K5_EINT_BIT&
all_led_off
(1);
//熄灭全部Led
Key5pressed/r/n"
=K5_EINT_BIT;
}elseif(K6_EINT_BIT&
all_led_on();
//点亮全部Led
Key6pressed/r/n"
=K6_EINT_BIT;
SRCPND&
=(1<
irqOffSet);
//清除中断源
INTPND=INTPND;
//清除中断结果
main.c:
包含主函数和延时函数,主要实现字符串的循环打印。
/*延时*/
voiddelay(intmsec)
inti,j;
for(i=1000;
i>
0;
i--)
for(j=msec*10;
j>
j--)
/*donothing*/;
/*主函数*/
intmain()
while
(1)
main函数在运行.../r/n"
delay(5);
//delay
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 系统 中断 产生 流程