实验板子:tiny210(芯片:s5pv210)
实验目的:通过外部中断操作两个按键实现对LED灯的亮灭控制
步骤:①初始化GPIO端口,使GPIO为外部中断状态;(寄存器:GPxxCON)
例:

②配置外部中断触发模式,上升沿触发,下降沿触发,双边触发,高电平触发,低电平触发(寄存器:EXT_INT_x_CON)
例:

③取消屏蔽外部中断(寄存器:EXT_INT_x_MASK)
例:

④通过向量中断控制器(VIC)使能中断(寄存器:VIC0INTENABLE,VIC1INTENABLE,VIC2INTENABLE,VIC3INTENABLE)(注:几乎每一个中断都有其对应的VIC)

注:VICINTENABLE寄存器分别包括VIC0,IVC1,VIC2,VIC3四个,每一个中断控制器有32位,每一位对应一个中断源(假如你要使能外部中断1,那么首先要先找到外部中断1对应哪一个中断控制器,然后找到这个中断控制器的相应位为设置)
⑤设置中断程序入口(寄存器:VICxVECTADDRx)
例:*(VICxVECTADDRx) = 函数名(函数名就是一个地址)

⑥开总中断
1 __asm__(
2 /*开中断*/
3 'mrs r0,cpsrn'
4 'bic r0, r0, #0x80n'
5 'msr cpsr_c, r0n'
6 :
7 :
8 );
⑦编写中断处理程序(清除中断寄存器:EXT_INT_x_PEND)
1 void 函数名()
2 {
3 //1. 保存环境
4
5 //2. 中断处理
6
7 //3. 清除中断
8 *(EXT_INT_x_PEND) = ~0x0;//写1清除中断标志
9 *(VICxADDRESS) = 0;
10 //4. 恢复环境
11 }
中断编写思维导图(仅供参考流程思路):

