MSP430 中断服务

合集下载

MSP430 IO中断

MSP430 IO中断

MSP430I/O口中断引脚设置PxDIR输入/输出方向寄存器PxIN输入寄存器PxOUT输出寄存器PxIFG中断标志寄存器PxIE中断使能寄存器PxSEL功能选择寄存器(1)若使用P1口的部分引脚作为中断方式,在开总中断之前务必设置好P1IFG、P1IES、P1IE寄存器的相应位,并确保相应引脚为输入方向。

(2)为了尽量降低功耗,对连接引脚应设定为IO功能并设为输出。

(3)中断标志需要软件清除!可以用软件置位产生中断。

MSP430的IO中断由P1口和P2口输入变化的电平触发,P1和P2各有八个输入IO,P1的八个IO共用一个中断向量,P2的八个IO共用另一个中断向量。

在中断服务程序中判断到底是哪个IO口触发中断。

#include <msp430g2553.h>void Key_init(void){P1REN |= BIT3; //打开上拉,电路板上没有上拉电阻,触发边沿是从高电平到低电平P1IES |= BIT3; //选择触发边沿,下降沿触发P1IE |= BIT3; //打开P1.3的中断P1IFG &= 0x00;}void main(void){WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗P1DIR |= BIT0; //P1.0管脚设置为输出P1OUT |= BIT0; //P1.0管脚输出低电平Key_init(); //调用IO中断初始化函数_EINT(); //开启总中断,这一步没有的话,所有的中断都不能触发while(1); //死循环}#pragma vector = PORT1_VECTOR //中断向量声明__interrupt void Key_interrput(void){unsigned int i;for(i=0;i<12000;i++); //消抖必不可少啊!!if(P1IFG&BIT3) //判断是不是P1.3这个IO口产生了中断{ //若产生中断P1IFG.3置1P1OUT ^= BIT0; //LED2取反P1IFG &= 0x00; //中断标志位需要软件清除!!!P1REN |= BIT3;}}。

430中断总结

430中断总结

MSP430的中断分为3种:1.系统复位、2.非屏蔽中断、3.可屏蔽中断。

系统复位指向中断向量表(表3-11)的最高地址0xFFFE。

非屏蔽中断和可屏蔽中断根据能否被SR寄存器中的全局中断使能位GIE禁用来区分,非屏蔽中断不受GIE的控制,具备独立的中断使能;可屏蔽中断除了受本身的中断使能控制,还接受GIE控制。

1. 在MSP430中@非屏蔽中断主要有3个,分别是来自MSP430外部管脚NMI的触发FLASH非法访问振荡器错误非屏蔽中断都指向中断向量表中的0xFFFC地址。

2. MSP430具备大量的@可屏蔽中断,定时器、ADC、DMA、UART、WDT、I/O、比较器等都具备中断功能。

不同的可屏蔽中断优先级可根据中断向量表决定。

可屏蔽中断的中断向量表从0xFFFA地址开始向低地址扩展,地址越高的中断向量表所对应的中断优先级越高。

3. 每个中断向量在中断向量表里面占据一个2Byte空间的表项,这个2Byte的空间用来存储对应中断服务函数的首地址,CPU根据中断向量表里的地址跳转到中断服务函数。

仔细观察中断向量表可以看到,一些中断向量对应于多个中断源。

例如,地址为0xFFF8的Timer1_A3中断,当TA1CCR1中断标志位CCIFG置位或者TAIFG置位都会跳转到该向量。

又如具备中断功能的P1和P2端口,端口中的任意一个管脚发生中断都会跳转到对应的中断向量。

这种中断就叫做多源中断。

对于多源中断,中断源中任意一个中断发生都会跳转到公用的中断向量表项,这个时候需要通过中断标志位区别具体的中断源。

有了这些中断向量表的基础知识,下面介绍中断的处理过程,包括中断的接收和退出过程。

4. 微控制器使用过程中一些突发的程序跑飞问题,很多时候都是由于没有正确地处理中断造成的。

