历史上的今天
返回首页

历史上的今天

今天是:2024年09月21日(星期六)

2020年09月21日 | MSP430单片机中断的定义及原理

2020-09-21 来源:elecfans

430的中断是按照下图1的优先级顺序定义的,有三种中断:1.系统重置、2.不可屏蔽中断(NMI)、3.可屏蔽中断。

MSP430单片机中断的定义及原理

图1.中断优先级

部分具体的中断优先级由高到低为:

PORT2_VECTOR (1 * 2u) /* 0xFFE2 Port 2 */

PORT1_VECTOR (4 * 2u) /* 0xFFE8 Port 1 */

TIMERA1_VECTOR (5 * 2u) /* 0xFFEA TImer A CC1-2, TA */

TIMERA0_VECTOR (6 * 2u) /* 0xFFEC TImer A CC0 */

ADC_VECTOR (7 * 2u) /* 0xFFEE ADC */

USART0TX_VECTOR (8 * 2u) /* 0xFFF0 USART 0 Transmit */

USART0RX_VECTOR (9 * 2u) /* 0xFFF2 USART 0 Receive */

WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog TImer */

COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6 Comparator A */

TIMERB1_VECTOR (12 * 2u) /* 0xFFF8 Timer B CC1-2, TB */

TIMERB0_VECTOR (13 * 2u) /* 0xFFFA Timer B CC0 */

NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maska××e */

RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priority] */

其中可屏蔽中断分为系统NMI(SNMI)和用户NMI(UNMI),一般来说,不可屏蔽中断不受GIE标志位的影响。用户不可屏蔽中断的中断源为NMIIE、ACCIE和OFIE,当响应用户不可屏蔽中断后,其他不可屏蔽中断就自动被禁止,以防止同级别的中断发生产生中断嵌套。当同时有多个中断来的时候才有优先级的考虑(优先级顺序可查看向量表)。有中断响应以后自动关闭总中断,这个时候即使来更高优先级的中断都不会响应。要中断嵌套的话,就必须在中断中打开总中断。


关于中断嵌套,资料上是这么讲的:

1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT;

2)当进入中断程序时,只要不在中断中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行;

3)若在中断A中开了总中断,则可以响应后来的中断B(不管B的优先级比A高还是低),B执行完再继续执行A。注意:进入中断B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动打开;

4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用!中断服务不执行抢先原则。

5)对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;

对于单源中断,只要响应中断,系统硬件自动清中断标志位;

对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位被自动清除;

对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志;如果在这种中断用“EINT();”开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关。


对于多源中断,我在应用时遇到了一些问题,程序总是在运行时跑飞。我曾经用过的程序中有两个中断源,但是已经按照要求在中断服务程序中清楚了标志位,但程序还是跑飞了,现在还未找到原因,还要继续修改,要请教一下学长。


官方给的多源中断的例子是:

#pragma vector = PORT2_VECTOR

__interrupt void port2(void)

{

switch(P2IV)

{

case P2IV_P2IFG6:

P1OUT ^= BIT0;break; //LED1 亮灭

case P2IV_P2IFG7:

P1OUT ^= BIT1;break; //LED2 亮灭

default :break;

}

}


在这个中断中由于访问了P2IV这个寄存器,所以标志位被自动清除。

推荐阅读

史海拾趣

Amprobe公司的发展小趣事

Amprobe是一家专业生产测试仪器的公司,为电子行业提供各种测试和测量解决方案。以下是Amprobe公司发展的五个相关故事:

  1. 创立与初期发展:Amprobe公司创立于1948年,总部位于美国华盛顿州埃弗雷特市。最初,公司专注于生产便携式测试仪器,如电表、电压计和电流计等,为电工、维修人员和工程师提供便捷的测量工具。公司以其可靠的产品质量和简便易用的设计在市场上建立了良好的声誉。

  2. 技术创新与产品扩展:随着技术的发展和市场需求的变化,Amprobe公司不断进行技术创新,并扩展了产品线。除了传统的电表和电压计,公司开始开发数字式测试仪器、热像仪、电池测试仪等高端产品,以满足客户对更高精度和更多功能的需求。

  3. 全球市场拓展:随着全球经济一体化的发展,Amprobe公司积极拓展国际市场。公司在欧洲、亚洲、南美等地设立了销售代表处和分支机构,建立了完善的全球销售网络。通过与当地经销商和合作伙伴合作,公司的产品销售已经覆盖了全球范围,为客户提供及时的技术支持和服务。

  4. 质量控制与认证:Amprobe公司高度重视产品质量控制,严格遵循国际质量管理标准。公司的生产工艺和质量管理体系通过了ISO 9001质量管理体系认证,并获得了欧洲CE认证和美国UL认证等产品认证。通过持续改进和质量监控,公司确保产品符合客户的要求和行业标准。

  5. 持续发展与未来规划:Amprobe公司未来将继续致力于技术创新和产品研发,不断推出符合市场需求的新产品。公司计划加强与客户的合作关系,深入了解客户的需求,提供定制化的解决方案。同时,公司将继续拓展国际市场,加强与全球合作伙伴的合作,实现持续稳健的发展。