总结:由中断编写思维导图应该有的思路是:1. 对相应GPIO以及中断源的初始化
2. 当中断发生,中断源对应的PEND寄存器会被置1,所以在中断处理程序里应该清除中断标志(注:写1清除中断)
3. 当中断发生,如果MASK寄存器没有取消屏蔽,则中断不被允许,所以在编写中断程序时应首先取消相应中断的屏蔽
4. 别忘了VIC的初始化,包括用VICINTENABLE对相应中断进行使能,用VICVECTADDR寄存器设置中断处理程序入口
s3c2440示例代码(仅供参考思路步骤,与s5pv210不对应):
1 void key_init()
2 {
3 rGPGCON &= ~(0x3 << 0); //设置GPGO—EINT[8]
4 rGPGCON |= (0x2 << 0); //设置GPGO—EINT[8]
5 rEXTINT1 &= ~(0xf << 0); //触发方式为低电平有效
6 rEINTPEND |= (1 << 8); //清中断
7 rEINTMASK &= ~(1 << 8); //允许外部中断
8 pISR_EINT8_23 = (U32)Key_handler; //中断服务程序
9 EnableIrq(BIT_EINT8_23); //允许中断(INTMSK)
10 }
11
12 static void __irq key_handler()
13 {
14 if (rINTPND == BIT_EINT8_23) //INTPND同时只能有一位为1
15 ClearPending(BIT_EINT8_23); //清SRCPND、INTPND #define BIT_EINT8_23 (0x1 << 5)
16 if (rEINTPEND & (1 << 8)) //清外部中断EINTPEND
17 rEINTPEND |= 1 << 8;
18 ............
19 }
其他外部中断编程参考资料:
1.中断源的相关寄存器:
当需要开启中断时,则需要对中断源进行相应的配置,这里主要记录常用的外部中断的配置。外部中断的配置主要是对引脚的配置,涉及的寄存器主要分为两组。
一组是EINT0~16,涉及的寄存器主要是EXT_INT_x_CON,EXT_INT_xMASK,EXT_INT_PEND。EXT_INT_x_CON是外部中断的的配置寄存器,主要配置中断的触发方式;EXT_INT_xMASK是外部中断的屏蔽寄存器,配置引脚的中断是否屏蔽;EXT_INT_PEND是外部中断的中断未决寄存器,中断结束时必须清楚相应位,否则会持续引发中断。
另一组的则是其余的GPIO的中断,他们复用一个中断线路,涉及的寄存器主要是GPxx_INT_CON,GPxx_INT_MASK,GPxx_INT_PEND。各寄存器功能跟第一组的类似。
2.中断控制器的相关寄存器:
VICxINTSELECT——中断类型选择寄存器,通过此寄存器选择是IRQ还是FIQ。
VICxINTENABLE——中断使能寄存器,通过此寄存器使能相应的中断线路。
VICxINTENCLEAR——中断使能清除寄存器(即失能),在控制器禁止某路中断在该寄存器设置。
VICxIRQSTATUS——普通中断请求状态寄存器,记录了经VICxINTENABLE和VICxINTSELECT过滤后的IRQ中断请求状态。
VICxFIQSTATUS——普通中断请求状态寄存器,记录了经VICxINTENABLE和VICxINTSELECT过滤后的FIQ中断请求状态。
VICxRAMINTR——原始中断请求寄存器,记录了未经VICxINTENABLE和VICxINTSELECT过滤后的中断请求状态。
VICxSOFINT——软件中断寄存器,通过该寄存器可使控制器产生相应线路的中断信号,该信号未经过优先级,VICxINTENABLE和VICxINTSELECT等寄存器的过滤。
VICxSOFINTCLEAR——软中断清除寄存器,在ISR(中断服务程序)结束时要清除该寄存器相应位来清除中断,否则该中断会持续触发。
VICxVECTADDRx——向量地址寄存器,该寄存器保存的是相应线路的ISR的地址。
VICxVECTPRIORITYx——保存相应相应线路的优先级,有16个优先级,0的优先级最高,当多个相同优先级的线路同时请求中断时,按硬件优先级排序,同一组中断,中断好越低优先级越高,如VIC0中,EINT0优先级;如正在执行某ISR时,又一同软件优先级的但硬件优先级高的线路请求中断,此时该中断被屏蔽,要当前ISR执行完毕才可受理。
VICxSWPRIORITYMASK——软件优先级屏蔽,可设置屏蔽相应的优先级,屏蔽后则相应优先级的中断被屏蔽。
VICxADDRESS——保存当前活跃的中断线路的ISR地址,读取一次该寄存器意味着当前活跃的中断请求已被标志为已服务,此操作只能在进入中断处理时执行;向该寄存器写如任意值表示清楚控制器中该路中断状态,此操作只能在ISR结尾处执行。
VICxPROTECTION——控制器保护模式配置寄存器,配置为保护模式时,中断控制器的寄存器只能在特权模式下被访问;非保护模式时,用户模式和特权模式都可以访问中断控制器的寄存器。VICxPROTECTION只能在特权模式下访问。
3.处理器内核配置主要是配置CPSR寄存器,配置相应中断控制位为允许中断。
上一篇:ARM-Linux S5PV210 UART驱动(1)----用户手册中的硬件知识
下一篇:基于linux操作系统下s5pv210板子的按键中断实验
推荐阅读最新更新时间:2026-03-21 16:16
- Er3105Di 500Ma宽输入电压同步降压稳压器内部默认参数选择典型应用示意图
- 使用 LTC2377CMS-16、16 位、500ksps、低功耗 SAR ADC 的典型应用
- L7806C负输出电压电路的典型应用
- LT3959 的典型应用 - 具有 6A、40V 开关的宽输入电压范围升压/SEPIC/反相转换器
- LPS33W适配器板,标准DIL24插座
- 使用 Analog Devices 的 LT3470AIDDB 的参考设计
- MC33364通用输入电池充电器典型应用电路
- AM2G-2405SH30Z 5V 2W DC/DC 转换器的典型应用
- 用于电池测试解决方案的 ADP1972 降压或升压、PWM 控制器的典型应用
- LT1121IS8-3.3 5V 低压差稳压器的典型应用电路,用于具有关断的电池供电电源

FEKO使用指南FEKO
运算放大器使用指南
非常经典的关于LLC的杨波博士论文
ASM10DTBD-S664






京公网安备 11010802033920号