5. 中断发生的先决条件是对应中断使能位使能,@非屏蔽中断要求其独立的中断使能开启;@可屏蔽中断要求全局中断使能和自身中断使能同时开启。

6. 当中断请求到达,CPU从接受中断请求到开始执行中断服务函数的第一条指令需要5~6个CPU周期。

系统复位、中断及工作模式-利尔达MSP430培训资料

系统复位、中断及工作模式-利尔达MSP430培训资料

系统复位、中断及工作模式-利尔达MSP430培训资料系统复位、中断及工作模式嵌入式研发中心复位电路的结构POR(Power-on reset)的产生:上电 RST出现低电平 SVS产生复位动作 PUC(Power-up clear)的产生: POR信号 WDT时间溢出看门狗密钥错误 FLASH操作密钥错误 BOR(Brownout Reset)的产生: BOR 模块产生 PUC BOR PORBOR时序POR和BORBOR: MCLK< 4Mhz Brown-out!系统复位后的状态RSR/NMI为复位状态 IO口为输入状态各模块和寄存器恢复为初始化的状态状态寄存器SR复位看门狗WDT为看门狗状态 FFFE的内容装入PC指针软件必须完成的工作初始化堆栈指针SP,一般为RAM的顶端根据应用的需要,初始化WDT 对模块初始化特别注意:看门狗、晶振失败、FLASH写入失败都可以引起 RESET复位电路的设计1. RESET脚直接通过电阻上拉----不建议采用此方式2. RESET脚采用RC复位电路3. RESET脚采用电压监控芯片适用于MSP430没有BOR电路的芯片可以确保用户控制器中满足所有的工作电压条件MCU才启动4. MSP430F20xx的RESET与SBW共用,电容不要过大Device Pins Flash/RA Timers Communicatio BOR Features M n F11x1 20 4k/256 A3 Comp_A 8k/256 A3 ADC10 F11x2 20 F12x 28 8k/256 A3 Comp_A USART F12x2 28 8k/256 A3 USART ADC10 F13x 64 16k/512 A3,B3 USART ADC12 F14x 64 60k/2k A3,B7(2)USART ADC12, MPY 64 32k/1k A3,B3 USART, I2C ADC12, (2)DAC12, (3)DMA F15x F16x 64 60k/10k A3,B7 (2)USART, ADC12, (2)DAC12, (3)DMA I2C All devices include watchdog timer (WDT) and basic clock system (BCS)MSP430中断种类系统复位 POR、PUC、BOR和SVS 非屏蔽中断NMI 晶振失败 FLASH失败可屏蔽中断 TA、BT、COMP、UART等中断矢量结构中断进入进入中断需要6个指令周期1. 当前运行的指令完成,PC指向下一条指令 2. PC压栈 3. SR压栈 4. 选择高优先级中断 5. 单元中断中断标志清除,多元中断需要软件清除 6. 除SCG0外,SR被清除,如果是低功耗,退出低功耗,GIE的清除关闭可屏蔽中断7.装载PC指针中断前中断后特别注意:进入中断后,SP指针指向堆栈中的SR. 可以在中断程序中修改0(SP)内容改变中断返回后 SR状态。

MSP430单片机入门例程

MSP430单片机入门例程

MSP430单片机入门例程MSP430单片机是一款低功耗、高性能的16位单片机,广泛应用于各种嵌入式系统。

下面是一个简单的MSP430单片机入门例程,可以让大家初步了解MSP430单片机的基本使用方法。

所需材料:1、MSP430单片机开发板2、MSP430单片机编译器3、MSP430单片机调试器4、电脑和相关软件步骤:1、安装MSP430单片机编译器首先需要安装MSP430单片机的编译器,该编译器可以将C语言代码编译成MSP430单片机可以执行的机器码。

在安装编译器时,需要选择与您的单片机型号匹配的编译器。

