历史上的今天
返回首页

历史上的今天

今天是:2025年04月26日(星期六)

2019年04月26日 | S3C2440开发板裸机程序系列08—中断控制

2019-04-26 来源:eefocus

1.  概述

最近刚刚在TQ2440上面调通了ADXL345的I2C控制,可通过串口和TFT屏查看XYZ三个轴倾角变化,本来打算把TQ2440上面的I2C控制详细解说一下,但是还跳了2个知识点:中断和I2C协议。所以还要等我补充完这2个知识点再说。(I2C协议要从51单片机说起,后面总结时再谈吧)


从程序的执行过程来说,可以分为:正常执行,跳转执行(Arm汇编是B和BL指令,B指令不返回),中断处理。


从嵌入式控制的要求来说,一个嵌入式装置要完成大量的数据采集、数据变换、外设控制等功能,这些子功能的实现一般分为:查询方式和中断方式。显然中断方式可以提高处理器利用率,提高系统实时性。


S3C2440的中断包括快速中断FIQ和外部中断IRQ。因为FIQ模式有更多的私有寄存器,减少了模式切换过程中寄存器入栈和出栈的时间,所以FIQ执行效率更高。


通过INTMODE寄存器的设置,可以将某个中断定义为FIQ或者IRQ。如下图所示:



 INTMODE初始值默认是IRQ。这里只讲IRQ,并且不讨论中断优先级设置问题。


下面从中断源与中断屏蔽、中断函数和执行过程、中断编程例子等几个方面进行展开。 


2.  中断源与中断屏蔽

S3C2440处理器的中断处理流程见datasheet,如下。



入口,即中断源,有2种,with sub-register和without sub-register。


出口,也有2种,IRQ或FIQ,这个前面已经说过了。


对于with sub-register的中断源,需要先经过SUBMASK过滤。后面都要经过SRCPND,然后是MASK过滤,再然后是优先级Priority过滤到达INTPND,再送CPU处理。


S3C2440处理器的中断控制器支持60个中断源,如下:



中断的开关由几个寄存器来控制,并且初始状态(即默认)都是关闭的。先来了解一下都有哪些控制中断开关的寄存器设置。


经总结,共有4个地方设置中断的开与关:


a.当前程序状态寄存器CPSR和备份程序状态寄存器SPSR。在第6位和第7位,即F位控制FIQ中断是否允许响应,I位控制IRQ是否允许响应。这个寄存器设置主要是在启动程序中进行才有可能设置。用户编程可不考虑。


b.INTSUBMSK寄存器,它对应着上图的次级源这15个源,对应着设置INTSUBMSK[0:14],后面[15:31]没有用到。设置1是屏蔽,0是中断可用,初始都是1,即屏蔽状态。


c. INTMSK寄存器,它对应上图的这32个源,INTMSK[0:31]每个位对应一个。同理,设置1是屏蔽,0是中断可用,初始都是1,即屏蔽状态。


d.从上图的源和次级源的图中看出,EINT4_7和EINT8_23没有在次级源中,这么多外部中断源在次级源中也放不下了,所以又单独弄了个EINTMASK寄存器。在Datasheet中,这个寄存器没有在中断控制器Interrupt Controller中讲,而是放在了输入输出端口IO Ports中,如下图:



前4位保留,这样EINTn就和NINTMASK的位号对应上了。挺巧妙的。 


下面再说中断触发的标志,怎么体现出某个中断发生了呢?再看上面的中断处理流程图,有这2个寄存器:SRCPND和SUBSRCPND,如下图。它们的各位是指示各中断源是否发生中断的指示标志。只要有中断发生,对应的位就置1。



其实,还有1个专门外部EINT的设置,EINTPEND寄存器,该寄存器仍然是在输入输出端口IO Ports章节里讲的。同上面的EINTMASK一样,前4位没用,[4:23]各位对应着EINT4—EINT23.



SRCPND、SUBSRCPND和EINTPEND 有些区别,比如串口0的中断,对于接收和发送中断分别是INT_RXD0和INT_TXD0,这2个中断发生时,SUBSRCPND[0:1]这2位要置1,并且SRCPND[28]这1位也置1。再比如,对应ENIT5发生中断时,EINTPEND[5] 置1,SRCPND[4]也置1。


刚才提到的那3个屏蔽寄存器INTMSK、INTSUBMSK和EINTMASK,与挂起寄存器道理是一样的:2个地方都有的,必须2个地方都解除屏蔽,这个中断才真的可以使用了。 


3.  中断函数和执行过程

再看上面的中断处理流程图,如果某个中断没有屏蔽,发生中断后就会到达INTPND,这个寄存器某一位置1后,CPU就要进行处理了。中断挂起寄存器不再分源、次级源和外部中断,因此只1个寄存器--INTPND。它来告诉CPU有中断到来了。


