历史上的今天
返回首页

历史上的今天

今天是:2025年01月21日(星期二)

正在发生

2021年01月21日 | MSP430G2553中断要点总结

2021-01-21 来源:eefocus

1、中断

中断控制器:中断发生时有一个硬件装置将信号输入单片机,该硬件部件叫中断控制器,它负责把引起中断的信号编号,并按照事先约定的优先级排队,并发信号给单片机的cpu。


中断的编号叫中断号,对应处理程序叫中断服务程序,服务程序的地址叫中断向量。中断向量按照中断编号排列成表,叫中断向量表。


cpu检测到中断控制器的信号后,获得当前中断发生信号的编号,由中断向量表找到中断向量,转而去执行这个编号对应的中断处理程序。


中断向量表见文章末。


2、复位

冷复位:上电复位; 热复位:外部引脚或看门狗复位


3、通用I/O及其中断:

端口P1 和P2 有中断功能。每个针对P1 和P2 I/O 线路的中断可被单独启用并被配置成在一个输入信号的上升或者下降边沿上提供一个中断。所有P1 I/O 线路提供一个单一中断矢量,并且所有P2 I/O 线路提供一个不同的,单中断矢量。

I/O寄存器

PxDIR 方向:0输入 1输出


PxOUT


PxIN


PxREN

0:上拉/下拉电阻器被禁用 1:上拉/下拉电阻器被启用


每个PxREN 寄存器中的每个位启用或者禁用相应I/O 引脚的上拉/下拉电阻器。 PxOUT寄存器中的相应位选择上拉或下拉引脚。


PxSEL&PxSEL2 功能选择,默认是I/O功能,可以根据手册配置选择其他功能


I/O中断寄存器

端口P1 和P2 中的每个引脚都有中断功能,此功能由PxIFG, PxIE,和PxIES 寄存器配置。所有P1 引脚提供一个单一中断矢量,而所有P2 引脚提供一个不同的单一中断矢量。在中断程序中,可测试PxIFG 寄存器来确定一个P1或P2 中断的源。

P1IFG&P2IFG :中断标志位,需软件置位,也可软件置位产生软件控制的中断。


(注: 当改变PxOUT 或PxDIR 时的PxIFG 标志写入P1OUT, P1DIR, P2OUT,或P2DIR

可导致设置相应的P1IFG 或者P2IFG 标志。)

P1IES&P2IES :中断边沿选择 0上升沿;1下降沿。


(注: 写入PxIESx到P1IES,或者P2IES 的写入可导致相应中断标志的设置。)

P1IE&P2IE : 中断使能

所以根据分析可知,在设置完引脚功能寄存器后务必将中断标志位清零,然后再开中断。


默认状态

P1DIR为0(输入);P1OUT为1(高电平);P1RNE为0(禁用)。


例程

按键上拉设置;

P1OUT |= BIT0; //选择上下拉,1上拉;0下拉


P1OUT与P1REN配合使用

P1_3中断程序

#include  

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; 

P1DIR = BIT0; 

P1OUT = BIT3;

P1REN |= BIT3; 

P1IE |= BIT3; //(1)中断使能

P1IES |= BIT3; //(2)下降沿触发

P1IFG &= ~BIT3; //(3)清零标志位

__enable_interrupt (); //(4)开总中断

while(1);

}

#pragma vector=PORT1_VECTOR //固定格式

__interrupt void Port_1(void)

{

P1OUT ^= 0x01; 

P1IFG &= ~0x08; //每次软件复位

}


中断向量表

表中第一列是中断事件来源的名称;第二列是对应的中断标志位;第三列表示中断的性质,其中 non-maskable 是无法关掉的中断,即不受 GIE 控制的中断, maskable 是可以被 GIE 关掉的中断;第四列是中断向量在存储器中的位置;最后一列就是***中断优先级***。


