历史上的今天
返回首页

历史上的今天

今天是:2025年12月07日(星期日)

正在发生

2022年12月07日 | ARM9的中断处理技术详细深入剖析-三星S3C2440处理器

2022-12-07 来源:zhihu

1、中断的生命周期

中断信号产生(中断源)—》中断信号过滤(中断控制器)—》中断信号处理(CPU)

1.1 中断源
在中断的生命周期中,中断源的作用是负责产生中断信号。

S3C2440支持60个中断源(包含子中断源,不包括EINT8_23等里面的独立中断源,例如串口的发送中断、接收中断、错误中断属于串口的子中断源。);

S3C6410支持64个中断源;

S5PV210支持93个中断源;

1.2 中断控制器


1.3 中断处理
1)非向量方式(2440)


2)向量方式(6410/210)


(对于向量方式,是直接进入中断函数(而不是跳转到中断程序总入口),因为中断函数(的地址)保存在相应寄存器里,根据相应中断源跳转到对应的中断函数处)

1.4 总结
中断代码的编辑过程:
初始化中断源–>初始化中断控制器–>中断处理代码


2 、按键中断点亮LED

先将之前写的代码进行优化(将各个部分的代码移植到相应新建的.c文件中)
(主要是touch ~~.c chmod 777 ~~.c)

1)中断源的初始化

将四个按键对应的引脚设为外部中断模式



#define GPGCON  (volatile unsigned long *)0x56000060
 /* K1,K2,K3,K4对应GPG0、GPG3、GPG5、GPG6*/
#define GPG5_int(0x2<<(5*2))
#define GPG6_int(0x2<<(6*2))
#define GPG0_msk(3<<(0*2))
#define GPG3_msk(3<<(3*2))
#define GPG5_msk(3<<(5*2))
#define GPG6_msk(3<<(6*2))void button_init()
{   
*(GPGCON) &= ~(GPG0_msk | GPG3_msk | GPG5_msk | GPG6_msk);
*(GPGCON) |= GPG0_int | GPG3_int | GPG5_int | GPG6_int;
}

2)初始化中断控制器

在初始化程序中,首先将外部中断8、11、13、14使能。


因为外部中断8、11、13、14属于中断源EINT8_23,将其使能。



操作状态寄存器cpsr的第7位,打开IRQ中断


3)中断处理
因为外部中断源为EINT8_23,所以直接使用寄存器INTOFFSET(判断中断请求源寄存器)是不行的,需要使用寄存器EINTPEND(外部中断未决寄存器)(当这个寄存器的对应位为1时,表示产生了相应中断,在产生完中断后,需要将该位写1来清除中断)。



中断控制器初始化和中断处理的源代码如下:

/*interrupt registes*/

#define SRCPND(volatile unsigned long *)0x4A000000

#define INTMOD(volatile unsigned long *)0x4A000004

#define INTMSK(volatile unsigned long *)0x4A000008

#define PRIORITY(volatile unsigned long *)0x4A00000c

#define INTPND(volatile unsigned long *)0x4A000010

#define INTOFFSET(volatile unsigned long *)0x4A000014

#define SUBSRCPND(volatile unsigned long *)0x4A000018

#define INTSUBMSK(volatile unsigned long *)0x4A00001c

#define EINTMASK (volatile unsigned long *)0x560000a4

{// 在EINTMASK寄存器中使能它们

 *(EINTMASK) &= (~(1<<8)) & (~(1<<11)) & (~(1<<13)) & (~(1<<14));// EINT8_23使能

*(INTMSK)   &= ~(1<<5);

__asm__( 

/*开中断*/  

"mrs r0,cpsrn"

"bic r0, r0, #0x80n"

"msr cpsr_c, r0n"            

  );

}void handle_int()