总结一下这几个寄存器:


中断屏蔽寄存器:INTMSK、INTSUBMSK和EINTMASK。有3个,分别对应源、次级源和外部中断,设置哪一位为0则哪一位就使能中断。


中断源挂起寄存器:SRCPND、SUBSRCPND和EINTPEND。也有3个,分别对应源、次级源和外部中断,哪个源发生中断了,CPU就自动设置相应的位为1。


中断挂起寄存器:INTPND。只有1个。具体确认是哪个中断发生了,还要查询SUBSRCPND和EINTPEND。


此外:INTOFFSET寄存器。存的是0—31这个范围内的数值,对应着源的顺序号。这个主要是为了便于查询并进入相应的中断处理子程序中。


下面说中断处理的问题:


a.中断处理子程序做哪些必要的工作。


b.怎样自动处理中断处理子程序,包括进入和退出。


中断处理子程序必要的工作是:清中断标志位。这是为了下一次发生相同中断时还能处理,不是一锤子买卖。


怎样清中断? 哪一位置1了,就再置一次1。因此,SRCPND和INTPND必然是要清理的,此外SUBSRCPND和EINTPEND根据具体情况判断是否需要清理。


中断处理函数是特殊的子函数,因为它不需要在主函数中明确的调用。因此,使用ads中使用了关键字__irq 来表明这个函数是中断处理程序。__irq 发挥了下面2个主要作用:


a.中断发生时,自动保存所有需要保存的寄存器;


b.中断返回时,自动计数返回地址,自动进行CPSR寄存器状态的恢复。 


各类型的中断处理程序的入口地址是固定的,这个工作是启动程序中完成。入口地址就是一个32位的寄存器,这些32位寄存器里放的是中断处理函数的地址。因此,当编写完中断处理程序后,就需要把该程序的起始地址(或函数句柄)填写到那个32位寄存器中。


程序中这样处理:


pISR_EINT0 = (unsigned int)Eint0_Isr ;

pISR_EINT1 = (unsigned int)Eint1_Isr ;

pISR_EINT2 = (unsigned int)Eint2_Isr ;

pISR_EINT4_7 = (unsigned int)Eint4_7_Isr;

其中,pISR_EINT0,pISR_EINT1 ,pISR_EINT2 ,pISR_EINT4_7 是中断源入口地址,它是根据中断起始地址+偏移量,提前计算好的地址,放在2440addr.h文件供C源程序使用。


Eint0_Isr,Eint1_Isr,Eint2_Isr,Eint4_7_Isr 是编写的中断处理函数。 


4.  中断编程例子

两个例子:按键中断和定时器中断。


4.1按键中断

按键触发LED亮1秒钟。按键触发即外部中断触发,有高电平触发、低电平触发、边沿触发等,有EXINTn寄存器进行设置,这里采用默认值,即低电平触发。



如图所示,正好按下时为低电平,触发外部中断。


K1 -- EINT1 -- GPF1  

K2 -- EINT4 -- GPF4  

K3 -- EINT2 -- GPF2  

K4 -- EINT0 -- GPF0  

所以初始化时需要设置GPF0,GPF1,GPF2,GPF4为外部中断模式。


主程序做一些设置,然后就while(1);循环。


这些设置包括:Led和Key的GPIO状态设置,4个key中断位的使能中断设置,设置中断入口地址。 


4.2   定时器中断

定时器Timer0初始化为1秒钟一次。


主程序中定义一个全局变量flag(需要加volatile关键字),Timer0中断处理程序中引用这个flag外部变量,每隔1sec进入中断处理程序后,就将flag取反。主程序根据flag值,设置Led2的亮灭。


主程序如下: 


#include "ledflow.h"

#include "isrservice.h"

#include "timer.h"

 

void IO_Init(void) ;

volatile unsigned int flag = 0 ;

int Main()