中断向量表中大多数中断属于“grouped interrupt”,即多个中断源共用一个中断向量入口。例如 P1.0-P1.7 中断都使用 P1 中断这一个入口。要识别中断具体来自哪一个 I/O 口,需要查看P1IFG 寄存器, P1IFG 共 8 位,分别对应 P1.0-P1.7,当某个引脚出现中断事件时对应的P1IFG.x 就会被置位,在退出中断之前一定不要忘记手动将 P1IFG.x 复位。另外 P1IE 是 P1 口的中断使能寄存器,也有 8 位,可以分别控制每个 I/O 口的中断使能


如何写一个中断函数总结

要写一个带有中断的程序,需要做下面几件事情:


配置外设中和中断有关的寄存器,例如 I/O 口中断是上升沿触发还是下降沿触发, 定时器中断的计数方式和定时值等等。


依照中断服务函数的模板写中断服务函数,添加中断后要干什么的代码。


使能外设的中断,使能全局中断(GIE)

一旦中断发生, CPU 停下主函数中的任务,并标记位置,进入中断服务函数,执行完中断服务函数之后回到主函数标记位置处继续运行。


中断服务函数


#pragma vector=PORT1_VECTOR

__interrupt void Port_1(void)

{

P1OUT ^= 0x01; // P1.0 = toggle

P1IFG &= ~0x08; // Clear P1.3 IFG

}


#pragma vector=PORT1_VECTOR

#Pragma 是编译器指令,是告诉编译器将函数与中断向量连接起来。 “vector=”后面是中断向量地址的宏定义,例如 P1 口中断就是 PORT1_VECTOR,定时器中断就是TIMER0_A1_VECTOR。


不同外设的中断向量名在哪里找呢?打开 CCS 的安装文件夹,例如C:ticcsv7ccs_basemsp430include,在这个文件夹中搜索芯片的具体型号,如msp430g2553,可以找到一个名为 msp430g2553.h 的头文件。这个头文件中包含了所有寄存器位的宏定义,包括中断向量的宏定义。 在 msp430g2553.h 中找到“Interrupt Vectors”这个部分(如下图),其中包含了所有中断向量的名称。 例如 P1 端口的中断向量名就是PORT1_VECTOR。

__interrupt void Port_1(void)

__interrupt 关键字表明这是一个中断服务函数,CPU 见到这个关键字以后就会去做中断之前的准备工作。 Port_1 是用户自己取的函数名称,这个名称可以任意命名。

中断服务函数的具体内容

中断服务函数的内容依据中断的不同种类有所差别。退出中断前一定不要忘记将中断标志位复位。


推荐阅读

史海拾趣

CETC公司的发展小趣事

CETC自成立以来,一直致力于电子科技领域的研发创新。在某次关键技术的攻关中,CETC的科研团队经过数月的艰苦努力,成功突破了某型雷达的核心技术,使我国在该领域达到了国际先进水平。这一成果的取得不仅提升了CETC的技术实力,也为公司在国内外市场赢得了良好的声誉,为公司的后续发展奠定了坚实基础。

Alpha Semiconductor公司的发展小趣事

Alpha Semiconductor公司于1983年创立,成立之初,公司主要从事代工服务业务。这一策略为Alpha Semiconductor在半导体行业打下了坚实的基础。通过为其他公司提供高质量的代工服务,Alpha Semiconductor逐渐积累了技术实力和行业经验,为后续的自主研发和产品创新奠定了坚实的基础。

Aavid Niagra公司的发展小趣事

在快速发展的同时,Aavid Niagra公司始终关注企业社会责任和可持续发展。公司积极参与环保事业,推广绿色生产和消费理念。同时,公司还注重员工培训和福利保障,为员工创造一个良好的工作环境和发展空间。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。


这些故事框架主要围绕公司的初创、技术创新、全球化战略、行业变革应对以及企业社会责任等关键节点进行构建。您可以根据Aavid Niagra公司的实际情况和公开资料,对每个故事进行具体化和个性化的描述,以确保故事的准确性和可信度。

上海双岭电子(Double-peak)公司的发展小趣事

随着科技的不断发展,电子行业面临着日新月异的技术变革。为了保持竞争优势,双岭电子始终坚持创新驱动的发展理念。公司投入大量资金用于研发新技术、新产品,并鼓励员工提出创新性的想法和建议。通过不断的创新实践,双岭电子成功推出了MOS型场效应晶体管和CMOS集成电路等高端产品,进一步巩固了公司在行业中的领先地位。

