嵌入式学习之ARM中断编程
2013-06-16 19:38
183 查看
一、中断控制寄存器
ARM微处理器支持7种工作模式,分别为:
1. 用户模式(Usr) 用于正常执行程序
2. 快速中断模式(FIQ) 用于高速数据传输
3. 外部中断模式(IRQ) 用于通常的中断处理
4. 管理模式(SVC) 操作系统使用的保护模式(高权限),复位和软件中断进入
5. 数据访问终止模式(abt) 当数据或指令预取终止时进入该模式,可用于虚拟内存及存储保护
6. 系统模式(sys) 运行均有特权的操作系统任务
7. 未定义指令终止模式(und) 用于支持硬件协处理器的软件仿真(浮点、微量运算)
通过软件编程可以实现各个模式之间进行切换,各个模式所占的寄存器如下图所示:
[align=left] [/align]
每种中断模式除了共同的寄存器R0~R15这16个寄存器之外,还包括CPSR即当前程序状态寄存器(current programe status register),CPSR中的各个位用于指明当前程序所处的中断状态和模式,寄存器的各位作用如下:
[align=left] [/align]
M0~M4用于表示程序当前工作的中断模式,对应于如下各个工作模式:
[align=left] [/align]
T位用于指定当前CPU是出去Thumb(16位)还是处于ARM(32位)状态;
N位:N=1表示运算的结果为负数;N=0 表示运算的结果为正数或零;
Z 位:Z=1 表示运算的结果为零;Z=0表示运算的结果为非零;
C位:进位、借位标记位:当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。
二、中断控制编程:
通过对中断控制寄存器中的各位进行编程控制可以实现中断,各控制位参见上一篇博文,下面主要介绍他们的编程实现。
ARM微处理器支持7种工作模式,分别为:
1. 用户模式(Usr) 用于正常执行程序
2. 快速中断模式(FIQ) 用于高速数据传输
3. 外部中断模式(IRQ) 用于通常的中断处理
4. 管理模式(SVC) 操作系统使用的保护模式(高权限),复位和软件中断进入
5. 数据访问终止模式(abt) 当数据或指令预取终止时进入该模式,可用于虚拟内存及存储保护
6. 系统模式(sys) 运行均有特权的操作系统任务
7. 未定义指令终止模式(und) 用于支持硬件协处理器的软件仿真(浮点、微量运算)
通过软件编程可以实现各个模式之间进行切换,各个模式所占的寄存器如下图所示:
[align=left] [/align]
每种中断模式除了共同的寄存器R0~R15这16个寄存器之外,还包括CPSR即当前程序状态寄存器(current programe status register),CPSR中的各个位用于指明当前程序所处的中断状态和模式,寄存器的各位作用如下:
[align=left] [/align]
M0~M4用于表示程序当前工作的中断模式,对应于如下各个工作模式:
[align=left] [/align]
T位用于指定当前CPU是出去Thumb(16位)还是处于ARM(32位)状态;
N位:N=1表示运算的结果为负数;N=0 表示运算的结果为正数或零;
Z 位:Z=1 表示运算的结果为零;Z=0表示运算的结果为非零;
C位:进位、借位标记位:当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。
二、中断控制编程:
通过对中断控制寄存器中的各位进行编程控制可以实现中断,各控制位参见上一篇博文,下面主要介绍他们的编程实现。
void init_irq( ) { // S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2 GPFCON &= ~(GPF0_msk | GPF2_msk); GPFCON |= GPF0_eint | GPF2_eint; // S4对应的引脚设为中断引脚EINT11 GPGCON &= ~GPG3_msk; GPGCON |= GPG3_eint; // 对于EINT11,需要在EINTMASK寄存器中使能它 EINTMASK &= ~(1<<11); /* * 设定优先级: * ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ3,即EINT0 > EINT2 * 仲裁器1、6无需设置 * 最终: * EINT0 > EINT2 > EINT11即K2 > K3 > K4 */ PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ; // EINT0、EINT2、EINT8_23使能 INTMSK &= (~(1<<0)) & (~(1<<2)) & (~(1<<5)); }
void int_init(void) { rSRCPND = rSRCPND; // clear all interrupt rINTPND = rINTPND; // clear all interrupt // nIntMode='3'; rGPFCON = (rGPFCON & 0xffcc) | (1<<5) | (1<<1); // PF0/2 = EINT0/2 rGPGCON = (rGPGCON & 0xff3fff3f) | (1<<23) | (1<<7); // PG3/11 = EINT11/19 pISR_EINT0=(UINT32T)isrEINT0;//int0_int; //isrEINT0; pISR_EINT8_23=(UINT32T)isrEINT11_19;//int11_int; //isrEINT11_19; rEINTPEND = 0xffffff; rSRCPND = BIT_EINT0 | BIT_EINT8_23; //to clear the previous pending states rINTPND = BIT_EINT0 | BIT_EINT8_23; rEXTINT0 = (rEXTINT0 & ~((7<<8) | (0x7<<0))) | 0x2<<8 | 0x2<<0; // EINT0/2=falling edge triggered rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x2<<12; //EINT11=falling edge triggered rEINTMASK &= ~(1<<11); rINTMSK &= ~(BIT_EINT0 | BIT_EINT8_23); }
相关文章推荐
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之二--Linux中断的组织形式
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之三--Linux对异常和中断的处理
- 嵌入式学习之ARM中断
- 什么是嵌入式编程?什么是ARM?如何学习? (续)
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】中断服务下半部之工作队列详解
- TQ2440 学习笔记—— 10、嵌入式编程基础知识【arm-linux-ld 选项】
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之四--中断API
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之目录
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之一--中断概述
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之二--Linux中断的组织形式
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之三--Linux对异常和中断的处理
- 关于 arm的中断系统 分类: 嵌入式开发学习 2011-04-11 19:30 560人阅读 评论(0) 收藏
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之四--中断API
- 嵌入式学习方法-----关于arm+linux编程开发的学习心得
- TQ2440 学习笔记—— 11、嵌入式编程基础知识【arm-linux-objcopy、objdump选项】
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】中断服务下半部之七姑八姨
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】中断服务下半部之老大-软中断softirq
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】中断服务下半部之tasklet详解
- 嵌入式arm学习总结(七)--中断-基于S3C2440
- 嵌入式外部中断控制编程方法论—比較CC2541(51核)和S5PV210(ARM核)