2、编写程序下面是一个简单的MSP430单片机程序,可以让LED灯闪烁:c本文include <msp430.h>int main(void)本文P1DIR |= 0x01; //设置P1.0为输出while(1){P1OUT ^= 0x01; //反转P1.0的状态,LED闪烁__delay_cycles(); //延时一段时间,控制闪烁频率}本文上述程序中,首先定义了P1DIR寄存器,将P1.0设置为输出。

然后进入一个无限循环,在循环中反转P1.0的状态,使LED闪烁。

使用__delay_cycles()函数实现延时,控制LED闪烁频率。

3、编译程序使用MSP430单片机编译器将程序编译成机器码,生成可执行文件。

在编译时,需要注意选择正确的编译器选项和单片机型号。

4、调试程序使用MSP430单片机调试器将可执行文件下载到单片机中,并使用调试器进行调试。

在调试时,可以观察单片机的输出口状态和LED灯的闪烁情况,确保程序正常运行。

随着嵌入式系统的发展,MSP430单片机作为一种低功耗、高性能的微控制器,在各种应用领域中得到了广泛的应用。

为了更好地理解和应用MSP430单片机,我在学习过程中积累了一些经验,现在分享给大家。

MSP430单片机是一种超低功耗的微控制器,由德州仪器(Texas Instruments)推出。

msp430按键中断_V1.01

msp430按键中断_V1.01
中断分类
• 软件中断(内中断) • 硬件中断(外中断)
• 非屏蔽中断 • 可屏蔽中断
4
开启总中断
5
中断响应和中断处理流程
当CPU收到中断或者异常的 信号时,它会暂停执行当前的程 序或任务,通过一定的机制跳转 到负责处理这个信号的相关处理 程序中,在完成对这个信号的处 理后再跳回到刚才被打断的程序 或任务中。
14
I/O中断实列
这是一个利用中断控制LED的亮灭实验,初始时LED常亮,按下按键,LED亮灭切换
15
IO 外部中断使用方法
高级单片机的全部 IO 口都带外部中断功能,MSP430 单片机要使用外部中断,遵 循以下步骤:
1) 通过 PxDIR 将 IO 方向设为输入。 2) 通过写 PxIES,决定中断的边沿是上升沿、下降沿或两种情况均中断。 3) 如果是机械按键输入,可以通过 PxREN 启用内部上下拉电阻,根据按键 的接法,设
7
MSP430中的中断系统
这是一个用户手册
8
MSP430F6638的P1到 P4都具有中断的功能
翻到msp430f6 638_Datasheet 第6章表6.3
9
中断嵌套
如果在中断服务子程中置位GIE(开全局中断),则允许 中断嵌套。 在允许中断嵌套的情况下,任何中断请求均将中断正在 执行的中断服务子程序,而不管中断的优先级如何。 (中断优先级仅用于裁决同时产生的中断请求)
CPU执行流程 中断申请
set GIE
中断子程序1
中断子程序2
10
I/O寄存器
使用实列:
P2DIR |= BIT7; //设P2.7为输出 P2DIR为方向寄存器,输出为1,输入为0. P2OUT |= BIT7; //初始化P2.7为高电平 P2OUT是输出数据寄存器,可控制管脚输出电平的高低,输出为

MSP430中断以及一个键盘的例子

MSP430中断以及一个键盘的例子

最近在学习和实践的过程中接触到了线程的概念。

当你需要处理一大堆数据或者等待一个事件发生时候,系统其实并不需要等在那里,只需建立一个线程,适时的让它在后台运行,处理这些很占用系统的事件。

我想这与中断的功能很是相似,有些时候你让程序卡在那里仅仅是为了等待一个参数的改变,而这个参数完全可以在中断中实现修改,所以巧妙的使用中断对于高效的程序是必须的。

MSP430提供了3类中断:系统复位;非可屏蔽中断;可屏蔽中断。

下表列出了三种中断各自的中断源:MSP430中断优先级结构图如上图所示。

各模块的中断优先级由模块连接链决定,越接近CPU/NMIRS的模块,其中断优先级越高。

上图给出了中断的执行过程,相信大家可以在任何其他的书本中找到类似的流程图。

