MSP430G2553中断要点总结

  • 所整理归纳仅做分享与记录,从自身角度分析自己身为学生曾在学习中所遇到的问题与需要特别注意的地方,把这些分享给大家,同时也是对自己的完善与巩固,希望大家一起努力。
    另外我所上传资源全部免费,不要积分下载,我所上传的文章也会以WORD形式放到我上传的资源内,如果有需要的话可以自行免费下载,关于MSP430G2553学习的文章会继续上传,定时更新,希望可以帮到大家。

本章所述为I/O设置与中断的要点总结与注意事项。

1、中断

中断控制器:中断发生时有一个硬件装置将信号输入单片机,该硬件部件叫中断控制器,它负责把引起中断的信号编号,并按照事先约定的优先级排队,并发信号给单片机的cpu。
中断的编号叫中断号,对应处理程序叫中断服务程序,服务程序的地址叫中断向量。中断向量按照中断编号排列成表,叫中断向量表
cpu检测到中断控制器的信号后,获得当前中断发生信号的编号,由中断向量表找到中断向量,转而去执行这个编号对应的中断处理程序
中断向量表见文章末。

2、复位

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

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

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

I/O寄存器

  1. PxDIR 方向:0输入 1输出

  2. PxOUT

  3. PxIN

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

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

  5. 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(禁用)。

例程

  1. 按键上拉设置;
P1OUT |= BIT0;					//选择上下拉,1上拉;0下拉
P1REN |= BITO;					//启用上下拉电阻

P1OUT与P1REN配合使用

  1. P1_3中断程序
#include <msp430g2553.h> 
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 口的中断使能

如何写一个中断函数总结

要写一个带有中断的程序,需要做下面几件事情:
  1. 配置外设中和中断有关的寄存器,例如 I/O 口中断是上升沿触发还是下降沿触发, 定时器中断的计数方式和定时值等等。
  2. 依照中断服务函数的模板写中断服务函数,添加中断后要干什么的代码。
  3. 使能外设的中断,使能全局中断(GIE)
  4. 一旦中断发生, CPU 停下主函数中的任务,并标记位置,进入中断服务函数,执行完中断服务函数之后回到主函数标记位置处继续运行。

中断服务函数

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1OUT ^= 0x01; // P1.0 = toggle
P1IFG &= ~0x08; // Clear P1.3 IFG
}

  1. #pragma vector=PORT1_VECTOR
    #Pragma 是编译器指令,是告诉编译器将函数与中断向量连接起来。 “vector=”后面是中断向量地址的宏定义,例如 P1 口中断就是 PORT1_VECTOR,定时器中断就是TIMER0_A1_VECTOR。
    不同外设的中断向量名在哪里找呢?打开 CCS 的安装文件夹,例如C:\ti\ccsv7\ccs_base\msp430\include,在这个文件夹中搜索芯片的具体型号,如msp430g2553,可以找到一个名为 msp430g2553.h 的头文件。这个头文件中包含了所有寄存器位的宏定义,包括中断向量的宏定义。 在 msp430g2553.h 中找到“Interrupt Vectors”这个部分(如下图),其中包含了所有中断向量的名称。 例如 P1 端口的中断向量名就是PORT1_VECTOR。
    在这里插入图片描述
    1. __interrupt void Port_1(void)
      __interrupt 关键字表明这是一个中断服务函数,CPU 见到这个关键字以后就会去做中断之前的准备工作。 Port_1 是用户自己取的函数名称,这个名称可以任意命名。
    2. 中断服务函数的具体内容
      中断服务函数的内容依据中断的不同种类有所差别。退出中断前一定不要忘记将中断标志位复位。
原创文章 3 获赞 3 访问量 134

猜你喜欢

转载自blog.csdn.net/weixin_44863470/article/details/106105623