我的MSP430讲义
- 格式:doc
- 大小:1.62 MB
- 文档页数:19
MSP430的编程规则1.中断1)中断源:MSP430的中断源由P1和P2的16个管脚提供。
2)中断设置和中断允许:打开PxIE:打开或关闭中断源寄存器,默认情况为关闭,其中x为1或者2,表示P1口或者P2口,有些msp430有多个中断源,则x视情况而定,每个口有8个中断源,允许CPU接收某个中断响应,给相应位赋值1,关闭赋值0,如P2的第三脚(P2.2)接受中断,其他叫不允许,则应P2IE |=BIT2;。
中断响应设置PxIES:设置CPU于中断下降沿来临时响应中断给PxIES赋值1,上升沿赋值0.中断总开关:打开全局中断。
有些430已经定义了一个打开全局中断的宏定义模块(有些430没有,有没有需要查阅头文件确定)_EINT();中断标志PxIFG:当有中断信号请求是,中断标志寄存器响应位自动置1,否则为0.当该位为1时,CPU响应中断,转去处理中断程序。
中断向量:中断向量代表着中断的入口地址,中断以后要计算机干什么,程序必须放在中断相应的位置,该中断发生以后,计算机自动转入该处执行该中断要完成的工作,这段程序有个入口,这个入口地址就是中断向量要表示的内容,如51单片机0003和0013h一样,这个地址在汇编语言中必须清楚,编写程序是,中断程序开始语句一定指定的区域,否则无法执行中断。
在msp430单片机中,中断也有入口地址,但在C语言编程中一般不直接引用地址,而是用中断向量表示,执行某一终断,程序就寻找该中断的中断向量,如430G2553,有P1中断和P2中断,他们的地址分别是0x0FFE4和0xFFE6,在汇编语言中,中断程序一定要放在这两个地址的后面,如果放不下,就要跳转。
但C语言编程时并不用终端入口地址,而是用中断向量,430G2553P1P2对应的中断向量为PORT1_VECTOR和PORT2_VECTOR,而对430f6638单片机,P1P2P3和P4都有中断功能,他们对应的中断向量依次为PORT1_VECTOR 、PORT2_VECTOR 、PORT3_VECTOR 和PORT4_VECTOR。
看门狗的中断向量为 WDT_VECTOR 。
3)中断函数:MSP430的中断依靠中断函数来完成,中断函数按下列格式编写:#pragma vector=中断相量 //必须使用给定的中断向量,不能自定,可查阅头文件,一般按上面讲过的选定__interrupt void name(void) //注意:开头两个下划杠;void后的名字可以自己选定{用户中断程序;清除中断标志位;}例如看门狗中断:#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){_BIC_SR_IRQ(LPM3_bits); //中断后清除低功耗模式3的控制位,结束低功耗模式3}P1口中断函数#pragma vector=PORT1_VECTOR__interrupt void zhansan(void){用户中断程序即中断后要计算机干什么;干完后要清除中断标志位;}P2口中断函数#pragma vector=PORT2_VECTOR__interrupt void wanger(void){用户中断程序即中断后要计算机干什么;干完后要清除中断标志位;}如果有其他中断源,例如MSP430F6638,P3,P4也是中断源,则要使用这些中断P3口中断函数#pragma vector=PORT3_VECTOR__interrupt void wanger(void){用户中断程序即中断后要计算机干什么;干完后要清除中断标志位;}P4口中断函数#pragma vector=PORT4_VECTOR__interrupt void wanger(void){用户中断程序即中断后要计算机干什么;干完后要清除中断标志位;}返回的都是空值,所以用void.蓝色为关键字,不可少,另外中断相量不能随意编写,要用MSP430给出的中断向量描述中断,是固定的组合和固定的作用,其编写和作用可以查阅头文件获得,头文件的查法在编译界面左侧的File下的hanshu-Debug下的分之中,点击main.c左侧的+号,选择查阅msp430fxx.h,参看下图: 2. MSP430G2553时钟及时钟中断#include "msp430G2553.h"//************主函数***************************void main(){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBCSCTL1 = CALBC1_1MHZ; //时钟为1M,课设8M、12M和16MDCOCTL = CALDCO_1MHZ; //同上(并同时设置)BCSCTL2 |=SELM_1+DIVM_3;//SELM_1时钟源选择,0、1为DCOCLK,//2为XT2CLK/LFXTCLK,3为LFXTCLK//DIVM_1,为所选的时钟分频,0不分频,1为2分频,2为4分频,3为8分频////////////P1DIR|=0x41; //P1.6和P1.0为输出,控制LEDP1OUT |=0x01;P1OUT &=~0x40;//////////////////TACTL |= TASSEL_2+ID_3+MC_1;//TASSEL_x计数器时钟源选择,x=0,外时钟TACLK,1选ACLK,2选SMCLK,3选外部时钟// ID_x是分频选择,x=0不分频,1是2分频,2是4分频,3是8分频后(125K)// MC_x是计数模式,x=0,停止,1是up到CCR0的值,2是连续到满0xffff,//3增减计数,先增到CCR0的值,再减到0TACCR0 =25000; //计到2500,约20msTACCTL0 |= CCIE; // CCR0 interrupt enabled_BIS_SR(GIE); //开总中断while(1);}#pragma vector=TIMER0_A0_VECTOR__interrupt void Timer_A(void){//TACCTL0&=~ CCIE; //关中断static int cc=0;cc+=1;if(cc==20) //1s=1000ms=20*50 定时{P1OUT^=0x41; //P1.6 LED取反cc=0;}}中断结束关闭中断用_DINT();中断程序的编写一种是打开中断设置,直接判断,做出中断处理,完成设计。
另一种是定义中断函数,由函数来完成部分中断响应。
例如用msp430G2553芯片的P1口的管脚P1.3做按钮开关,每按一下,控制和P1.0和P1.6两个管脚相连的两个共阴极二极管,完成按一下,红灯亮,绿灯灭,再按一下红灯灭,绿灯亮,这样一个功能。
1)直接打开中断设置,响应中断,完成设计。
#include <msp430g2553.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // 停止看门狗_EINT();//开总中断P1REN|=BIT3;//设置内部电阻P1OUT|=BIT3;//设置内部上拉P1IE |=BIT3;//允许P1.3接收中断P1IES |=BIT3;//P1.3下降沿触发中断P1DIR |=BIT0+BIT6;//将P1.0和P1.6设为输出,其余位不变LPM0;while(1);}#pragma vector=PORT1_VECTOR__interrupt void port1_vector(void){if((P1IFG&BIT3)==BIT3)//检测中断标志位{P1OUT ^=BIT0+BIT6;//端口取反}P1IFG=0X00;//标志位清零}2)定义中断函数,完成设计功能#include <msp430g2553.h>void interrupt_us(void);//声明中断函数void main(void){WDTCTL = WDTPW + WDTHOLD; // 停止看门狗interrupt_us(); 调用中断函数LPM0; //进入低功耗模式0节省能源while(1);//等待中断}void interrupt_us(void) //设置中断函数{P1REN|=BIT3;//设置内部电阻(可以不要)P1OUT|=BIT3;//设置内部上拉(可以不要)P1IE |=BIT3;//中断允许打开P1IES |=BIT3;//管脚P1.3设置为下降沿触发时响应中断(~BITx上升沿)P1DIR |=BIT0+BIT6;//设为输出P1OUT|=BIT0;//P1.0为高电平,P1口其余位不变P1OUT&=~BIT6;//P1.6设置为低电平,其余位不变(这两句为一高一低,为下面轮流闪烁预设状态,如同为高或低,同时亮灭)_EINT();//开总中断}#pragma vector=PORT1_VECTOR //中断响应,就是中断事件发生后要干的工作__interrupt void port1_vector(void){if((P1IFG&BIT3)==BIT3) //检测中断标志位{P1OUT ^=BIT0+BIT6;//端口取反这句语句实现两个灯按以下一亮一灭}P1IFG&=~BIT3;//标志位清零中断结束是清除中断标志,为下一次响应中断让路}2.看门狗寄存器MSP看门狗寄存器WDTCTL ,是一个16位寄存器,高八位名称WDTPW,读的时候,值为69h,写的时候必须是5A;所以关看门狗时WDTPW=5A00h,其他设置状态都会导致系统复位。
msp430定义WDTPW=5A00;低八位见下面低八位不同状态被预先固定为不同的名称。
低八位从高到低每一位的名称依次为看门狗低八位: bit7, bit6, bit5, bit4, bit3, bit2 , bit1 bit0 各位对应的编程:名WDTHOLD, WDTNMIES,WDTNMI,WDTTMSEL, WDTCNTCL, WDTSSEL, 低两位为WDTISx WDTHOLD即D7位(Bit7):0为开启看门狗;1为关闭看门狗;用WDTHOLD给该位设置1,即WDTHOLD=xxxxxxxx10000000,就是80,所以WDTHOLD=0080h这样关闭看门狗就变成了设置寄存器的数值: WDTCTL=5A00h+0080h=0101 1010 0000 0000+0000 0000 1000 0000=0101 1010 1000 0000,一般写成WDTCTL=WDTPW+WDTHOLD=5A00+0080=0101 1010 1000 0000这两个语句都确定了关闭看门狗,是等效的。