MSP430学习总结前言这次主要看的资料是MSP430F425型号的,与MSP430F169有点区别,但由于MSP430单片机采用模块化结构,在不同型号的单片机中,同一种模块的使用方法和寄存器都是相同的。
下面会对它们的功能和区别加以说明。
一、MSP430单片机的特点1、我觉得MSP430最大的特点就是超低功耗,430之所以能够在低功耗的条件下运行,主要是由于引入了“时钟系统”的概念,和采用模块化结构。
让CPU可以间歇性的工作,节省功耗。
在MSP430单片机中,通过时钟配置可以产生3种时钟:MCLK:主时钟,MCLK是专门为CPU运行提供的时钟,MCLK配置的越高,CPU执行的速度就越快。
一旦关闭MCLKE,CPU 就停止工作,所以在超低功耗中通过间接开启MCLK的方式降低功耗。
SMCLK:子系统时钟,为单片机内部某些高速设备提供时钟,并且SMCLK是独立于MCLK的,关闭MCLK让CPU停止工作,子系统SMCLK开启,仍然可以使外设继续工作。
ACLK:活动时钟;ACLK一般是由32.768KHz晶振直接产生的低频时钟,在单片机运行时一般不关闭,和定时器使用间接唤醒CPU。
时钟系统对于3种时钟不同程度的关闭,就可以进入不同的低功耗模式(低功耗在下面讨论)。
2、MSP430单片机采用模块化结构,每一种模块都具有独立而完整的结构,这样就可以单独开启或者关闭某些模块,只需要激活某些使用的模块,以节省电力。
3、MSP430单片机的内核是16位RISC处理器,其运算能力和速度都具有一定的优势。
MSP430还有其它的一些优势在这里就不一一列举了。
二、MSP430单片机的内部资源1、I/O口寄存器PxIN: Px口输入寄存器PxOUT: Px口输出寄存器PxDIR : Px口方向寄存器 0=输入 1=输出PxSET: Px口第二功能选择寄存器 0=普通I/O 1=第二功能使用总结:以上的4个寄存器是所有I/O都具有的,在使用I/O 口之前首先要设置PxDIR,对于要使用第二功能的还要设置PxSET下面介绍的是430中P1,P2口引发中断需要设置的寄存器(MSP430单片机只有P1、P2口能引发中断)PxIE : Px口中断允许寄存器 0=不允许 1=允许PxIES : Px口中断沿选择寄存器 0=上升沿 1=下降沿PxIFG : Px口中断标志位寄存器 0=中断条件不成立1=中断条件曾经成立(说明:无论中断是否被允许,也不论是否正在执行中断服务程序,只要I/O满足中断条件,PxIFG的相应位就会置1,只能通过软件清除,这个可以用来判断哪一位I/O发生了中断,也不会漏掉每一次中断。
使用总结:在使用I/O中断之前,需要将I/O设置成输入状态,并允许I/O的中断。
在通过PxSET设置触发方式。
程序框架:#include<msp430x16x.h>void main(void) // 主函数{WDTCTL=WDTPW+WDTHOLD; //停止看门狗P1DIR &=~(BIT0+BIT1+BIT2); //P1.0、P1.1、P1.2设置为输入P1IES |=BIT0+BIT1+BIT2; // P1.0、P1.1、P1.2设置为下降沿中断P1IE |=BIT0+BIT1+BIT2; //允许 P1.0、P1.1、P1.2中断_EINT(); //允许总中断while(1){;}}#pragma vector=P0RT1_VECTOR // P1口中断源__interrupt void P1_ISR(void) // 声明一个中断服务程序,P1_ISR(){If(P1IFG&BIT0) //判断P1.0中断标志{………..………. //这里写P1.0的中断处理程序}If(P1IFG&BIT1) //判断P1.1中断标志{………..………. //这里写P1.1的中断处理程序}If(P1IFG&BIT0) //判断P1.2中断标志{………..………. //这里写P1.2的中断处理程序}P1IFG=0; // 清除P1所有中断标志位}2、低功耗模式MSP430系列单片机具有5种不同深度的低功耗休眠模式。
在空闲时,通过不同程度的休眠,将内部各个模块尽可能的被关闭,从而降低功耗。
低功耗模式0(LMP0):在此模式下,只有MCLK时钟被禁止,结果是关闭CPU,SMCLK和ACLK仍然有效,且SMCLK和ACLK之间的倍频关系仍然成立,相应的模块也会继续工作,CPU关闭后程序不在运行,直到被中断唤醒或者复位,所以进入任何一个低功耗模式之前必须设置好CPU的中断条件,等待被唤醒,否则程序将永远停止。
低功耗模式1(LMP1):在此模式下,不仅MCLK时钟被禁止,倍频环路也被关闭,结果CPU被关闭,ACLK仍有效,但是SMCLK和ACLK之间的倍频关系不在成立,SMCLK只能作为一个粗略的时钟来用。
低功耗模式2(LMP2):在此模式下,不仅MCLK时钟被禁止,DC发生器(数字时钟)也被关闭,仅打开倍频环路和ACLK,该模式一般不用,建议用更低功耗LMP3代替。
低功耗模式3(LMP3):在此模式下,只有ACLK打开,MCLK和SMCLK都被停止,该模式下功耗仅有1uA。
低功耗模式4(LMP4):在此模式下,ACLK,MCLK和SMCLK都被停止,单片机内部所有的模块都将停止工作,只能依靠外部中断唤醒CPU,该模式下功耗仅有0.1uA。
与低功耗相关的内部函数:__low_power_mode_0();或LPM0;// 进入低功耗模式0__low_power_mode_1();或LPM1;// 进入低功耗模式1__low_power_mode_2();或LPM2;// 进入低功耗模式2__low_power_mode_3();或LPM3;// 进入低功耗模式3__low_power_mode_off_on_exit(); // 退出时唤醒CPU3、Basic Timer基础定时器(MSP430F425有,而MSP430F169没有)Basic Timer基础定时器总共有5个控制位1、BTDIV:预分频选择 0=无预分频 1=256分频(位于BTCTL 寄存器)2、BTSSEL:时钟源选择 0=ACLK 1=SMCLK(位于BTCTL 寄存器)BTDIV=1时,该位无效,时钟选择为ACLK/256 3、BTHOLD:Basic Timer 停止 0=正常运行 1=停止运行(位于BTCTL寄存器)4、BTIPx:Basic Timer 中断频率选择(位于BTCTL寄存器)5、BTFREQx:设置Basic Timer 为LCD提供的刷新频率(位于BTCTL寄存器)Basic Timer中断1、BTIE:Basic Timer 中断允许位 0=禁止 1=允许(位于IE2寄存器)2、BTIFG:Basic Timer 中断标志位 0=无中断发生 1=中断发生(位于IE2寄存器)下面以一个程序框图来说明Basic Timer和低功耗模式/********************************************************** 要求是P1.5接有按键(按下为低电平),P2.0输出至LED, 当按键按下时LED亮,按键松开LED灭。
传统的程序可能就是CPU一直对I/O口扫描,这样耗电很大,看下面的程序利用Basic Timer和低功耗模式来做*****************************************************/ #include<msp430x16x.h>void main(void) // 主函数{WDTCTL=WDTPW+WDTHOLD; //停止看门狗P1DIR &=~BIT5; //P1.5设置为输入P2DIR |= BIT0; //P2.0设置为输出BTCTL=BT_ADLY_8 ; // Basic Timer时钟选为ACLK,设为8毫秒中断一次IE2 |=BTIE; //允许Basic Timer中断_EINT(); //允许总中断while(1){LMP3;//进入低功耗模式3,等待被唤醒/* If((P1IN&BIT5)==0)P2OUT |=BIT0; //按键按下,点亮LEDelseP2OUT &=~BIT0; //按键松开,关闭LED */}}#pragma vector=BASICTIMER_VECTOR // Basic Timer 中断源__interrupt void BT_ISR(void) //声明一个中断服务程序,BT_ISR(),8毫秒中断一次{If((P1IN&BIT5)==0)P2OUT |=BIT0; //按键按下,点亮LEDelseP2OUT &=~BIT0; //按键松开,关闭LED// __low_power_mode_off_on_exit(); // 退出时唤醒CPU} //退出中断保持休眠状态4、16位定时器Timer _A在MSP430单片机中都有一个16位定时器Timer _A(简称TA)用于精确定时、计数,在普通的定时/计数上还曾加了3路捕获/比较模块,能够在CPU不干预的情况下自动根据触发条件定时器计数值,或自动产生各种输出波形(如PWM调制、单稳态脉冲)Timer _A定时器分为两个部分:主计数器和比较/捕获模块。
主计数器负责定时,计数。
计数值(TAR寄存器的值)被送到各个比较/捕获模块中,它们无需CPU干预的情况下根据触发条件与计数器的值自动完成某些测量和输出功能,如PWM调制,测量脉宽、周期等应用。
Timer _A定时器中的主计数器相关的控制位都位于TACTL寄存器中,主计数器的计数值存放在TAR寄存器中。
每个比较/捕获模块还有一个独立的控制寄存器TACCTLx,以及一个比较/捕获值寄存器TACCRx(x=0、1、2),在一般定时应用中,TACCRx可以提供额外的定时中断触发条件,在PWM输出模式下,TACCRx用于设定周期与占空比,在捕获模式下,TACCRx存放捕获结果。
主计数器相关控制位TASSELx:Timer _A计数器的时钟源选择(位于TACTL寄存器)TASSEL_0:外部管脚 TASSEL_1:ACLKTASSEL_2: SMCLK TASSEL_3:外部管脚(取反)IDx:Timer _A计数器的预分频处理(位于TACTL寄存器)ID_0:无分频 ID_1:2分频ID _2:4分频 ID _3:8分频TACLR:Timer _A计数器清零控制位(位于TACTL寄存器)0=不清零 1=清零MCx:Timer _A计数器的计数模式(位于TACTL寄存器)MC_0:停止 MC_1:曾计数MC_2:连续曾计数 MC_3:曾-减计数(说明:曾计数就是每个时钟周期值TAR加1,当TAR值超过TACCR0寄存器的值时会自动清零,并且不存在初值装载问题,当TA中断被允许的时候,回引发中断;连续曾计数就是TAR加1一直加到0xFFFF 后清零,连续曾计数一般在捕获模式下用的较多,曾-减计数是TAR 从0开始曾加到TACCR0,然后自动切换到递减模式,减到0后又恢复递增,从1减到0时产生中断)TAIFG:Timer _A计数器溢出标志(中断标志)(位于TACTL寄存器) 0=未发生溢出 1=曾发生溢出Timer _A定时器的捕获模块在捕获模式下,用某个指定的管脚(TAx管脚)的输入电平跳变来触发捕获电路;将此刻主计数器的值自动的保存到相应的捕获值寄存器中,此过程无需CPU干预,可用于测频率、周期,占空比等CAP:Timer _A比较/捕获模块工作模式选择(位于TACCTL0/1/2寄存器)0=比较模式 1=捕获模式CCISx:Timer _A捕获模块的捕获源选择(位于TACCTL0/1/2寄存器)CCIS_0:CCIxA管脚 CCIS_1:CCIxB管脚CCIS_2:GND CCIS_3:VCCCMx: Timer _A捕获模块的捕获触发沿选择(位于TACCTL0/1/2寄存器)CM_0:禁止捕获 CM_1:上升沿CM_2:下降沿 CM_3:上升沿活下降沿COV:Timer _A捕获模块捕获溢出标志(位于TACCTL0/1/2寄存器) 0=未发生溢出 1=发生了溢出SCS:Timer _A捕获模块的同步捕获控制位(位于TACCTL0/1/2寄存器)0=异步捕获 1=同步捕获/********************************************************** 要求捕获3路信号,P1.0输入的方波上升沿捕获,P1.2输入的方波下降沿捕获,P2.0输入的方波上下沿捕获,主计数器用ACLK做时钟,连续计数模式**********************************************************/ TACTL |=TASSEL_1+ID_0+MC_2; // 主计数器ACLK做时钟,无分频,连续计数模式TACCTL0 |=CAP+CCIS_0+CM_1+SCS; // 捕获模式0,外部输入,上升沿同步捕获TACCTL1 |=CAP+CCIS_0+CM_2+SCS; // 捕获模式1,外部输入,下降沿同步捕获TACCTL2 |=CAP+CCIS_0+CM_3+SCS; // 捕获模式2,外部输入,双沿同步捕获P1DIR &=~(BIT0+BIT2); // P1.0与P1.2方向设为输入P2DIR &=~ BIT0; // P2.0方向设为输入P1SEL |=(BIT0+BIT2);// 将P1.0与P1.2的第二功能激活P2SEL |= BIT0;// 将P2.0的第二功能激活Timer _A定时器的比较模块OUTMODEx: Timer _A比较模块的输出模式控制(位于TACCTL0/1/2寄存器)(说明:一共有8种输出模式,在这里不一一列出。