中断发生,全局中断开启,并且允许相应此中断,此时需要等待当前指令完成。

保存短点和寄存器值。

然后清除寄存器的值以及中断标志位,如果同时有多个中断发生则选择优先级最高的执行,进入中断服务子程序,执行完后,恢复断点,继续执行主程序。

通过这种前后台程序的切换控制程序运行,得到高效率。

下面让我们来看一个4x4键盘的例子。

我们通过中断的方式来感知键盘的操作,通过一个键盘扫描程序来确认按下的键,然后通过数码管动态的显示出来。

#include<msp430x24x.h>static int nRes;int nP10,nP11,nP12,nP13;static char LEDData[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8 e};void delay(int number){while(--number);}int KeyProcess(void){int nres=0;//P1.4输出低电平P1OUT = 0xe0;nP10 = P1IN&BIT0;if (nP10 == 0) nres = 13;nP11 = (P1IN & BIT1) >> 1; if (nP11 == 0) nres = 14;nP12 = (P1IN & BIT2) >> 2; if (nP12 == 0) nres = 15;nP13 = (P1IN & BIT3) >> 3; if (nP13 == 0) nres = 16;//P1.5输出低电平P1OUT = 0xd0;nP10 = P1IN&BIT0;if (nP10 == 0) nres = 9;nP11 = (P1IN & BIT1) >> 1; if (nP11 == 0) nres = 10;nP12 = (P1IN & BIT2) >> 2; if (nP12 == 0) nres = 11;nP13 = (P1IN & BIT3) >> 3;if (nP13 == 0) nres = 12;//P1.6输出低电平P1OUT = 0xb0;nP10 = P1IN&BIT0;if (nP10 == 0) nres = 5;nP11 = (P1IN & BIT1) >> 1;if (nP11 == 0) nres = 6;nP12 = (P1IN & BIT2) >> 2;if (nP12 == 0) nres = 7;nP13 = (P1IN & BIT3) >> 3;if (nP13 == 0) nres = 8;//P1.7输出低电平P1OUT = 0x70;nP10 = P1IN&BIT0;if (nP10 == 0) nres = 1;nP11 = (P1IN & BIT1) >> 1;if (nP11 == 0) nres = 2;nP12 = (P1IN & BIT2) >> 2;if (nP12 == 0) nres = 3;nP13 = (P1IN & BIT3) >> 3;if (nP13 == 0) nres = 4;while(!(nP10 && nP11 && nP12 && nP13 )) {P1OUT = 0x00; //恢复以前值//读取各个管脚的状态nP10 = P1IN&BIT0;nP11 = (P1IN&BIT1) >> 1; nP12 = (P1IN&BIT2) >> 2; nP13 = (P1IN&BIT3) >> 3; }return nres;}void display(int number){int tens,single;tens = number/10;single = number%10;P4OUT = LEDData[single]; P6OUT = 0x01;delay(100);P6OUT = 0x00;P4OUT = LEDData[tens];P6OUT = 0x02;delay(100);P6OUT = 0x00;}void main(){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗//将P1口的所有的管脚在初始化的时候设置为输入方式P1DIR=0;//将P1口所有的管脚设置为一般I/O口P1SEL=0;//将P1.4、P1.5、P1.6、P1.7设置为输出方向P1DIR |= BIT4+BIT5+BIT6+BIT7;//输出低电平P1OUT = 0x00;P2DIR |= BIT0+BIT1+BIT2+BIT3; // when there is a interrupt there be a led indicate P2OUT = 0x00;P4DIR |= 0xff; // P4、P5口用于输出字型码//P5DIR |= 0xff;P6DIR |= BIT0+BIT1; // P6.0 P6.1用于片选P1IE |= BIT0;P1IE |= BIT1;P1IE |= BIT2;P1IE |= BIT3;P1IES |= (BIT0+BIT1+BIT2+BIT3);// pattern of the trigger_EINT();nRes=0;while (1){display(nRes);}}#pragma vector= PORT1_VECTOR __interrupt void Port_1(void){P1OUT = 0x00;nRes=KeyProcess();P1IFG = 0x00;}。

