历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2020年03月06日 | 【ARM裸板】按键外部中断过程及示例

2020-03-06 来源:eefocus

1.初始化

设置中断源(让它能发出中断信号)

设置中断控制器(让它能发出中断信号给CPU)

设置CPU总开关(CPSR有I位,设置总开关,使能中断)

处理时要分辨中断源

处理完要清中断

在这里插入图片描述

1.1 中断源

设置按键为中断源引脚

配置引脚为外部中断模式

配置中断为下降沿触发

配置外部中断MASK使能

//初始化外部中断,设置按键为中断源

void key_eint_init(void)

{

/* 引脚:GPF0、2   GPG3、11 */

/* 中断:EINT0、2  EINT11、19*/

GPFCON &= ~((3<<0) | (3<<4)); //清零

GPFCON |=  ((2<<4) | (2<<0)); //设置[10],配置为外部中断


GPGCON &= ~((3<<6) | (3<<22));

GPGCON |=  ((2<<6) | (2<<22)); //设置[10],配置为外部中断


/* 设置中断触发方式:双边沿触发 */

EXTINT0 |= (3<<0) | (3<<8); //配置EINT0、2

EXTINT1 |= (3<<12); //配置EINT11

EXTINT2 |= (3<<12); //配置EINT19


/* 设置外部MASK清零使能 */

EINTMASK &= ((1<<11) | (1<<19));

}

在这里插入图片描述

1.2 中断控制器

设置INTMASK(INTERRUPT MASK (INTMSK) REGISTER)中断屏蔽寄存器

0 = Interrupt service is available.

1 = Interrupt service is masked.

//初始化中断控制器

void interrupt_init(void)

{

INTMASK &= ~((1<<0) | (1<<2) | (1<<5));//使能中断

}

在这里插入图片描述

1.3 CPU使能中断

设置CPSR的I位

当设置为0时enable,设置为1时disable

mrs r0,cpsr    //读出CPSR

bic r0,r0,#(1<<7) //第7位清零(IRQ)

msr cpsr,r0

在这里插入图片描述
在这里插入图片描述

1.4 start.S设置中断向量表

在0x18处调用中断服务函数

/*====================================异常向量表===========================================*/

_start:

b reset    //vector 0x00: reset(0地址对应reset)

  ldr pc, und_addr //vector 0x04: und  (发生未定义指令异常,则进入“处理未定义异常函数”)绝对跳转,跳转至sdram中

  ldr pc, swi_addr //vector 0x08: swi

  b halt           //vector 0x0c: prefetch aboot

  b halt           //vector 0x10: data aboot

  b halt           //vector 0x14: reserved

  bl irq_addr      //vector 0x18: IRQ

  b halt           //vector 0x1c: FIQ

    

irq_addr:

.word do_irq

在这里插入图片描述

1.5 start.S设置中断处理

执行中断处理之前,硬件会处理的事情:

 1.lr_irq保存有被中断模式中的下一条即将执行的指令的地址

 2.SPSR_irq保存被中断模式CPSR

 3.CPSR的[M4:M0]=[10010],进入到irq模式

 4.跳到0x08的模式执行程序,即跳到bl do_irq这一指令


1.5.1 设置栈

sp_irq 设置栈,因为后面函数需要栈

    ldr sp, =0x33D00000


1.5.2 保存现场

在irq处理函数总有可能需要用到r0~r12,因此先保存下来

由下图可知,lr-4是异常处理完后的返回地址,也需要保存

    sub lr,lr,#4

    stmdb sp!, {r0-r12,lr} 

在这里插入图片描述

1.5.3 处理中断

跳转到中断处理函数中

    bl handle_irq_c


1.5.4 恢复现场

将lr的值赋给pc ,^会把spsr的值恢复到cpsr中

    ldmia sp,{r0-r12,pc}^ 


2.中断服务函数

void handle_irq_c(void)

