1.中断概念
单片机在运行过程中需要紧急处理的事。比如正在写作业水开了然后去灌水,再回来继续写作业。
水开了就是中断信号,记住作业写到哪这叫保护现场,判断是谁打断这叫中断类型,灌水这是中断处理,再回来继续写作业这叫回到保护现场执行原进程。
2.MSP430中断的种类
I/O中断
定时器中断
串口中断
外部中断
ADC转换中断
看门狗中断
捕获比较中断
除了这些分类还有不可屏蔽中断和可屏蔽中断。
3.相关寄存器
MSP430F5529只有P1和P2引脚有中断功能,因此寄存器分为端口1的和端口2的我们以端口1的作为讲解。
想要使用好中断必须要了解他相关的寄存器:寄存器文档地址
寄存器也是八位的每一位代表了了引脚标号bit0->PX.0这个引脚的中断相关信息
3.1端口1中断边缘选择寄存器
这个寄存器是用来设置是上升沿触发还是下降沿触发,0设置为上升沿,1设置为下降沿
3.2端口1中断使能寄存器
0设置为失能,1设置为使能
3.3端口1中断标志寄存器
这个寄存器如果为0说明没有中断,如果为1说明有中断。
中断相关寄存器就介绍完了
4.中断配置具体步骤
设置:P1.5为下降沿触发中断
1.配置端口,设置端口方向
将I/O配置为上拉输入
P1SEL &= ~BIT5; //设置为I/O模式
P1DIR &= ~BIT5; //设置方向为输入
P1REN |= BIT5 ; //使能上下拉电阻
P1OUT |= BIT5 ; //设置为上拉电阻
2.设置中断触发模式ISE寄存器
写中断边缘选择寄存器为1
3.开启中断
先写IE寄存器,使能对应I/O口中断,在开启系统总中断 _EINT()
#define _EINT() __enable_interrupt()
#define _DINT() __disable_interrupt()
4.编写中断子函数
通过if判断是那个端口的中断
5.编写中断处理函数
也就是中断下文函数,中断处理函数
6.清除中断标志位
写IFG寄存器,PXIFG = 0X00。
注:I/O中断的相关配置函数在I/O配置库里
5.程序源码程序源码
#include <driverlib.h>
//当前使用系统默认的时钟大约1M
void my_delay_ms(int ms)
{
for(;ms>0;ms--)
_delay_cycles(1000);//系统延时函数,延时时长由系统时钟决定
}
void LED1_init()
{
P1SEL &= ~BIT0; //设置为I/O模式
P1DIR |= BIT0; //设置方向为输出
}
void KeyInterrupt_init()
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
LED1_init();
P1SEL &= ~BIT5; //设置为I/O模式
P1DIR &= ~BIT5; //设置方向为输入
P1REN |= BIT5 ; //使能上下拉电阻
P1OUT |= BIT5 ; //设置为上拉电阻
P1IES |= BIT5;
P1IE |= BIT5;
_EINT();
}
void Key1InterruptFun()
{
P1OUT ^= BIT0;
}
/**
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
LED1_init();
KeyInterrupt_init();
while(1)
{
;
}
}
#pragma vector=PORT1_VECTOR//设置中断向量
__interrupt void Port_1()
{
unsigned char BITX = 255;
_DINT();//关闭总中断防止重复进入中断
if(P1IFG & BIT0)
{
BITX = BIT0;
}
else if(P1IFG & BIT1)
{
}
else if(P1IFG & BIT2)
{
}
else if(P1IFG & BIT3)
{
}
else if(P1IFG & BIT4)
{
}
else if(P1IFG & BIT5)//中断由P1.5触发
{
my_delay_ms(20);
if(GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN5) == 0)
Key1InterruptFun(); //调用中断处理函数
BITX = BIT5;
}
else if(P1IFG & BIT6)
{
}
else if(P1IFG & BIT7)
{
}
P1IFG &= ~BITX;
_EINT();
}