AB Connectors Ltd公司的发展小趣事

AB Connectors Ltd成立于上世纪九十年代初,当时电子行业正处于飞速发展的黄金时期。公司创始人张三和李四凭借对连接器技术的深刻理解和对市场需求的敏锐洞察,决定创立这家公司。初创时期,公司面临着资金短缺、技术瓶颈和市场认可度低等挑战。然而,通过不懈的努力,AB Connectors Ltd成功研发出了一款具有竞争力的新型连接器产品,并在国际电子展览会上获得了广泛关注。这为公司打开了市场大门,奠定了发展的基础。

Greenconn Corp公司的发展小趣事
如果以上方法均无法解决问题,可能是断电保护器本身损坏,需要更换与冰箱型号匹配的新保护器。
Hasco Relays and Electronics International Corp公司的发展小趣事

作为L3Harris Technologies的一部分,Harris(原Harris Corporation)在太空和航空领域也取得了重大突破。公司参与了多个太空任务和航空项目,为这些项目提供了先进的航天器和航空电子系统。这些系统不仅支持了复杂的航天任务,还提升了航空器的性能和安全性。L3Harris在太空和航空领域的持续投入和创新,为其在电子行业中的发展注入了新的动力。

Alpha & Omega Semiconductor(万国半导体)公司的发展小趣事

Harris公司最初成立于1890年代,起初以无线电通信技术为核心业务。在早期,公司凭借其创新的无线电通信技术,在通信领域迅速崭露头角。这一时期,Harris不仅为军事领域提供了关键的通信解决方案,还逐步拓展到商业和民用市场,为当时的电话、电报等通信方式带来了革命性的变化。通过不断的技术研发和产品创新,Harris逐渐奠定了其在电子行业的重要地位。

Electro-Optical Systems Inc公司的发展小趣事

作为一家有着高度社会责任感的企业,EOS始终关注环保和可持续发展问题。他们采用环保材料和绿色生产工艺,降低产品对环境的污染。同时,EOS还积极参与社会公益事业,捐资助学、扶贫济困等活动不断。这些举措不仅提升了企业的社会形象,也为公司的可持续发展奠定了坚实基础。

问答坊 | AI 解惑

PADS2007封装库

本帖最后由 paulhyde 于 2014-9-15 09:27 编辑 PADS2007封装库  …

查看全部问答>

代码移植问题 win32移植WINCE上

void CShowSaveBMPView::Dump(CDumpContext& dc) const {         CView::Dump(dc); } 加粗的部分在win32上的afxwin.h中定义了Dump是类CView的成员 // Implementation public:         virtual ~CV ...…

查看全部问答>

EnumPrinterDrivers的奇怪现象

        BOOL ret;         ret = EnumPrinterDrivers(NULL, NULL, 1, NULL, 0, &dwNeeded, &dwReturned);         返回值是1,但是dwNeeded却为0,dwReturned也为0 & ...…

查看全部问答>

用CC1100能否实现多对一传输

如题,用CC1100能不能实现多个节点给一个节点传输数据,若能,求大致方案!望各位大侠指点~~…

查看全部问答>

晚睡早起读解STM32之ISP命令格式及应用前景和其不足之处

                                 今早它又比我起得早,果然HOT!!! …

查看全部问答>

初学STM8几天,编了第一个处女作:时钟

初学STM8几天,编了第一个处女作:时钟 0LED显示屏虽小,自发光,还是很爽…

查看全部问答>

为什么这个程序运行完又会重头开始

不是很明白,下面这个流程,跑到最底,又会自动从新开始跑.为什么呢? void main() {     OSCCON = 01110100 ; // internal 16Mhz osc     TRISD = 0X00 ;     PORTD = 0x0000000 ;     delay(100) ; & ...…

查看全部问答>

tm4c1294ncpdt串口的DMA中断问题

进入串口中断处理程序后,获取中断工作状态后,而程序总是在中断里跑,始终挑不出来,串口的配置已配好.(附程序) uint32_t ulStatus;          ulStatus = UARTIntStatus(UART0_BASE, false);      ...…

查看全部问答>