Daykin Electric Corp公司的发展小趣事

1969年,大金成功开发了一台室外机连接多台室内机的家用多联系统空调。这一创新产品不仅提高了空调的能效比,还满足了大型住宅和办公场所的多样化需求。多联系统空调的诞生,使得大金在家用中央空调领域取得了领先地位。

驰芯微(CHIPWISE)公司的发展小趣事

驰芯微公司自2014年成立以来,就立志于打破国外芯片厂商在车规级芯片领域的垄断。初创时期,公司面临着资金短缺、技术壁垒高和市场竞争激烈的挑战。然而,驰芯微团队凭借对技术的执着追求和对市场的敏锐洞察,成功研发出了一系列车规级智能传感和控制芯片,并逐渐在行业中崭露头角。经过数年的努力,驰芯微已经成为国内车规级芯片领域的领军者,其产品广泛应用于各类前装量产车型。

问答坊 | AI 解惑

.c文件和.asm文件怎么连接起来?

恩,大家好, 我现在用C编了一段程序,用汇编编了一段程序,我想把它们连接起来运行,请问应该怎么办呢? 我用的是C8051F系列的单片机,Keil Cx51编译器。 看了Cx51的帮助文档,但还是不明白。 不好意思啊,我再看看,也请大家指点。…

查看全部问答>

ARM微控制器快速入门知识

ARM微控制器快速入门知识…

查看全部问答>

请PROTEL高手帮忙

用PROTEL画PCB,原理图转PCB时发现PCB的元件全部堆到了一起,请教高手这是怎么回事?有什么解决的好方法可以快速打散这些元件?   小弟好久没画PCB了,请高手指点一下,谢谢!…

查看全部问答>

Altera提供10-GbE参考设计,器件全面支持XAUI协议

满足宽带网络和电信应用需求,Altera公司近日宣布,开始面向使用XAUI通信协议的设计人员提供万兆以太网(10GbE)参考设计。网络路由器、企业和城域以太网交换机以及存储交换机中的线路卡和系统控制器都可以采用Altera Arria和Stratix系列FPGA来可靠地 ...…

查看全部问答>

有谁能将附件中HEX文档转成C语言和汇编语言,谢

这个是一个朋友给我的单片机程序,可是是HEX文档,没办法打开,想请各位高手帮忙反编译成汇编和C语言,先谢谢了(散分)…

查看全部问答>

串口通信-PC端不能正确接收"0x11"字符的问题

工程调试中测试中发现: PC端不能正确接收0x11字符 使用串口工具,串口环回. 使用16进制发送 0x0001020304...171819 以上20个字符,除了0x11以为其他都能正确接收. 使用示波器检测信号.存在0x11的波形. 试验了以下几种通信设置: 9600,8个数据 ...…

查看全部问答>

如何将WCHAR类型的值转CString到里那?

WCHAR *pBuf; pBuf = new WCHAR[256]; CString strCombine=_T(\"1111\"); 然后我将strCombine = pBuf;这样可以用CString 类里的函数进行处理字符串,可是我这么写传进去的全是乱码。怎么办那? …

查看全部问答>

为什么硬盘在断电后或没有电源供电的情况下仍然能够存储数据?

产生这个问题的想法,是想到平时把硬盘从主机箱里取出来,硬盘仍然能够存储数据,想知道为什么,想弄清楚。 我搜索了一下,很多文章都是介绍硬盘的结构,和对于恢复硬盘丢失数据的文章,并不是我想要的答案。请各位朋友帮忙解答一下,希望回答得尽 ...…

查看全部问答>

当访问16位接口SRAM

时,为了能访问8位、16位、32位的变量,STM32的地址线和SRAM的地址线应该怎么连接?附图中的三种地址线连接方式是什么意思?请注意:因为我的理解不准确,我在20楼之前的解释有所误导,请看22楼的说明。请楼主原谅,因为此事非常重要,我不得 ...…

查看全部问答>