{

IO_Init() ;

while(1)

{

if(flag ) 

{

Led2_On() ;

}

else

{

Led2_Off() ;

}

return 0;

}

 

void IO_Init(void)

{

Led_Init() ;

Timer0_Init() ;

Timer0_Interrupt_Init() ;

Isr_Init() ;

}



推荐阅读

史海拾趣

Hpc Technology Inc公司的发展小趣事

HPC Technology Inc公司发展的五个故事

故事一:初创与技术创新

HPC Technology Inc公司成立于2003年,总部位于中国台湾台北县三重市。创立之初,公司便专注于连接器与电缆组件的研发与生产,致力于为客户提供全面解决方案和优质服务。在电子行业快速发展的背景下,HPC Technology Inc公司敏锐捕捉到高性能计算(HPC)市场的潜力,开始逐步涉足该领域。通过不断的技术创新,公司推出了一系列高性能、高可靠性的连接器产品,逐渐在HPC市场中崭露头角。

故事二:市场拓展与品牌建设

随着技术的不断成熟和市场的认可,HPC Technology Inc公司开始积极拓展海外市场。公司参加了多个国际性的电子展会,与全球客户建立了广泛的联系。同时,公司注重品牌建设,通过优质的产品和服务赢得了客户的信赖和好评。在国际市场上,HPC Technology Inc公司的品牌知名度逐渐提升,产品销量也稳步增长。

故事三:技术合作与产业升级

为了进一步提升技术实力和市场竞争力,HPC Technology Inc公司积极寻求与国内外知名企业的技术合作。公司与多家国际知名的电子企业建立了长期合作关系,共同开展技术研发和产品创新。通过技术合作,公司不仅获得了先进的技术支持,还实现了产业升级和产品结构优化。这些合作成果为公司在HPC领域的持续发展奠定了坚实基础。

故事四:绿色环保与可持续发展

随着全球对环保问题的日益关注,HPC Technology Inc公司积极响应号召,致力于绿色环保和可持续发展。公司投入大量资金研发环保型连接器产品,采用环保材料和绿色生产工艺,减少对环境的影响。同时,公司还建立了完善的废弃物回收和处理机制,确保生产过程中的废弃物得到妥善处理。这些举措不仅提升了公司的社会责任感,也为公司的可持续发展注入了新的动力。

故事五:智能制造与数字化转型

面对制造业的数字化转型浪潮,HPC Technology Inc公司紧跟时代步伐,积极推进智能制造和数字化转型。公司引入了先进的智能制造设备和系统,实现了生产过程的自动化、智能化和数字化。通过数字化转型,公司不仅提高了生产效率和质量稳定性,还降低了生产成本和能耗。同时,公司还利用大数据和人工智能技术优化供应链管理、客户服务和产品研发等环节,进一步提升了企业的竞争力和市场响应速度。

富满电子(FM)公司的发展小趣事

在电子行业中,富满电子(FM)公司的发展历程充满了创新与挑战,以下是五个与其发展紧密相关的事实性故事:

1. 市场需求驱动下的产能扩张

2016年至2017年间,随着智能手机等智能终端设备的出货量达到历史峰值,市场对芯片的需求急剧增加。富满电子抓住这一市场机遇,积极扩产以满足需求。这一时期的产能扩张不仅提升了公司的市场份额,也为其后续的技术研发和产品线拓展奠定了坚实基础。然而,随着市场需求的回落和行业内竞争加剧,富满电子也面临着产能过剩和价格下滑的挑战,这迫使公司更加注重技术创新和市场细分,以提升竞争力。

2. LED芯片设计领域的突破

富满电子早期主要从事电源管理芯片的设计与生产,但受限于完全竞争的市场环境和欧美企业的技术垄断,公司在该领域的发展空间有限。为了寻找新的增长点,富满电子将目光投向了LED芯片设计领域。通过不断的技术研发和产品创新,富满电子成功推出了多款应用于显示屏和通用照明等中低端市场的LED芯片产品。尽管面临激烈的市场竞争,但富满电子凭借其高性价比的产品逐渐在市场中占据了一席之地。

3. 电源管理芯片的多元化布局

在电源管理芯片领域,富满电子不仅继续深耕传统市场,还前瞻性地布局了快充等新兴市场。公司推出的USBPD系列芯片在快充市场展现了良好的先发优势,并逐渐获得市场的认可。此外,富满电子还通过“协议芯片+MOS+ACDC”模块化解决方案的推出,进一步提升了其在电源管理芯片市场的竞争力。这一多元化布局不仅为公司带来了新的增长点,也增强了其在行业内的整体实力。

4. 射频业务的拓展与前瞻布局

为了应对5G时代的到来,富满电子在2020年设立了射频公司,并开始布局5G射频开关、射频滤波器等产品的研发与生产。这一举措不仅展现了公司在技术前瞻性和市场敏感度方面的优势,也为其在未来无线通信领域的竞争中赢得了先机。通过不断的技术积累和市场拓展,富满电子有望在5G射频领域实现新的突破和发展。

5. 应对市场质疑与财务稳健发展

近年来,富满电子也面临过一些市场质疑和负面消息的影响,如被举报做假账等。然而,公司始终坚持以事实为依据,通过法律手段积极回应并澄清相关指控。同时,富满电子在财务管理上也保持了稳健的态度,严格按照相关法律法规进行会计核算和财务信息披露。这些措施不仅维护了公司的声誉和形象,也为其在复杂多变的市场环境中保持稳健发展提供了有力保障。

乐鑫(espressif)公司的发展小趣事

乐鑫科技自创立之初,就致力于物联网(IoT)领域的芯片设计和技术创新。公司凭借其独特的芯片设计能力和连接技术,成功开发了一系列具有竞争力的产品,为全球开发者提供了高效、可靠的物联网解决方案。乐鑫科技始终坚持以技术创新为核心,通过自主研发和持续投入,不断提升产品的性能和竞争力。

Brilliance公司的发展小趣事

在快速发展的同时,Brilliance公司始终关注社会责任和可持续发展。公司积极参与公益事业,为社会做出贡献。同时,公司还注重环保和节能减排,努力降低生产过程中的环境影响。这种积极履行社会责任的态度也赢得了社会各界的广泛认可。

通过以上五个故事,我们可以看到Brilliance公司在电子行业发展中的艰辛与辉煌。凭借技术创新、市场拓展、产业链整合以及社会责任等方面的努力,Brilliance成功地在电子行业中树立了自己的品牌形象,并为未来的发展奠定了坚实的基础。

Aborn Electronics Inc公司的发展小趣事

在激烈的市场竞争中,成本控制是企业生存和发展的重要因素之一。Aborn Electronics深知这一点,因此在供应链管理上下了大力气。公司与多家优质供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和质量可靠。同时,通过对生产流程的不断优化和改进,降低了生产成本,提高了生产效率。这些措施使得Aborn Electronics的产品在市场上更具竞争力。

Aplus Integrated Circuits公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场调整。面对这些挑战,Aplus Integrated Circuits公司积极调整战略,加大研发投入,推动产品创新。公司成功开发出多款适应市场需求的新型集成电路产品,不仅满足了客户的多样化需求,还为公司带来了可观的收益。

问答坊 | AI 解惑

模拟电路教程

模拟电路教程,…

查看全部问答>

求教关于蓝牙驱动SLEEP后的问题!

我在控制面板扫描蓝牙设备能扫描到,可以当WINCESLEEP起来后,再在控制面板扫描时,就扫描不到了,并弹出对话框“BLUETOOTH HARDWARE ERROR 10050。。。。。。”有哪位兄弟遇到过这样的情况呀,是哪一块把连接断开了吗?请多多赐教呀!…

查看全部问答>

谁有amx中控的编程软件和说明书?

谁有amx中控的编程软件和说明书?我去AMX公司,他们老板说网上下载,可是AMX的网站的下载在维护,不知那位哥们姐们有这块的编程软件和说明书,给个下载地址,谢谢…

查看全部问答>

求助:如何控制电压的大小

请问下如何通过CPU,来控制电压的大小? 意思就是说CPU给出如0101...的命令,应该怎么设计电路,或是有什么器件,可以使到这些命令可以控制电路中某个点电压的大小。…

查看全部问答>

求助,LM3S8962 GPIO模拟SPI驱动VS1003

我想用LM3S8962驱动VS1003,但是8962的SPI被SD卡和OLED占用了,我打算用GPIO模拟SPI驱动VS1003,我是按照TI 最新的StellarisWare里的SoftSSI配置的GPIO,从icdev下了VS1003的驱动,配置好有没有听到正弦波,检测CLK好像也不对,请高手给指点一下吧 ...…

查看全部问答>

iar 自带内部函数

在iar编译工具中,内置了一些内部函数,也就是Intrinsic.h头文件,里面的许多函数有些可以加快编写速度,有些可以指定变量的存放位置,还有些可以实现复杂的功能,但是我也只是了解其中的一些,请问各位谁有内部函数的讲解可以拿出来分享一下,感激 ...…

查看全部问答>

我想用STM32和tft做一个简易的示波器,谁能指导下啊

毕业后,找了个测试工作,觉得没前途,于是想抓紧时间学点别的。本人水平有限,听人说这样很好实现,指标要求不高,主要是锻炼一下。找了好多资料,买了个最小系统,和tft屏幕。其他的打算自己制作。但是不知从何处下手。谁给点建议…

查看全部问答>

为什么运算放大器要使用负反馈而使用正反馈就不行呢

我仿真了一下图中的电路 波形显示负反馈的正常放大,而正反馈的就一直为高电平为什么啊!按计算的话不是一样么,还是正反馈的算法不一样?求教…

查看全部问答>

如何求一个信号能能量?在线等,急~

请问,现有一个信号的DTFT,如图所示 如何求这个信号的,能量,是能量,不是功率,似乎是用,这个帕斯瓦尔公式,可是不确定,积分只积正负pi以内的部分还是整个域内?还有是否应该除以这个2pi,看到某些地方又没有除2pi,好纠结,非常急,在线等啊 ...…

查看全部问答>

AVR STUDIO 6.0问题

用AVR STUDIO 6.0写程序,出现while(!flag);这样的独立语句时,好像就进不了中断的,定时器计数都是错误的,不知道为什么,哪个大神给解释一下…

查看全部问答>