{    /*读取产生中断的源*/

unsigned long value = *(EINTPEND) & ((1<<8)|(1<<11)|(1<<13)|(1<<14));    

switch(value) 

{ case (1<<8): //K1

led_on();break;case (1<<11): //K2

led_off();break; case (1<<13): //K3

led_on();break;case (1<<14): //K4

led_off(); break;

default:break;

} /* 中断清除 */

*(EINTPEND) = value; //SRCPND:记录当前有哪些中断发生?依据是否有多个中断同时发生,可能会有多个置位

//INTPND:记录经过INTMSK,优先仲裁后,哪个中断会被当前处理

//通过对中断未决寄存器SRCPND和INTPND相应位写1 来清除未决条件

*(SRCPND) = 1 << 5; //Indicate the interrupt request status.

*(INTPND) = 1 << 5;start.S中,当程序发生中断时,就会跳到中断处执行


[object Object]


(对于main.c只需要调用相应的函数就行了,为了验证中断的效果,使用宏定义的方式将MMU关闭,则将控制led的IO口的地址设为实际地址。)
在完成了以上的工作后,发现LED还是不能 点亮,其原因是因为在start.S文件中,程序首先进入的是SVC模式,在对栈的设置时,实际上是SVC模式下对栈指针SP(R13_svc)的设置,而中断中cpu进入的是IRQ模式,需要在此模式下对栈进行初始化。

代码如下:

init_stack:
  msr cpsr_c, #0xd2   //进入中断模式
  ldr sp, =0x33000000 //初始化r13_irq
  msr cpsr_c, #0xd3   //进入svc模式
  ldr sp, =0x34000000 //初始化R13_svc
  mov pc ,lr

附main.c代码:

int gboot_main()
{#ifdef MMU_ON
    mmu_init();#endif
    led_init();
    button_init();
    init_irq();    while(1);    return 0;    
}


推荐阅读

史海拾趣

Boyd Corporation公司的发展小趣事

Boyd Corporation自创立之初,便致力于研发创新的热管理和环境密封解决方案。公司不断投入研发资源,推出了一系列高效、可靠的产品,这些产品在电子行业中迅速获得了广泛应用。通过持续创新,Boyd Corporation逐渐在市场中树立了技术领先的形象,吸引了众多合作伙伴和客户的关注。

台湾凯励(Carli)公司的发展小趣事

作为一家有社会责任感的企业,凯励公司始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,凯励公司还积极参与社会公益活动,为社区和环境贡献自己的力量。这些举措不仅体现了凯励公司的社会责任感,也为其在电子行业树立了良好的形象。

Garmin_Canada_Inc.公司的发展小趣事
合理的电路设计可以减少信号干扰和失真,提高拨号的准确性。例如,在接收部分采用单端输入,并配置适当的滤波电路和放大电路;在发送部分则注意信号的波形整形和功率放大。
Eink公司的发展小趣事
随着电子纸技术的广泛应用,E-Ink公司的商业地位也逐渐上升。其电子纸产品不仅在全球范围内销售,还赢得了众多合作伙伴的青睐。同时,E-Ink公司并没有停止技术创新的步伐,继续投入大量资源进行研发,以推动电子纸技术的进一步发展。这种持续的创新精神使得E-Ink公司在电子行业中保持了领先地位。
Belkin公司的发展小趣事

随着电子行业的快速发展,贝尔金也紧跟时代步伐,不断进行技术革新和产品线拓展。2002年,贝尔金为苹果Dock连接器研发了一系列产品,包括汽车套件、电池组、读卡器等,这标志着它与苹果公司的深度合作开始。此后,贝尔金逐渐成为苹果官方合作配件制造商,其产品在苹果用户中享有很高的声誉。

北京人民电器厂公司的发展小趣事

随着北京人民电器产品的不断优化和升级,其生产的GM系列直流断路器在发电、输变电系统中得到了广泛应用。众多电力企业和项目都选择了北京人民电器的产品,这不仅是对其产品质量和技术水平的认可,也进一步推动了公司在电力行业的深入发展。

问答坊 | AI 解惑

用实时时钟芯片DS1305启动数据采集系

用实时时钟芯片DS1305启动数据采集系 摘要:介绍串行时钟芯片DS1305的功能、结构及其利用DS1305设计的电源开关电路,可使数据采集系统平时处于关闭状态。定时开启时系统上电,进行数据采集;一次工作结束时关闭开关,系统断电。 关键词:DS ...…

查看全部问答>

两款手机充电器拆解分析

前段时间买的手机,配了一块电池和一个座充,另外跟朋友去买手机送了一个直充转座充的“小盒子”。都是很便宜的东东。这两天把这两款手机充电器拆开了,看了一下里面电路…   先拆开“”小盒子…里面稀稀散散几个器件,先汗一把 (=o=!) ...…

查看全部问答>

模块电源,开关电源软启动电路设计与应用

开关电源 ,模块电源 ,军品电源  稳压电源 开关电源以其体积小巧、性能卓越、使用方便的显著特点,在通信、网络、工控、铁路、军事等领域日益得到广泛的应用。很多系统设计人员已经意识到,正确合理地设计开关电源,可以省去电源设计 ...…

查看全部问答>

矢量控制,电机定子磁路初始值计算

工程上,怎样计算,有做低压变频器的吗?…

查看全部问答>

有关PLL的小问题

QUARTUS II里面锁相环PLL怎么不能设为10M以下的,而且11M,13M为什么也不能啊。。。…

查看全部问答>

这两句打印信息是什么搞的,查找不到啊?

DeviceFolder::LoadDevice!Enumerate Found deprecated load instructions at (Drivers\\BuiltIn\\AFD). Driver cannot be unloaded. USB enable interrutp DeviceFolder::LoadDevice!Enumerate Found deprecated load instructions at (Drivers\ ...…

查看全部问答>

终于可以踏上回家行程,祝福兄弟姐妹们新年快乐!全家幸福!

终于可以踏上回家行程,祝福兄弟姐妹们新年快乐!全家幸福!…

查看全部问答>

在CE下ISA驱动封装的DLL用注册吗?

我使的是PC104是威盛的芯片组在上面做的ISA卡的驱动DLL我已经把它加载进NK了,问下ISA驱动的DLL用修改platform.reg才能使用吗?…

查看全部问答>

sql ce 下目录快照怎么设置拉??

我是一个新手拉  刚刚接触EVC编程拉  哪个好心的帮帮忙拉  设置目录快照后  可以检查数据库是不是连接正确拉  好象要一个用户名 还有什么数据库文件拉…

查看全部问答>