2448|5

19

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

TI - MCU - MSP430使用指南5 -> ICC中断控制器 [复制链接]

此内容由EEWORLD论坛网友骑IC看MCU原创,如需转载或用于商业用途需征得作者同意并注明出处

 

ICC,即Interrupt Compare Controller,中断比较控制器,作用便是设定中断优先级,同时通过比较中断优先级等实现中断的硬件嵌套。

首先普及一下MSP430的中断系统,大部分的MSP430  MCU中断优先级是不能设置的,也就是说对于每一个中断源的优先级是体现设定好的,不支持后期用户自动设置,因此可以说如果正在执行低优先级的程序,突然来了一个高的优先级中断,是可以打断低优先级的服务程序的,但是前提是进入低优先级中断服务程序时开启了全局中断即GIE。但是如果高优先级中断正在执行服务程序,来了一个低优先级的中断,那么只能等待高优先级中断服务程序执行完之后,才可以去执行低优先级的中断服务程序,这样也就是说不能灵活实现中断的嵌套。

ICC模块就是为了解决这个问题而出现的,即可以通过寄存器配置,来实现低优先级的中断打断高优先级的中断,这就需要比较电路了,ICC内部就是这个原理,内部结构如下图所示:

目前到2019年低为止,MSP430 MCU16bit)只有四款含有ICC模块:MSP430FR3153MSP430FR2155 MSP430FR2353 MSP430FR2355

下面再简单的描述一下中断嵌套的含义,如下图所示,ISR2优先级高于ISR1,那么在正在只从ISR1程序时,遇到ISR2时,则会先把ISR1暂停一下,去执行ISR2,当ISR2执行完之后,返回再接着执行ISR1

MCU时如何实现去执行另一个程序,执行完之后再返回原本的点执行程序的呢?如下图所示,这个就类似与中断向量即堆栈,分为PushPop,首先当正在执行ISR1时,遇到了ISR2中断,那么MCU会把ISR1当前执行的程序地址推入堆栈保存起来,然后把ISR2的中断向量填入PC指针,去执行ISR2的程序,当ISR2程序执行完后,再从堆栈中读出当时保存的ISR1执行的程序地址,然后接着执行。

入栈如下图所示:

 

出栈如下图所示:

下面介绍一下ICC相关的寄存器,比较简单,因为你会发现,核心的两个寄存器,只有一位是读写的,其他都是只读寄存器,先附上所有寄存器的信息:

从上图可以看到,寄存器可以归为三个:ICCSCICCMVSICCILSRx

  • ICCSCICC控制寄存器

你会发现,这个寄存器里,只有一位ICCEN(使能ICC功能寄存器)是支持读写操作的,其他的均为只读位,VSEFLG是堆栈标志位,可以通过观察此位的值来查看是否产生了ICC中断嵌套,因为出现嵌套的话,肯定会存在PushPop操作。

VSFLG位(这个User guide中标错了,应该是VSFLG而不是VSEFLG),这个是标注着ICCMVS寄存器中的MVSSP是否满了,也就是堆栈是否存满了。

ICMC则是当前比较的中断的设置优先级。(注意:这里的设置优先级不是默认的那个什么59 60之类的数,是通过ICCILSRx寄存器设定的,可以设定四个优先级,因为只有两位,具体见ICCILSRx寄存器配置)。

  • ICCMVS  可屏蔽中断堆栈寄存器

这个寄存器里面所有的位均为制度寄存器,其实就是存储着:当前堆栈了几个中断,然后ICM0-ICM3是比较位,也就是当前参与中断比较的这四位分别是谁而已。不需要用户设置,在调试中可能会使用。

  • ICCILSRx  中断优先级寄存器

ICCILSRx中断优先级寄存器有8个,每个寄存器里可以配置8个中断源,因此总共可以配置64个中断源,每个中断源对应那个资源的中断请查看每个芯片的datasheet,如下图所示是MSP430FR2355的中断源对应表:

OK,在功能和寄存器都描述完之后,我们来看一下使用过程中需要注意哪些点,或者说我们应该怎么正确的使用ICC资源。

下图是在Main函数中使用ICC的流程:

 

需要注意的是ICC使能和GIE使能的顺序即失能的顺序,即可以理解为,在使能或者失能ICC中断时,均要处于全局中断失能的状态下(即GIE=0),如下图所示,图中Disable  ICC处有点错误,我已经标明:

 

另外为了保证ICC功能的稳定正常运行,强烈建议用户在进入中断服务程序后使能GIE中断,因为在执行一个中断服务程序时,需要打开整体的中断使能,这样才能允许其他中断产生,从而才不会阻挡中断嵌套的功能,流程如下图所示:

 

最后附上使能ICC和失能ICC的程序:

  • ICC使能

Enable ICC Code Example:

//----------------------------------------------------------------------------------------
// Initializing and Enabling ICC
//----------------------------------------------------------------------------------------
void ICC_init (void)
{
// disable global interrupt
__bic_SR_register(GIE);
// setting customized interrupt priorities.
ICCILSR0 = 0xFFFF;
ICCILSR1 = 0xFFFF;
ICCILSR2 = 0xFFFF;
ICCILSR3 = 0xFFFC;
// enable ICC module
ICCSC |= ICCEN;
// enable global interrupt
__bis_SR_register(GIE);
}

 

  • ICC失能
//----------------------------------------------------------------------------------------
// Disabling ICC
//----------------------------------------------------------------------------------------
void ICC_disable (void)
{
// disable global interrupt
__bic_SR_register(GIE);
// enable ICC module
ICCSC &= ~ICCEN;
// enable global interrupt
__bis_SR_register(GIE);
}

 

最新回复

为什么没有第3和第四呢?   详情 回复 发表于 2020-1-2 06:34
 
点赞 关注

回复
举报

2618

帖子

0

TA的资源

纯净的硅(高级)

沙发
 

谢谢,分享

 

 
 

回复

6040

帖子

205

TA的资源

版主

板凳
 

这个是比较新的知识点,以前没有见到过,感谢分享!

 
 
 

回复

7452

帖子

2

TA的资源

五彩晶圆(高级)

4
 

看起来是原创的,很详细,拜读一下。

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

38

帖子

0

TA的资源

一粒金砂(中级)

5
 

为什么没有第3和第四呢?

点评

正在写 序号我已经编好了 我在实际写的过程中没有按照1 2 3 4 来写 总共有34篇左右 后面我会尽快更新 欢迎一起来讨论 提提建议  详情 回复 发表于 2020-1-2 11:57
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

6
 
middfat 发表于 2020-1-2 06:34 为什么没有第3和第四呢?

正在写 序号我已经编好了 我在实际写的过程中没有按照1 2 3 4 来写 总共有34篇左右 后面我会尽快更新 欢迎一起来讨论 提提建议

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表