1msp430简介MSP430是德州公司新开发的一类具有16位总线的带FLASH的单片机,由于其性价比和集成度高,受到广大技术开发人员的青睐.它采用16位的总线,外设和内存统一编址,寻址范围可达64K,还可以外扩展存储器.具有统一的中断管理,具有丰富的片上外围模块,片内有精密硬件乘法器、两个16位定时器、一个14路的12位的模数转换器、一个看门狗、6路P口、两路USART通信端口、一个比较器、一个DCO内部振荡器和两个外部时钟,支持8M的时钟.由于为FLASH型,则可以在线对单片机进行调试和下载,且JTAG口直接和FET(FLASHEMULATIONTOOL)的相连,不须另外的仿真工具,方便实用,而且,可以在超低功耗模式下工作对环境和人体的辐射小,测量结果为100mw左右的功耗(电流为14mA左右),可靠性能好,加强电干扰运行不受影响,适应工业级的运行环境,适合与做手柄之类的自动控制的设备.我们相信MSP430单片机将会在工程技术应用中得以广泛应用,而且,它是通向DSP系列的桥梁,随着自动控制的高速化和低功耗化,MSP430系列将会得到越来越多人的喜爱.一、IO口(一)、P口端口寄存器:1、PxDIR输入/输出方向寄存器(0:输入模式1:输出模式)2、PxIN输入寄存器输入寄存器是只读寄存器,用户不能对其写入,只能通过读取该寄存器的内容知道I/O口的输入信号。3、PxOUT输出寄存器寄存器内的内容不会受引脚方向改变的影响。4、PxIFG中断标志寄存器(0:没有中断请求1:有中断请求)该寄存器有8个标志位,对应相应的引脚是否有待处理的中断请求;这8个中断标志共用一个中断向量,中断标志不会自动复位,必须软件复位;外部中断事件的时间必须=1.5倍的MCLK的时间,以保证中断请求被接受;5、PxIES中断触发沿选择寄存器(0:上升沿中断1:下降沿中断)6、PxSEL功能选择寄存器(0:选择引脚为I/O端口1:选择引脚为外围模块功能)7、PxREN上拉/下拉电阻使能寄存器(0:禁止1:使能)(二)、常用特殊P口:1、P1和P2口可作为外部中断口。2、P6可作为A/D输入口。3、P1.2和P2.0可作为PWM波输出口。4、P1.1:MCLKP1.5:ACLK5、串口通信时:P2.4、P4.0为发送TXD,P2.5、P4.1为接收RXD。(三)、基本操作:1、所有P口都可作为通用IO口使用2、所有P口都可进行字节操作和位操作按字节操作:2例:P1DIR=0xff;//将P1口作为输出口PIOUT=0x20;//P1口输出0x20P1DIR=0x00;//将P1口作为输入口data=P1IN//读取P1口外部输入值按位操作:例:P1DIR=BIT0;//将P1.0作为输出口P1OUT|=BIT0;//P1.0输出1P1OUT&=~BIT0;//P1.0输出0P1DIR&=~BIT0//将P1.0口作为输入data=P1IN&BIT0//读取P1.0口外部输入值二、时钟(一)、三个时钟源:1、LFXT1CLK:低频时钟(32768HZ)2、XT2CLK:高频时钟(8MHZ)3、DCOCLK:片内数控振荡器最高46MHZ,但不稳定(不能作为定时用)(二)、时钟模块结构图:(三)、时钟模块可提供的四种时钟信号:1、ACLK:辅助时钟,来自LFXT1CLK低频时钟,可有软件选作各外围模块的时钟信号,3一般用于低速外设。2、ACLK/n:ACLK经过1、2、4、8分频后由P1.5输出,仅供外部电路使用。3、MCLK:系统主时钟,可有软件选择来自LFXT1CLK、XT2CLK或DCOCLK的时钟,然后经1、2、4、8分频得到。可由P1.1输出(主要用于cpu)4、SMCLK:子系统时钟,可有软件选择来自XT2CLK或DCOCLK的时钟。(主要用于高速外设)(四)、MCLK应用举例:1、在默认情况下,MCLK来自于DCOCLK其频率为1.048576MHZ其计算方法:MCLK=(31+1)*327682、如何选择ACLK作为MCLK:voidclk_initial(){do{IFG1&=~OFIFG;//清除振荡器的失效标志__delay_cycles(200);}while((IFG1&OFIFG)!=0);//如果振荡器的失效标志存在FLL_CTL1=SELM1+SELM0;//选择ACLK作为MCLK}3、如何选择XT2CLK作为MCLK:voidclk_initial(){do{IFG1&=~OFIFG;//清除振荡器的失效标志__delay_cycles(200);}while((IFG1&OFIFG)!=0);//如果振荡器的失效标志存在FLL_CTL1=SELM1;//选择XT2CLK作为MCLK}4、如何选择DCOCLK作为MCLK:计算(121+1)*2*32768=7.995MHZvoidCLK_initial(){SCFI0|=FN_4;//选择DCO频率调整范围为2.8~26.6MHZSCFQCTL=249;//倍频倍数,最高位为DCO+调制器的控制位FLL_CTL0=DCOPLUS+OSCCAP_1;//选择DCO作为MCLK前分频}三、中断(一)、中断源:1、外部中断:P1、P22、定时器中断。3、看门狗定时器中断。4、串口中断。5、A/D转换中断。6、比较器中断。4(二)、中断的一般设置:1、打开、关闭局部中断:打开局部中断一般是给想关的特殊功能寄存器相关位置1以P1口外部中断为例:打开局部中断:P1IE|=BIT0;//打开P1.0外部中断关闭局部中断一般是给想关的特殊功能寄存器相关位置0同样以P1口外部中断为例:关闭局部中断:P1IE&=~BIT0;//关闭P1.0外部中断2、打开、关闭全局中断:_EINT();//打开总中断,相当于51的EA=1;_DINT();//关闭总中断,相当于51的EA=0;3、各中断向量InterruptVectors:#defineBASICTIMER_VECTOR(0*2u)/*0xFFE0BasicTimer*/#definePORT2_VECTOR(1*2u)/*0xFFE2Port2*/#defineUSART1TX_VECTOR(2*2u)/*0xFFE4USART1Transmit*/#defineUSART1RX_VECTOR(3*2u)/*0xFFE6USART1Receive*/#definePORT1_VECTOR(4*2u)/*0xFFE8Port1*/#defineTIMERA1_VECTOR(5*2u)/*0xFFEATimerACC1-2,TA*/#defineTIMERA0_VECTOR(6*2u)/*0xFFECTimerACC0*/#defineADC12_VECTOR(7*2u)/*0xFFEEADC*/#defineUSART0TX_VECTOR(8*2u)/*0xFFF0USART0Transmit*/#defineUSART0RX_VECTOR(9*2u)/*0xFFF2USART0Receive*/#defineWDT_VECTOR(10*2u)/*0xFFF4WatchdogTimer*/#defineCOMPARATORA_VECTOR(11*2u)/*0xFFF6ComparatorA*/#defineTIMERB1_VECTOR(12*2u)/*0xFFF8TimerBCC1-6,TB*/#defineTIMERB0_VECTOR(13*2u)/*0xFFFATimerBCC0*/#defineNMI_VECTOR(14*2u)/*0xFFFCNon-maskable*/#defineRESET_VECTOR(15*2u)/*0xFFFEReset[HighestPriority]*/4、中断优先级:优先级顺序从高到低为:PORT2_VECTOR(1*2u)/*0xFFE2Port2*/PORT1_VECTOR(4*2u)/*0xFFE8Port1*/TIMERA1_VECTOR(5*2u)/*0xFFEATimerACC1-2,TA*/TIMERA0_VECTOR(6*2u)/*0xFFECTimerACC0*/ADC_VECTOR(7*2u)/*0xFFEEADC*/USART0TX_VECTOR(8*2u)/*0xFFF0USART0Transmit*/USART0RX_VECTOR(9*2u)/*0xFFF2USART0Receive*/WDT_VECTOR(10*2u)/*0xFFF4WatchdogTimer*/COMPARATORA_VECTOR(11*2u)/*0xFFF6ComparatorA*/TIMERB1_VECTOR(12*2u)/*0xFFF8TimerBCC1-2,TB*/TIMERB0_VECTOR(13*2u)/*0xFFFATimerBCC0*/NMI_VECTOR(14*2u)/*0xFFFCNon-maska××e*/RESET_VECTOR(15*2u)/*0xFFFEReset[HighestPriority]*/5、中断的嵌套:5当同时有多个中断来的时候才有优先级的考虑(优先级顺序可查看向量表)实现中断嵌套需要注意以下几点:1)430默认的是关闭中断嵌套的,一定要中断嵌套的话,就必须在中断服务程序中打开总中断msp430的指令中,_DINT()和_EINT()分别指关和开总中断。2)当进入中断服务程序时,只要不在中断服务程序中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行;3)若在中断服务程序A中开了总中断,则可以响应后来的中断B(不管B的优先级比A高还是低),B执行完再继续执行A。注意:进入中断服务程序B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动打开;4)若在中断服务程序中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用!中断服务不执行抢先原则。5)对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用EINT();开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关.6、中断应用程序举例(外部中断):voidinterrupt_initial(){P1DIR&=~BIT7;//P1.7为输入P1IE|=0x80;//P1.7中断允许P1IES|=0x00;//P1.7上升沿触发P1IFG=0;//P1.7中断标志清除,对于多源中断必须先清中断标志再打开中断_EINT();//总中断允许}#pragmavector=PORT1_VECTOR__interruptvoidPort_1(void){P1IFG&=~BIT7;//P1.7中断标志清除/*在此写中断服务子程序*/}四、定时(一)、常见的定时方式:1、软件定时:通过延时程序实现。缺点:在延时期间,CPU一直被占用,浪费了CPU的利用率,而且延时时间不好计算。2、硬件延时:通过专门的定时器件实现。优点:在简单的软件控制下,产生准确的延时。(二)、硬件定时器种类:1、看门狗定时器。2、定时器A。3、定时器B。4、实时时钟RTC。(三)、Timer_A的基本特点:1、输入时钟可以有多种选择。2、产生的定时脉冲或PWM信号没有软件带来的误差。3、四种计数功能。4、8种输出方式。5、16位定时器。66、生成的PWM波能用软件任意改变占空比和周期,当PWM波不需要修改占空比和周期时,Timer_A能自动输出PWM,而不需要利用中断来维持PWM波的输出(四)、定时器的工作模式:1、停止模式:用于