{

/* 1.分辨中断源 */

int bit = INTOFFSET;


/* 2.调用对应的处理函数 */

key_eint_irq(bit); //处理中断,清除外部中断标志


/* 3.清中断 :从源头开始清 */

SRCPND = (1< INTPND = (1<}


2.1 分辨中断源

中断偏移寄存器 (INTERRUPT OFFSET (INTOFFSET) REGISTER)

可通过判断INTOFFEST的中的可知当前中断源

在这里插入图片描述

2.2 调用处理函数

该为触发外部中断,因此需要清除外部中断

EINTPEND (External Interrupt Pending Register)

清除该中断,只需要对应写1即可,又因为其发生什么中断,对应为会变成1,因此产生什么中断,只需要把该中断的EINTPEND的值写入EINTPEND

/* 2.调用对应的处理函数 ,清除对应的中断*/

key_eint_irq(bit); 

在这里插入图片描述

2.3 清中断

从源头开始清:即先清除SRCPND,再清除INTPND


它只清除SRCPND与INTPND寄存器对应于数据中设置为1的位的位置,因此清除哪一个中断,只需要对应为写1即可

在这里插入图片描述

SRCPND(SOURCE PENDING (SRCPND) REGISTER)

在这里插入图片描述

INTPND(INTERRUPT PENDING (INTPND) REGISTER)

在这里插入图片描述

推荐阅读

史海拾趣

AINFO Inc公司的发展小趣事

为了进一步提升技术水平和市场竞争力,AINFO Inc公司积极寻求与国际知名企业的技术合作。通过与国外企业的合作,公司引进了先进的技术和管理经验,提升了自身的研发能力和管理水平。同时,公司也加快了国际化发展的步伐,拓展了海外市场,提升了品牌知名度。

DELTA公司的发展小趣事

随着人们生活水平的提高和环保意识的增强,Delta公司提出了“智能绿生活”战略,致力于为个人、家庭和企业带来更环保健康的生活型态。在这一战略指导下,Delta推出了一系列视讯显像系统、网络通信系统、LED照明、智能语音系统及云计算等产品。这些产品不仅具有高效、节能的特点,还为用户提供了更加便捷、智能的生活体验。

DDK公司的发展小趣事

DDK公司在发展过程中,不仅注重技术创新和品质提升,还非常注重市场布局的智慧。公司根据市场需求和竞争态势,灵活调整产品结构和市场策略,不断开拓新的市场领域。同时,DDK公司还积极与国内外知名企业合作,共同开发新产品、新技术,共同拓展市场份额。这种市场布局的智慧,让DDK公司在电子行业中始终保持领先地位。

CML Microcircuits公司的发展小趣事

在竞争激烈的电子行业中,CML Microcircuits公司始终坚持质量与服务并重的经营理念。公司注重产品的可靠性和稳定性,通过严格的质量控制和测试流程确保产品的高品质。同时,CML还为客户提供全面的技术支持和售后服务,帮助客户解决在使用过程中遇到的问题。这种以客户为中心的服务理念赢得了客户的信任和忠诚,也为CML赢得了良好的口碑。

安信可(Ai)公司的发展小趣事

随着物联网技术的快速发展,安信可也迎来了技术升级的关键时刻。2014年9月,安信可成功引入ESP8266 SoC方案,这一技术升级为公司带来了更多的市场机会。到了2016年5月,安信可更是成功转型为一站式物联网模组解决方案提供商,为客户提供从模组到应用的全方位服务。

Amecon Magnetics公司的发展小趣事

Amecon Magnetics公司成立于XXXX年,初始阶段主要专注于磁性材料的研发与生产。在创立初期,公司面临着资金短缺、技术挑战以及市场竞争激烈等多重困难。然而,创始人凭借对磁性材料领域的深刻理解和坚定信念,带领团队不断突破技术难题,逐步开发出具有竞争力的产品。

问答坊 | AI 解惑

美国战斗机械狗研制成功

核心提示:近日美国官方公布了一段关于军用机械狗的录像,视频中机械狗展示了它惊人的活动能力和适应性,一举在互联网上造成轰动。研发公司称经过测试,该机械狗能在战场上为士兵运送弹药、食物和其他物品。 这个形似机械狗的四足机器人被命名为“ ...…

查看全部问答>

总结一下启动文件编写

文档中我对两个启动文件进行了对比,发现了编写启动文件的方法。愿对大家有所帮助!…

查看全部问答>

关于“CTRL+Z”输入问题

串口发送数据时怎样输入“CTRL+Z”,谢谢!,有点急!!!…

查看全部问答>

sd卡的寿命问题

网上搜索得知SD卡的寿命为擦写10万次以上,它的具体含义是什么 1、是不是我如果只对其中一片区域(非0扇区)进行擦写10万次,那么这片区域就有可能损坏,而其他区域还可以正常使用呢? 2、一般的文件系统对写操作如FWRITE(FILE *fp,W)是怎么处 ...…

查看全部问答>

windows CE中20ms内被动接收数据

我现在做的是一个windows CE下传感器的项目,其中有一个过程,是给传感器发一个读指令(16进制),然后传感器会自动返回一组数据(16进制);传感器的数据刷新是50次每秒,所以在20ms内必须主动接受数据并进行处理。这里的主动是细节上的,文章题目 ...…

查看全部问答>

求论坛

eeworld里面的高手是挺多的,但是我现在在学习ARM单片机,请问有没有什么向eeworld这样好的论坛没有?? 因为现在我是自学,想找几个同道之人共同学习…

查看全部问答>

《evc高级编程及其应用开发》例程中这样用OnOk(),OnClose(), 为何?

void CDlgSeriesSetup::OnBtnopen() {         CComboBox *pCmbName = NULL;         CComboBox *pCmbBaud = NULL;         CComboBox *pCmbParity = NULL;     &nbs ...…

查看全部问答>

门吊下降速度突然加快是什么原因?

门吊起升高度40米,当下降到15米时下降速度突然加快 ,请问是什么原因?是采用电阻调速的。…

查看全部问答>

SPI通信 速率最高是多少?

来自:电子工程师技术交流(12425841)…

查看全部问答>

求购闲置飞思卡尔智能车s128最小系统、B型车模、摄像头

有哪位前辈有意出售的吗?现在我们急需这些,为明年的比赛做准备,谢谢各位了,有闲置的也有意出售的请联系qq362313998,谢谢…

查看全部问答>