基于msp430串口接收中断
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;}}。
MSP430单片机实用技术讲座13 第9讲 简单的端口显示中断综合应用
MSP430单片机实用技术讲座(13) 第9讲 简单的端口、显示、中断综合应用・南京航空航天大学 魏小龙・本讲将结合定时器、端口、中断等430资源进行综合应用。
具体要求如下:1.硬件连接 硬件连接(如图1)很简单,在P4端口连接了8只发光二极管LED0 ̄LED7,在P1端口连接了4×4键盘(16键)。
P1同时通过138、164扩展了8位数码显示器。
2.软件要求a)编写扫描键盘软件;b)编写数码管显示程序;c)键盘使用中断编写;d)P4连接的发光二极管的发光强度通过键盘控制,共分16亮度等级;e)分别控制单个发光二极管(可对LED0到LED7进行分别控制其亮度);f)在数码管上显示每只发光二极管的亮度,对应关系为:第一只数码管显示的数值对应第一只发光二极管的亮度,后面依次类推,第八只数码管显示的数值对应第八只发光二极管的亮度。
3.分析首先编写基本硬件程序,键盘与数码管显示已经在上一讲说清楚了,这里只管调用就可以了。
发光二极管显示也很简单,高电平亮,低电平熄。
那么如何实现发光二极管LED0 ̄ LED7显示的亮暗调节呢。
先看看图2所示的4个不同信号a、b、c、d。
假设它们的周期都是100Hz,则这些信号送发光二极管后,我们看不到发光二极管的亮与熄,我们看到的都是亮,只不过亮度不一样而已(因为人眼睛的视觉暂停缘故)。
很显然,信号a驱动发光二极管最暗,信号d驱动发光二极管最亮。
本讲所使用的硬件有16只扫描键盘,我们定义按0号按键显示最暗,按F号按键显示最亮。
根据软件要求e要求分别控制单个发光二极管(可对LED0到LED7进行分别控制其亮度),那么如何实现呢?我们可以将亮度数据存放在显示缓存里,则disbuffer[0]的数据表示LED0的亮度, 则disbuffer[1]的数据表示LED1的亮度......这样只要在显示缓存中取对应的亮度数值去控制发光二极管的显示就可以了。
数码管的显示方法为:在显示缓存中取数据移位到驱动对应数码管的74HC164,并延时显示一会儿。
MSP430串口
你参考一下别人的代码看看注释很详细#include <msp430x14x.h>unsigned char RxData;//全局变量,保存接收到的数据。
void BasicClockSet(){/*下面将片外高速晶体设为MCLK分四步:(1) 起动高晶体(2) 清除OFIFG 标志位(3) 至少等待50us。
(4) 查看震荡器失效标志位OFIFG是否清0,如果没有清0,则重复1至4步直到震荡器失效标志位OFIFG清0。
与之相关寄存器为:1.BCSCTL1和BCSCTL2(基础系统时钟控制寄存器)2.IE1中断使能寄存器的第二位OFIE,振荡器失效中断使能位。
3.IFG1中断标志寄存器的第二位OFIFG,振荡器失效标志位。
4.DCOCTL数字震荡器控制寄存器。
一. BCSCTL1设置(基础系统时钟控制寄存器1):1.XT2OFF=0,外部高速晶体开。
2.XTS=0,片外低速晶体的频率,0为低频模式。
3.DIVAx=00B,不将其进行分频,即分频比为14.XT5V不使用设为0。
5.RSELx=111,DOC的电阻选择,此时DOC震荡频率达到最大10000MHZ(理想状态)。
因此BCSCTL1=0000 0111B=0x47。
二.BCSCTL2设置(基础系统时钟控制寄存器2):1.SELMx=10B,选择片外高速晶体作为MCLK。
这两位应等到振荡器失效标志位清0后才置位2.DIVMx=00B,不将其进行分频,即分频比为13.SELS=0B,选择子系统时钟为DCO4.DIVSx=00B,不将其进行分频,即分频比为15.DCOR=0B,选择芯片内部电阻。
三.DCOCTL(数字震荡器控制寄存器)1.DCOx=111,DCO频波段选择,此时诜择最大2.MODx=000,调制选择,当DCOx=111B时MODx无效。
*//*下面将片外高速晶体设为主系统时钟。
*///(1) 起动片外高速晶体BCSCTL1&=~XT2OFF;//XT2OFF的宏为0x80。
MSP430G2553单片机的中断使用格式
端口1中断函数多中断中断源:P1IFG.0~P1IFG7进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断#pragma vector=PORT1_VECTOR__interrupt void Port1(){ //以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。
if((P1IFG&BIT0) == BIT0){ //处理P1IN.0中断P1IFG &= ~BIT0; //清除中断标志//以下填充用户代码}else if((P1IFG&BIT1) ==BIT1){//处理P1IN.1中断P1IFG &= ~BIT1; //清除中断标志//以下填充用户代码}else if((P1IFG&BIT2) ==BIT2){//处理P1IN.2中断P1IFG &= ~BIT2; //清除中断标志//以下填充用户代码}else if((P1IFG&BIT3) ==BIT3){//处理P1IN.3中断P1IFG &= ~BIT3; //清除中断标志//以下填充用户代码}else if((P1IFG&BIT4) ==BIT4){//处理P1IN.4中断P1IFG &= ~BIT4; //清除中断标志//以下填充用户代码}else if((P1IFG&BIT5) ==BIT5){//处理P1IN.5中断P1IFG &= ~BIT5; //清除中断标志//以下填充用户代码}else if((P1IFG&BIT6) ==BIT6){//处理P1IN.6中断P1IFG &= ~BIT6; //清除中断标志//以下填充用户代码}else{//处理P1IN.7中断P1IFG &= ~BIT7; //清除中断标志//以下填充用户代码}}端口2中断函数多中断中断源:P2IFG.0~P2IFG7进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断*****************************************************************************/ #pragma vector=PORT2_VECTOR__interrupt void Port2(){//以下为参考处理程序,不使用的端口应当删除其对于中断源的判if((P2IFG&BIT0) == BIT0){//处理P2IN.0中断P2IFG &= ~BIT0; //清除中断标志//以下填充用户代码}else if((P2IFG&BIT1) ==BIT1){//处理P2IN.1中断P2IFG &= ~BIT1; //清除中断标志//以下填充用户代码 }else if((P2IFG&BIT2) ==BIT2){//处理P2IN.2中断 P2IFG &= ~BIT2; //清除中断标志//以下填充用户代码 }else if((P2IFG&BIT3) ==BIT3){//处理P2IN.3中断 P2IFG &= ~BIT3; //清除中断标志//以下填充用户代码}else if((P2IFG&BIT4) ==BIT4){//处理P2IN.4中断P2IFG &= ~BIT4; //清除中断标志//以下填充用户代码 }else if((P2IFG&BIT5) ==BIT5){//处理P2IN.5中断P2IFG &= ~BIT5; //清除中断标志//以下填充用户代码}else if((P2IFG&BIT6) ==BIT6){//处理P2IN.6中断P2IFG &= ~BIT6; //清除中断标志//以下填充用户代码}else{//处理P2IN.7中断P2IFG &= ~BIT7; //清除中断标志//以下填充用户代码}}USART0发送中断函数******************************************************************************/ #pragma vector=USART0TX_VECTOR__interrupt void Usart0Tx(){//以下填充用户代码}USART0接收中断函数******************************************************************************/ #pragma vector=USART0RX_VECTOR__interrupt void Usart0Rx(){//以下填充用户代码}USART1发送中断函数******************************************************************************/ #pragma vector=USART1TX_VECTOR__interrupt void Usart1Tx(){//以下填充用户代码}SART1接收中断函数******************************************************************************/ #pragma vector=USART1RX_VECTOR__interrupt void Ustra1Rx(){//以下填充用户代码}基本定时器中断函数******************************************************************************/ #pragma vector=BASICTIMER_VECTOR__interrupt void BasTimer(){//以下填充用户代码}定时器A中断函数多中断中断源:CC1~2 TA******************************************************************************/#pragma vector=TIMER0_A1_VECTOR__interrupt void TimerA1(){//以下为参考处理程序,不使用的中断源应当删除switch (__even_in_range(TAIV, 10)){case 2: //捕获/比较1中断//以下填充用户代码break;case 4: //捕获/比较2中断//以下填充用户代码break;case 10: //TAIFG定时器溢出中断//以下填充用户代码break;}}定时器A中断函数中断源:CC0******************************************************************************/ #pragma vector=TIMERA0_VECTOR__interrupt void TimerA0(){//以下填充用户代码}多中断源:CC1~6 TB******************************************************************************/ #pragma vector=TIMERB1_VECTOR__interrupt void TimerB1(){//以下为参考处理程序,不使用的中断源应当删除switch (__even_in_range(TBIV, 14)){case 2: //捕获/比较1中断//以下填充用户代码break;case 4: //捕获/比较2中断//以下填充用户代码break;case 6: //捕获/比较3中断//以下填充用户代码break;case 8: //捕获/比较4中断//以下填充用户代码break;case 10: //捕获/比较5中断//以下填充用户代码break;case 12: / /捕获/比较6中断//以下填充用户代码break;case 14: //TBIFG定时器溢出中断//以下填充用户代码break;}}中断源:CC0******************************************************************************/ #pragma vector=TIMERB0_VECTOR__interrupt void TimerB0(){//以下填充用户代码}AD转换器中断函数多中断源:摸拟0~7、VeREF+、VREF-/VeREF-、(AVcc-AVss)/2 没有处理ADC12TOV和ADC12OV中断标志******************************************************************************/ #pragma vector=ADC_VECTOR__interrupt void Adc(){//以下为参考处理程序,不使用的中断源应当删除if((ADC12IFG&BIT0)==BIT0){ //通道0//以下填充用户代码}else if((ADC12IFG&BIT1)==BIT1){ //通道1//以下填充用户代码}else if((ADC12IFG&BIT2)==BIT2){ //通道2//以下填充用户代码}else if((ADC12IFG&BIT3)==BIT3){ //通道3//以下填充用户代码}else if((ADC12IFG&BIT4)==BIT4){ //通道4//以下填充用户代码}else if((ADC12IFG&BIT5)==BIT5){ //通道5//以下填充用户代码}else if((ADC12IFG&BIT6)==BIT6){ //通道6//以下填充用户代码}else if((ADC12IFG&BIT7)==BIT7){ //通道7//以下填充用户代码 }else if((ADC12IFG&BIT8)==BIT8){ //VeREF+//以下填充用户代码 }else if((ADC12IFG&BIT9)==BIT9){ //VREF-/VeREF-//以下填充用户代码}else if((ADC12IFG&BITA)==BITA){ //温度//以下填充用户代码}else if((ADC12IFG&BITB)==BITB){ //(A Vcc-A Vss)/2//以下填充用户代码}}看门狗定时器中断函数******************************************************************************/ #pragma vector=WDT_VECTOR__interrupt void WatchDog(){//以下填充用户代码}比较器A中断函数******************************************************************************/ #pragma vector=COMPARA TORA_VECTOR__interrupt void ComparatorA(){//以下填充用户代码}不可屏蔽中断函数******************************************************************************/ #pragma vector=NMI_VECTOR__interrupt void Nmi(){//以下为参考处理程序,不使用的中断源应当删除if((IFG1&OFIFG)==OFIFG){ //振荡器失效IFG1 &= ~OFIFG;//以下填充用户代码}else if((IFG1&NMIIFG)==NMIIFG){ //RST/NMI不可屏蔽中断IFG1 &= ~NMIIFG;//以下填充用户代码}else //if((FCTL3&ACCVIFG)==ACCVIFG){ //存储器非法访问FCTL3 &= ~ACCVIFG;//以下填充用户代码}}中断优先级:优先级顺序从高到低为:PORT2_VECTOR (1 * 2u) /* 0xFFE2 Port 2 */PORT1_VECTOR (4 * 2u) /* 0xFFE8 Port 1 */TIMER0_A1_VECTOR (5 * 2u) /* 0xFFEA Timer A CC1-2, TA */TIMER0_A0_VECTOR (6 * 2u) /* 0xFFEC Timer A CC0 */ADC_VECTOR (7 * 2u) /* 0xFFEE ADC */USART0TX_VECTOR (8 * 2u) /* 0xFFF0 USART 0 Transmit */USART0RX_VECTOR (9 * 2u) /* 0xFFF2 USART 0 Receive */WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */ COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6 Comparator A */TIMERB1_VECTOR (12 * 2u) /* 0xFFF8 Timer B CC1-2, TB */TIMERB0_VECTOR (13 * 2u) /* 0xFFFA Timer B CC0 */NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maska××e */RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priority] */。
第四章MSP430单片机中断系统
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
第2讲MSP430单片机的GPIO与中断系统
4.2 MSP430单片机中断源
MSP430单片机的中断向量表被安排在0FFFFH~0FF80H空间,具有最大64个中断源。表4.2.1为MSP430单
片机的中断向量表。
中断源 系统复位 系统不可屏蔽中断 用户不可屏蔽中断 比较器B TB0 TB0 看门狗定时器 USCI A0 接收/发送 USCI B0 接收/发送 ADC12_A TA0 TA0 USB_UBM DMA TA1 TA1 P1端口 USCI_A1 接收/发送 USCI_B1 接收/发送 TA2 TA2 P2端口 RTC_A 保留
I/O端口还具有其他片内外设功能,为减少引脚,将这 些外设功能与I/O端口引脚复用来实现。 PxSEL来选择引脚的I/O端口功能与外围模块功能。 PxSEL的配置: Bit = 0: 选择引脚为I/O端口; Bit = 1: 选择引脚为外设功能。
2015/8/7
12
GPIO 寄存器(6/9)
1
3.1 通用IO端口
3.1.1 MSP430端口概述 GPIO (General Purpose I/O),通用输入输出端口。 GPIO基本都是用于芯片与片外器件或设备的交互。 检测数字输入,如键盘或开关信号; 驱动LED,蜂鸣器或LCD等其他指示器; 控制片外器件,较高级的使用可以用它们(通过 程序)模拟很多器件的时序达到控制相应器件的 目的,比如模拟SPI和模拟总线等。
2015/8/7
16
4.1 中断的基本概念
1.中断定义 中断是暂停CPU正在运行的程序,转去执行相应的中断服务程序,完毕后返回被中断 的程序继续运行的现象和技术。 2.中断源 把引起中断的原因或者能够发出中断请求的信号源统称为中断源。中断首先需要由中 断源发出中断请求,并征得系统允许后才会发生。在转去执行中断服务程序前,程序需 保护中断现场;在执行完中断服务程序后,应恢复中断现场。 中断源一般分成两类:外部硬件中断源和内部软件中断源。外部硬件中断源包括可屏蔽 中断和不可屏蔽中断。内部软件中断源产生于单片机内部,主要有以下3种:①由CPU运 行结果产生;②执行中断指令INT3;③使用DEBUG中单步或断点设置引起。
MSP430端口多个引脚中断
[1] 中断服务程序的格式
// P2 中断服务子程序
#pragma vector = PORT2_VECTOR
__interrupt void P2_IRQ(void)
{
switch(P1IFG)
{
case 0x01: // 引脚0
case 0x02: // 引脚1
case 0x04: // 引脚2
case 0x08: // 引脚3
case 0x10: // 引脚4
case 0x20: // 引脚5
case 0x40: // 引脚6
case 0x80: // 引脚7
}
}
中断服务程序最主要的是中断向量的设置
[2] 用P2.0~P2.3 的引脚中断,控制P4.0~P4.3 的LED闪烁
设置P2.0~P2.3 为输入状态
设置P2.0~P2.3 开中断
设置P2.0~P2.3 中断为上升沿中断
开全局中断_EINT();
设置P4.0~P4.3 为输出模式
写P2 中断服务子程序,如果某引脚有中断,则改变相对应的LED状态。
实验注意事项
[1] 在中断服务程序里面不要占用大量的时间,如果有大量的数据需要处理,则可以使
用在中断服务程序中设置标志变量,然后在主程序里面判断标志变量值,然后处理的方法。
[2] 中断服务程序只有在模块中断允许开启和全局中断开启时才有效
[3] 有的多个中断源使用一个中断向量,则需要在进中断的时候用switch~case语句判断
相关寄存器到底是哪个中断源发出的中断请求。
[4] I/O 口里面只有P1和P2口能响应中断,设计硬件电路的时候需要注意。
msp430的中断优先级和中断嵌套
msp430的中断优先级和中断嵌套第一篇:msp430的中断优先级和中断嵌套msp430的中断优先级和中断嵌套MSP430的中断优先级按所在的向量的大小排列,中断向量地址越高优先级就越大,但是默认的MSP430是不能中断嵌套的,要想在执行某一中断时能够响应更高优先级的中断,需要在低优先级的中断程序中手动打开全局中断使能位,因为在进入中断服务子程序时全局中断使能位被清零,即禁止响应其它中断。
msp430的指令中,DINT 和EINT分别指关和开所有中断,也就是包涵P1IE、P2IE、WDTIE、TAIE、TBIE、ADC12IE、串口中断允许的所有中断允许位为“0”和为“1”。
当同时有多个中断来的时候才有优先级的考虑(优先级顺序可查看向量表)有中断响应以后自动关闭总中断,这个时候即使来更高优先级的中断都不会响应。
要中断嵌套的话,就必须在中断中打开总中断。
实现中断嵌套需要注意以下几点:1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT;2)当进入中断程序时,只要不在中断中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行;3)若在中断A中开了总中断,则可以响应后来的中断B(不管B 的优先级比A高还是低),B执行完再继续执行A。
注意:进入中断B 后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动打开;4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用。
5)对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位被自动清除;对于多源中断(多个中断源共用一个中断向量)要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用“EINT();”开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关.特别注意:正是这段说明容易让人上当。
MSP430并行数字输入输出端口中断的使用_6
第6章并行数字输入输出端口中断的使用——按键电路的设计目标通过本章的学习,应掌握以下知识●中断的概念和工作过程●MSP430微控制器芯片支持的中断类型●Embedded Workbench for MSP430开发软件的中断服务程序结构●按键开关●独立式键盘的原理电路●MSP430微控制器芯片的并行输入/输出端口涉及中断的相关寄存器●字节操作运算符●条件语句●多个数据的输入方法引言信号处理是电子线路的一项主要的工作。
处理信号必须具有一个被处理的对象,也就是需要使用某种方式将被处理的信号引入电路。
在数字系统中,键盘是一种常见的信息输入工具。
组成键盘的按键开关具有两种工作状态,因此通过按键开关的断开,或者接通,就能够完成数字量0,或者1,两种取值的输入。
组成电路以后,按键开关的断开和接通可以用高电平和低电平这2种数字电路的工作状态反映出来。
这样将按键电路与MSP430微控制器芯片的输入/输出管脚连接起来,通过读取管脚的状态就能够判断按键开关是否动作,从而接收外部输入的信息。
按键开关组成键盘的电路形式常用的有独立式键盘电路和矩阵式键盘电路两种。
独立式键盘电路无论电路结构,还是它的识别程序结构,都比较简单。
矩阵式键盘电路的优点是对微控制器芯片的输入/输出管脚的占用数量较少。
作为一本入门书籍,本章只涉及独立式键盘电路。
键盘电路的处理时间只占用微控制器工作时间非常少的部分,同时键盘的使用还是随机的,这样让微控制器不断地读取按键的工作状态,显然降低了系统对信号的处理速度。
中断的概念非常适合按键工作状态的识别。
16.1按键开关当需要向微控制器传送命令,或者输入数据时,键盘通常被使用。
键盘是一组按键开关的集合。
像数码管一样,键盘也是应用系统的一个重要组成部分。
按键开关具有2个状态,闭合或者断开。
组成合适的电路,这2个状态反映在电压上就是按键开关分别呈现出高电平,或者低电平。
在数字电路中,这两个电平分别用来表示数据1,或者0。
关于MSP430中断、中断嵌套的一些注意事项
关于MSP430中断、中断嵌套的一些注意
事项
1、MSP430默认的是关闭中断嵌套的,除非在一个
中断程序里面再次开启了总中断EINT();2、当进入中断程序时,只要不在中断中再次开中断,则总中断总是
关闭的,此时如果来中断,不管中断的优先级高还是低,都不执行。
3、如果在中断A中开放了总中断,则可以响应之后
到来的中断B(无论B的优先级是高还是低),B执行完了,再继续执行A。
这里,进入中断B之后,总中断同样也会关闭的。
如果中断B执行的过程中,还需要执行中断C,则此时也要在中断B中开放总中断。
若不需要响应中断,则不用开放总中断。
B执行完以后,跳出中断程序,进入A程序执行的时候,总中断会
自动打开。
4、若在中断之中开放了总中断,那么后来的中断同
时发生多个的话,则会按照优先级的顺序来执行,即
MSP430的中断优先级只有在
多个中断同时到来的时候才会起作用。
5、对于单中断源的中断,
只要响应中断,系统的硬件会自动的清除中断标志位。
对于TA、TB这样的定时器的比较、捕获中断,只要
访问TAIV/TBIV标志位就会被自动清除。
对于多源中断,需要手动清除标志位。
比如:P1、P2的中断,需要手动清楚相应的标志位。
如果在这种中断中使用“_EINT();”,开中断,而在打开中断之前,没有进行原来中断标识位
的清除工作,就会有相同的中断
不断的进行嵌套。
而导致堆栈溢出引起复位,所以在这类中断中,必须先清除标志位,再打开中断开关。
要
不然等着死机吧。
第3讲 MSP430中断系统st_517705504
第3讲MSP430中断系统一、MSP430的中断系统简介 二、MSP430的中断系统实验一、MSP430的中断系统1、中断的概念 2、MSP430的中断源类型 3、MSP430x169的中断向量表、中断优先级 4、可屏蔽中断响应过程 5、端口P1和P2外中断 6、可屏蔽中断程序设计1、中断的概念中断是暂停CPU正在运行的程序, 转去执行相应的中断服务程序,完 毕后返回被中断的程序继续运行的 现象和技术。
CPU执行流程无中断时 有中断时非预料 事件1中断服 务程序1非预料 事件 2中断服 务程序 22、 MSP430的中断源类型两种分类: 1) 按中断源的响应是否受控分类 2)按中断源来自MCU外部引脚还是内部分类1) 按中断源的响应是否受控分类 MSP430的中断源分为三大类型●系统复位中断 system reset(也称不可屏蔽中断,Nonmaskable interrupts) ——不能被总控位GIE和自己的分控位IE位屏蔽的中断●非屏蔽中断(Non)maskable interrupts——不能被总控位GIE屏蔽, 但能被自己的分控位IE位屏蔽的中断●可屏蔽中断maskable interrupts——能被总控位GIE和自己的分控位IE位屏蔽的中断状态寄存器SR (Status Register)15~9 保留 8 7 SCG1 6 SCG0 5 OSCOFF 4 CPUOFF 3 2 1 0VGIENZCGIE : 可屏蔽中断屏蔽位 (General Interrupt Enable Bit) 置位1: 允许所有可屏蔽中断 复位0: 禁止所有可屏蔽中断开/关总中断控制位指令(disable/enable general interrupt bit) 指令格式 _DINT( ); _EINT( ); 执行操作 V Z N C0→ GIE 1→ GIE* * * * #include "in430.h"#include “intrinsics.h”非屏蔽中断的控制机制(non)_maskable interruptindividual enable bitCPU 优先权裁决 CPU 中断响应中断请求 1--enable 0--disable 分控位可屏蔽中断的控制机制(分控位、总控位)maskable interruptindividual enable bitGIECPU 优先权裁决 CPU 中断响应中断请求 1--enable 0--disable 分控位 1--enable 0--disable 总控位2) 按中断源来自MCU外部引脚还是内部分类由外部引脚(如RST/NMI)产生的中断, 为外中断, 由MCU内部模块产生的中断,称内中断RST/NMI P1.0~P1.7外中断内 中断MSP430F169的外中断和内中断外中断: 引脚RST/NMI、P1.0~P1.7、P2.0~P2.7产生的中断 内中断: 由MCU内部模块产生外中断内中断3、MSP430x169中断源、中断标志、中断向量地址 、 中断优先级(中断类型号) (MSP430F169.pdf P11)Interrupt SourcePower up, External Reset Watchdog, Flash memory NMI , Oscillator Fault, Flash memory access violation Timer_B7 Timer_B7 Comparator_A Watchdog timer USART0 receive USART0 transmit I2C transmit/receive/others ADC12 Timer_A3 Timer_A3 I/O port 1(8 flags) USART1 receive USART1 transmit I/O port 2(8 flags) DAC12 DMAInterrupt FlagWDTIFG, KEYV NMIFG,OFIFG,ACCVIFG TBCCR0 CCIFG TBCCR1 to TBCCR6 CCIFGs, TBIFG CAIFG WDTIFG URXIFG0 UTXIFG0 ADC12IFG TACCR0 CCIFG TACCR1 and TACCR2 CCIFGs, TAIFG P1IFG.0~P1IFG.7 URXIFG1 UTXIFG1 P2IFG.0~P2IFG.7 DAC12_0IFG, DAC12_1IFG, DMA0IFG~DMA2IFGSYSTEM InterruptReset (Non)maskable Maskable Maskable Maskable Maskable Maskable Maskable Maskable Maskable Maskable Maskable Maskable Maskable Maskable MaskableAddress0FFFEh 0FFFCh 0FFFAh 0FFF8h 0FFF6h 0FFF4h 0FFF2h 0FFF0h 0FFEEh 0FFECh 0FFEAh 0FFE8h 0FFE6h 0FFE4h 0FFE2h 0FFE0hPriority15(highest) 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0(lowest)作为中断申请的端口P1和P2引脚, 应设置下列相应寄存器:1)设置功能选择寄存器PxSEL.y对应位为0(基本I/O功能)2)设置方向选择寄存器PxDIR.y对应位为0(输入)3)设置PxIES.y选择中断源有效信号类型是上升还是下降沿4)设置PxIE.y打开分中断允许位5)设置GIE=1打开总中断允许位在中断程序中:1)由于端口的8个引脚共用一个中断向量,当有多个引脚做中断源时,需利用PxIFG判断产生中断的中断源引脚2) 在中断子程中应清除PxIFG相应的中断标志位206、 MSP430的可屏蔽中断程序设计1) 编程步骤 2) C语言中断程序举例1)编程步骤编程前应了解可屏蔽硬中断的响应过程, 了解有关的寄存器和引脚与中断响应过程的关系 a. 主程序 做好相关设置: 中断源发出中断申请时CPU能够响应的准备工作 b. 中断程序 处理与中断源有关的关键任务 c. 设置中断向量 根据中断源在中断向量表的相应位置,设置中断向量a. 主程序做好相关设置, 中断源发出中断申请时CPU能够响应的准备工作 开始 主 程 序 流 程 根据情况关闭分中断允 许或总中断允许 有关任务初始化 中断有关初始化 (中断源、边沿选择等) 清分中断标志 打开分中断允许 开总中断允许GIE=1 主程其它工作处理 (可用无限循环延时代替)b. 中断程序处理与中断源有关的关键任务 开始中 断 程 序 流 程C语言中断程序结构__interrupt void intName(void) { ...... ...... ...... } 1. 定义了一个函数名为intName的中断程序 2. 结构上与普通函数的区别是? 使用了关键字__interrupt 使得反汇编中断程序时, 返回的语句是RETI, 而不是RETc. 设置中断向量确定根据中断源确定中断类型号N, 将中断程序的入口地址放在中断向量表0FFE0h+N*2处中断源 上电,外部复位 看门狗复位 FLASH密码错 ... 引脚P1.0~P1.7 ... 引脚P2.0~P2.7中断标志向量地址优先级 中断类型号 15 ... 4 ... 1WDTIFG, KEYV0FFFEh... ... P1IFG.0~P1IFG.7 0FFE8h ... ... P1IFG.0~P1IFG.7 0FFE2h¾ 头文件 io430x16x.h和 msp430x16x.h 用符号表示各中断源在中断向量表的偏移地址// Interrupt Vectors (offset from 0xFFE0) #define DACDMA_VECTOR (0 * 2u) /* 0xFFE0 DAC/DMA */ #define PORT2_VECTOR (1 * 2u) /* 0xFFE2 Port 2 */ #define USART1TX_VECTOR (2 * 2u) /* 0xFFE4 USART 1 Transmit */ #define USART1RX_VECTOR (3 * 2u) /* 0xFFE6 USART 1 Receive */ #define PORT1_VECTOR (4 * 2u) /* 0xFFE8 Port 1 */ #define TIMERA1_VECTOR (5 * 2u) /* 0xFFEA Timer A CC1‐2, TA */ #define TIMERA0_VECTOR (6 * 2u) /* 0xFFEC Timer A CC0 */ #define ADC12_VECTOR (7 * 2u) /* 0xFFEE ADC */ #define USART0TX_VECTOR (8 * 2u) /* 0xFFF0 USART 0 Transmit */ #define USART0RX_VECTOR (9 * 2u) /* 0xFFF2 USART 0 Receive */ #define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */ #define COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6 Comparator A */ #define TIMERB1_VECTOR (12 * 2u) /* 0xFFF8 Timer B CC1‐6, TB */ #define TIMERB0_VECTOR (13 * 2u) /* 0xFFFA Timer B CC0 */ #define NMI_VECTOR (14 * 2u) /* 0xFFFC Non‐maskable */ #define RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priority] */C语言程序设置中断向量方法在中断程序前使用#pragma vector=偏址 语句, 将中断程序的入口地址放入到FFE0+偏址的中断向量表中 #pragma vector=N*2 //使用中断类型号计算偏址 __interrupt void intName(void) { ...... } #pragma vector=PORT1_VECTOR //使用符号表示的中断偏址 __interrupt void intName(void) { ...... }1. 主程序可 屏 蔽 中 断 程 序 设 计开始 据情况关闭分中断允许 或总中断允许 有关任务初始化 中断有关初始化 (中断源、边沿选择等) 清分中断标志 打开分中断允许 开总中断允许GIE=1 主程其它工作处理 (可用无限循环延时代替)开始3. 设置中断向量 根据中断源在 中断向量表相应位置 设置中断向量例: 中断编程举例 (以P1.0上的中断为例)用C语言编写程序, 以中断方式响应P1.0上的下降沿, 每来一个下降沿, 使 P3.6 的输出翻转一次 MSP430F169 P3.6P1.0中断请求C语言: 开/关总中断控制位函数(disable/enable general interrupt bit)函数名称__disable_interrupt( ) __ensable_interrupt( )功能0→ GIE 1→ GIE包含在intrinsics.h intrinsics.hintrinsics.h 文件中:声明了一些包含在IAR 编译器的内部函数,方便用户使用 如: __intrinsic void __enable_interrupt(void); __intrinsic void __disable_interrupt(void);可通过查看EW430安装目录下\430\doc\Help430Compiler.chm 了解这些内部函数实现的功能利用安装目录\430\doc\Help430Compiler.chm 了解这些内部函数实现的功能用C语言编写中断程序方法11. 包含intrinsics.h文件中 2. 使用__disable_interrupt( ) 和__enable_interrupt( ) #include "io430.h" #include "intrinsics.h" int main( void ) { //Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; __disable_interrupt(); //关总中断控制(非必要) …… //主程序初始化准备工作 …… __enable_interrupt(); //开总中断控制 while(1){ }; //主程序循环 } #pragma vector=数字或符号表示的偏址 //中断向量设置 __interrupt void port_int(void) //中断子程 { …… }头文件 in430.h(注意不是io430.h)…… #include "intrinsics.h " …… /*Deprecated, please use "__disable_interrupt" instead. */ #define _DINT( ) __disable_interrupt() /* Deprecated, please use "__enable_interrupt" instead. */ #define _EINT( ) __enable_interrupt() /* Deprecated, please use "__no_operation" instead. */ #define _NOP( ) __no_operation() ......用C语言编写中断程序方法21. 包含in430.h文件 2. 使用DINT( ) 和EINT ( ) #include "io430.h" #include "in430.h" int main( void ) { //Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; _DINT( ); //关总中断控制(非必要) …… //主程序初始化准备工作 …… _EINT( ); //开总中断控制 while(1){ }; //主程序循环 } #pragma vector=数字或符号表示的偏址//中断向量设置 __interrupt void port_int(void) //中断子程 { …… }头文件io430.h__no_init volatile union { unsigned char P1IFG; struct { unsigned char P1IFG_0 : 1 ; unsigned char P1IFG_1 : 1 ; unsigned char P1IFG_2 : 1 ; unsigned char P1IFG_3 : 1 ; unsigned char P1IFG_4 : 1 ; unsigned char P1IFG_5 : 1 ; unsigned char P1IFG_6 : 1 ; unsigned char P1IFG_7 : 1 ; } P1IFG_bit; } @ 0x0023; __no_init volatile union { unsigned char P1IES; struct {unsigned char P1IES_0 : 1 ; unsigned char P1IES_1 : 1 ; unsigned char P1IES_2 : 1 ; unsigned char P1IES_3 : 1 ; unsigned char P1IES_4 : 1 ; unsigned char P1IES_5 : 1 ; unsigned char P1IES_6 : 1 ; unsigned char P1IES_7 : 1 ; } P1IES_bit; } @ 0x0024;可用字节或位域方式对PxIFG和PxIE进行操作P1IFG_bit.P1IFG_0 = 0; P1IE_bit.P1IE_0 = 1; //清P1.0中断标志 //打开P1.0中断允许#include "io430.h" #include "in430.h" int main( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 _DINT(); //禁止可屏蔽中断 GIE=0 P1IE_bit.P1IE_0=0; // 关闭P1.0中断允许 P3SEL_bit.P3SEL_6=0; //设置P3.6为基本I/O功能 P3DIR_bit.P3DIR_6=1; //设置P3.6为输出 P3OUT_bit.P3OUT_6=0; //置P3.6输出初值为0 P1SEL_bit.P1SEL_0=0; //置P1.0作为基本I/O端口 P1DIR_bit.P1DIR_0=0; //置P1.0为输入 P1IES_bit.P1IES_0=1; //置P1.0下降沿作中断源 P1IFG_bit.P1IFG_0=0; //清P1.0中断标志 P1IE_bit.P1IE_0=1; //打开P1.0中断允许 _EINT(); //允许可屏蔽中断 GIE=1 while(1) { }; //主程循环 } #pragma vector=PORT1_VECTOR //置P1中断向量 __interrupt void port_int(void) //中断子程 { if (P1IFG_bit.P1IFG_0==1) //判断是否是P1IFG.0中断标志 { P3OUT_bit.P3OUT_6=~P3OUT_bit.P3OUT_6; //对P3.6取反 P1IFG_bit.P1IFG_0=0; //清P1.0中断标志 } }在EW430下 反汇编C程序代码: P1IFG_bit.P1IFG_0=0; → BIC.b #0x1, &P1IFG P1IE_bit.P1IE_0=1; → BIS.b #0x1, &P1IE _EINT(); → EINT在EW430下反汇编C中断程序代码:子程结尾为 RETI注意:● 若有多个中断同时请求, CPU先响应优先级最高的中断请求 ● 当中断源产生时, MSP430内部对应有一个标志被置位 中断程序之后, 应确保该标志的值已清零, 否则被当成又一次的中断申请 ● 对于单一中断标志的中断源请求, CPU会自动清零该中断标志 ● 对于有多个中断标志的中断源请求, 用户在中断子程用这些标志判断产生的具体子中断源, 中断标志的清零由用户在使用完后编程清零中断源 定时器A P1的8个引脚 ... P2的8个引脚 中断标志 TACCR1 to TACCR2 CCIFGs, TAIFG (3) P1IFG.0~P1IFG.7 (8) ... P1IFG.0~P1IFG.7 (8) 向量地址 优先级,类型号 0FFEAh 5 0FFE8h ... 0FFE2h 4 ... 1以中断方式响应P1端口上8个按键(上升沿)。
MSP430串口使用总结
CHAR:UxCTL Bit 4 Character length,7-bit or 8-bit character length 0:7-bit data 1:8-bit data SWRST:UxCTL Bit 0 Software reset enable 0:Disabled,USART reset released for operation 1:Eable,USART logic held in reset state } 4、3 UxTCTL(UTCTLx),USART Transmit Control Register { SSELx:Bits 5-4 Source select,These bits select the BRCLK source clock 00:UCLKI 01:ACLK 10:SMCLK 11:SMCLK } UxBR0,USART Baud Rate Control Register 0,低 8 位 UxBR1,USART Baud Rate Control Register 1,高 8 位 UxMCTL,USART Modulation Control Register UxMCTL Bits 7-0:Modulation bits, these bits select the modulation for BRCLK IFG1,Interrupt Flag Register 1 UTXIFG0: IFG1 Bit 7,USART0 transmit interrupt flag, UTXIFGO is set when UOTXBUF is 0:No interrupt pending//不挂起中断 1:Interrupt pending//等待中断处理 URXIFG0:IFG1 Bit 6 ,USART0 receive interrupt flag,URXIFG0 is set when U0RXBUF has received. 0:No interrupt pending 1:Interrupt pending 4、7 IE1,Interrupt Enable Register 1 UTXIE0 Bit 7,USART0 transmit interrupt enable.This bit enables the UTXIFG0 interrupt 0:Interrupt not enable 1:Interrupt enable URXIE0 Bit 6 USART0 receive interrupt enable.This bit enables the URXIFG0 interrupt 0:Interrupt not enable 1:Interrupt enable
第2讲MSP430单片机的GPIO与中断系统
每个PxIE位使能的中断请求都与相应的PxIFG中断标志 相关联,可通过写PxOUT和PxDIR来设置PxIFG。
PxIE的配置: Bit = 1: 允许中断; Bit = 0: 禁止中断。
17
4.1 中断的基本概念
3.中断向量表 中断向量是指中断服务程序的入口地址,每个中断向量被分配给 4个连续的字节单元, 两个高字节单元存放入口的段地址CS,两个低字节单元存放入口的偏移量IP。为了让CPU 方便地查找到对应的中断向量,就需要在内存中建立一张查询表,即中断向量表。 4.中断优先级 凡事都有轻重缓急之分,不同的中断请求表示不同的中断事件,因此,CPU对不同中
PxDS 输出驱动强度寄存器
PxDS寄存器的每个位,设置引脚的输出强度为高驱动 强度或低驱动强度。
默认值为低驱动强度。 PxDS的配置: Bit = 0: 低驱动强度; Bit = 1: 高驱动强度。
2015/8/7
13
GPIO 寄存器(7/9)
PxIE 中断使能寄存器(仅中断端口P1和P2)
1
3.1 通用IO端口
3.1.1 MSP430端口概述 GPIO (General Purpose I/O),通用输入输出端口。 GPIO基本都是用于芯片与片外器件或设备的交互。 检测数字输入,如键盘或开关信号; 驱动LED,蜂鸣器或LCD等其他指示器; 控制片外器件,较高级的使用可以用它们(通过 程序)模拟很多器件的时序达到控制相应器件的 目的,比如模拟SPI和模拟总线等。
引脚下拉 V脚选择上拉 上拉电阻简单来说就是把电平拉高, 通常用 4.7-10K的电阻接到Vcc电源。 Bit = 0: 引脚选择下拉; 下拉电阻则是把电平拉低,电阻接到GND地线上。
msp430中断(不可屏蔽中断NMI)
中断系统中断的优先级是固定的。
中断优先级的是以模块的在链接所处的位置决定的。
越靠近CPU/NMIRS,模块的优先级越高。
中断优先级决定了,当系统有多个中断等待处理时,先处理哪一个中断。
有三种中断类型:系统中断不可屏蔽中断可屏蔽中断不可屏蔽中断(NMI)不可屏蔽中断不能被总中断使能位(GIE)所屏蔽,而由单独的中断使能位(NMIIE, ACCVIE,OFIE)来控制的。
当接收到不可屏蔽中断中断时,所有的不可屏蔽中断使能位会被自动复位。
程序从不可屏蔽中断的中断向量0FFFCH存储的地址开始运行。
用户软件必须设置所需的不可屏蔽的中断使能位,以便不可屏蔽中断能够再次响应。
不可屏蔽的中断源有以下三种:1. 当配置为NMI模式时,RST/NMI引脚的一个边沿2. 振荡器失效3. 错误使用FLASHRST/NMI引脚上电时,RST/NMI引脚配置为复位模式。
在看门狗控制寄存器WDTCTL中选择RST/NMI引脚的功能。
如果RST/NMI引脚被设置为复位功能,RST/NMI引脚处于低电平时CPU将一直保持复位状态。
当转为高电平时,CPU从存储在复位向量OFFFEH中的地址开始运行,RSTIFG将被置位。
如果RST/NMI引脚被用户软件配置为不可屏蔽中断时,如果NMIIE位被置位时,由WDTNMIES选择的信号边沿到来产生NMI中断。
RST/NMI的标志位NMIIFG将会被置1。
注释1:RST/NMI保持低电平在配置为NMI模式时,产生一个NMI事件的信号不会拉低RST/NMI引脚的电平。
如果其他的信号源产生一个PUC时,NMI信号是低电平,设备将处于复位状态,因为一个PUC 信号使RST/NMI引脚变为复位模式。
注释2:修改WDTNMIES当选择了NMI模式,WDTNMIES位改变了,NMI是否产生将依据于实际的RST/NMI 引脚的电平。
在系统被设置为NMI模式前,如果NMI的边沿选择位改变早于选择NMI模式,不产生NMI。
单片机MSP430与PC机串口通讯设计说明
单片机MSP430与PC机串口通讯设计摘要在多机通信的分布式控制系统中,通过PC机的串口与多台单片机的通信是最方便的。
在这样的分布式控制系统中,单片机与微机之间的多路通信是整个系统的关键。
基于MSP430系列单片机自身优越的性能以与其超低功耗的特点,利用MSP430F149的USART可以实现这种分布式多机通信功能。
在解决了与PC串口或其他带有串口的终端相连所需要的串口电平和逻辑关系的转变之后,选用MSP430F149的异步模式UART,用C语言完成下位机(PC机)接收和发送数据程序,借助VC++6.0开发平台并利用PComm软件包完成上位机(单片机)的通信程序。
文章介绍了美国TI公司新一代16位Flash型MSP430F149系列单片机的结构、特性和功能。
详细介绍了如何利用VC十+6.0进行串口通讯程序的编制,重点介绍了如何利用实现异步通讯的方法。
关键词:MSP430系列单片机,多路通信,控制系统,异步模式,PcommDesign of the Serial Communicationbetween MSP430F149 and PCABSTRACTIn the controlled system of distributing type in which many computers are communicating, by way of the PC string contact with many single chip machines to correspond is the most convenient.In this controlled system of distributing type, the various communication between single chip machines and microcomputer is the whole key. According to the low achievement consume and perfect function of MSP430,The USART that used in system of MSP430F149 can carry out this kind of function of singular to group.It is required to solve the voltage conversionand the change of logic relation, when the MSP430 connects with the PC string or other terminals which take with strings.And then, we can choose the asynchronous module (UART) of MSP430F149 to complete the MSP430F149’s main processor in language of C and write out the PC’s processor asking for help from The VC++6.0 and The Pcomm.This paper introduces the structure, principle and feature of new generation of 16 bit&Flash-type microcontrollerwhich belongs to the Texas Instruments MSP430F149 series. At the same time, it alsointroduces how to carry out the method of theserial communication between PC and MSP430F149. The paper presents how to use VC++6.0 design serial port communicationprogram,especially calling Pcomm functions to control serial port to transfer data.KEY WORDS:MSP430F149single-chip computer, serialcommunication, control system,UART,PComm目录摘要1ABSTRACT2目录3前言4第一章串口通讯的系统组成与原理5§1.1 系统组成与通讯原理5§ 1.1.1 系统构成5§ 1.1.2 通信原理与协议6第二章硬件电路设计11§2.1 接口电平电路设计11§2.1.1 RS-232接口电路设计11§2.2 单片机电路设计14§2.2.1 单片机电路设计图14第三章软件设计16§3.1 功能描述16§3.1.1 上位机和下位机实现的功能16一、功能描述:16§3.2 程序设计16§3.2.1 下位机程序设计16§3.2.2 上位机(PC机)程序设计26结论31参考文献33前言在工业控制领域,由多单片机构成的系统很多,如大规模测控系统、大型车辆控制系统、机器人控制系统等。