MSP430键盘程序[中断方式

MSP430键盘程序[中断方式

MSP430键盘程序[中断方式]// 此示例程序为中断方式,得到键盘的键值,存放在队列keybuff[10]中// 此示例程序没有显示,// 键盘的按键按下引起P1口的中断服务程序,得到键盘的键值,保存到键值队列// 在其他的中断服务程序中通过键值队列中的数据引导程序的流程#include <msp430x14x.h>unsigned char keybuff[10];unsigned char keypoint=0;void delay(int v){while(v!=0)v--;}unsigned char key(void){unsigned char x=0xff;P1DIR=0X0F;P1OUT=0X01; //扫描第一行if((P1IN&0X70)==0X10)x=0;elseif((P1IN&0X70)==0X20)x=1;elseif((P1IN&0X70)==0x40)x=2;else{P1OUT=0X2; //扫描第二行if((P1IN&0X70)==0X10)x=3;elseif((P1IN&0X70)==0X20)x=4;elseif((P1IN&0X70)==0x40)x=5;else{P1OUT=0X4; //扫描第三行if((P1IN&0X70)==0X10)x=6;elseif((P1IN&0X70)==0X20)x=7;elseif((P1IN&0X70)==0x40)x=8;else{P1OUT=8; //扫描第四行if((P1IN&0X70)==0X10)x=9;elseif((P1IN&0X70)==0X20)x=10;elseif((P1IN&0X70)==0x40)x=11;}}}return(x);}unsigned char keyj(void){unsigned char x;P1DIR=0x0f;P1OUT=0x0f; //键盘硬件:P10--P13为行线,最上面一根为P10x=(P1IN&0X70); // P14--P16为列线,最左边一根为P14,列线下拉 return(x); // 无按键,返回 0?; 有按键返回非0}interrupt[PORT1_VECTOR] void port1key(void){if(keyj()!=0X00){delay(300) ; //消抖动if(keyj()!=0X0){keybuff[keypoint]=key(); //按键见键值保存到队列keypoint++; //if(keypoint==10)keypoint=0;}}P1OUT=0X0F;P1IFG=0X0; //清除中断标志}void main(void){WDTCTL = WDTPW + WDTHOLD; /* // Stop WDT */P1DIR=0XF;P1OUT=0XF;P1IES=0X0;P1IE=0X70; //列线上升沿允许P1中断_EINT(); /*/ Enable interrupts */while(1){LPM0;_NOP();}}。

第四章MSP430单片机中断系统

第四章MSP430单片机中断系统
2
4.1 中断的基本概念
1.什么是中断
中断是暂停CPU正在运行的程 序,转去执行相应的中断服务程 序,完毕后返回被中断的程序继续 运行的现象和技术。
CPU执行流程
无中断时 有中断时
非预料 事件1
中断服 务程序1
非预料 事件 2
中断服 务程序 2
3
4.1 中断的基本概念
2.中断源(中断分类)
中断首先需要有中断源发出中断请求,并征得系统允许 (屏蔽、优先权)后才会发生。转去执行中断服务程序前需 保护中断现场,执行完中断服务程序后应恢复中断现场。
POP SR POP PC
对 SR 的影响:
Status Bits: N,Z,C,V: restored from system stack
Mode Bits: GIE,OSCOFF and CPUOFF are restored from 17 system stack
4.2 MSP430中断源
22
附:MSP430G2553头文件部分内容
/************************************************************ * STANDARD BITS ************************************************************/
中断子程的 入口地址
0:N×4 0:N×4+2
中断向量 OFFSET
SEG
IRET
13
奔腾CPU获取中断类型号的方法总结
INTO指令 被零除 OF=1
固定类型号00H 固定类型号04H
内 DEBUG的单步和断点操作
中 单步
固定类型号01H
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

当系统时钟发生器基本功能建立之后,CPU内状态寄存器SR的SCG1,SCG0,CPUOFF,OSCOFF位是重要的低功耗控制位。

只要任意中断被响应,上述控制位就被压入堆栈保存,中断处理之后,又可恢复先前的工作方式。

在中断处理子程序执行期间,通过间接访问堆栈数据,可以操作这些控制位;这样允许程序在中断返回(RETI) 后,以另一种功耗方式继续运行。

各控制位的作用如下:
SCG1:复位,使能SMCLK;置位,禁止SMCLK。

SCG0:复位,激活直流发生器,只有SCG0置位,并且DCOCLK没有被用作MCLK或SMCLK时,直流发生器才能被禁止。

OSCOFF:复位,激活LFXT1,只有当OSCOFF被置位并且LFXT1CLK不用于MCLK或SMCLK时,FLXT1才能被禁止;当使用晶体振荡器关闭选项OSCOFF时,需要考虑晶体振荡器的启动设置时间
CPUOFF:复位,激活MCLK;置位,关闭MCLK。

控制位SCG1、SCG0、CPUOFF、OSCOFF可由软件配制成六种不同的工作模式:工作模式控制位 CPU状态、振荡器及时钟
SCG1=0 CPU活动
SCG0=0 MCLK活动
AM CPUOFF=0 SMCLK活动
OSCOFF=0 ACLK活动
SCG1=0 CPU禁止
LPM0 SCG0=0 MCLK禁止
OSCOFF=0 SMCLK活动
CPUOFF=1 ACLK活动
SCG1=0 CPU禁止
MCLK禁止
LPM1 SCG0=1 如果DCOCLK位用作MCLK或SMCLK,则直流发生器禁止,
否则,仍然活动
OSCOFF=0 SMCLK活动
CPUOFF=1 ACLK活动
SCG1=1 CPU禁止
如果DCO未被用作MCLK或SMCLK,自动禁止
SCG0=0 MCLK禁止
LPM2 OSCOFF=0 SMCLK禁止
CPUOFF=1 ACLK活动
SCG1=1 CPU禁止
DCO被禁止,直流发生器被禁止
SCG0=1 MCLK禁止
LPM3 OSCOFF=0 SMCLK禁止
CPUOFF=1 ACLK活动
SCG1=1 CPU禁止
SCG0=1 DCO被禁止,直流发生器被禁止LPM4 OSCOFF=1 所有振荡器停止工作
MCLK、SMCLK禁止
CPUOFF=1 ACLK禁止
低功耗的设计技巧问题
1.LPM4:在振荡器关闭模式期间,处理机的所有部件工作停止,此时的电流消耗最小。

此时只有在系统上电电路检测到低点电平或任一请求异步响应中断的外部中断事件时才会从新工作。

因此在设计应含有可能需要用到的外部中断才采用这种模式,否则发生不可预料的结果。

2.LPM3:在DC发生关闭期间,只有晶振是活动的。

但此时设置基本时序条件的DC发生器的DC电流被关闭。

由于此电路的高阻设计,使功耗被抑制。

当从DC关闭到启动DC需要一段时间(ns~us)
3.LPM2:在此期间晶振和DC发生器是工作的,所以可以实现快速启动
4.LPM1:在此期间振荡器已经工作,所以不存在启动延时问题
_BIS_SR(LPM3_bits) _BIC_SR_IRQ(LPM3_bits)
LPM3 LPM3_EXIT
系统响应中断过程:
1.硬件自动中断服务
a.PC入栈
b.SR入栈
c.中断向量赋给PC
d.GIE、SCG1、CPOOFF和OSCOFF清楚
e.IFG标志位清除(单源中断标志比如WDTIFG)
2.执行中断处理子程序
3.执行RETI指令
4.SR出栈
5.PC出栈
低功耗应用
void main(void)
{
WDTCTL=WDT_ADLY_1000;
IE1 | = WDTIE;
P1DIR | = 0X01;
_EINT();
for(;;)
{
LPM3;
_NOP();
}
}
interrupt[WDT_VECTOR] watchdog_timer(void) {
P1OUT ^ = 0X01;
}。

相关文档
最新文档