430学习1.doc_第1页
430学习1.doc_第2页
430学习1.doc_第3页
430学习1.doc_第4页
430学习1.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MSP430学习笔记之二:时钟模块MSP430系列单片机基础时钟主要是由低频晶体振荡器,高频晶体振荡器,数字控制振荡器(DCO),锁频环(FLL)及FLL+等模块构成。由于430系列单片机中的型号不同,而时钟模块也将有所不同。虽然不同型号的单片机的时基模块有所不同,但这些模块产生出来的结果是相同的.在MSP430F13、14中是有TX2振荡器的,而MSP430F11X,F11X1中是用LFXT1CLK来代替XT2CLK时钟信号的.在时钟模块中有3个(对于F13,F14)时钟信号源(或2个时钟信号源,对于F11X、F11X1): 1-LFXT1CLK: 低频/高频时钟源.由外接晶体振荡器,而无需外接两个振荡电容器.较常使用的晶体振荡器是32768HZ。2-XT2CLK: 高频时钟源.由外接晶体振荡器。需要外接两个振荡电容器,较常用的晶体振荡器是8MHZ。3-DCOCLK: 数字可控制的RC振荡器。1-ACLK: 辅助时钟信号.由图所示,ACLK是从FLXT1CLK信号由1/2/4/8分频器分频后所得到的.由BCSCTL1寄存器设置DIVA相应为来决定分频因子.ACLK可用于提供CPU外围功能模块作时钟信号使用. 2-MCLK: 主时钟信号.由图所示,MCLK是由3个时钟源所提供的。他们分别是LFXT1CLK,XT2CLK(F13、F14,如果是F11,F11X1则由LFXT1CLK代替),DCO时钟源信号提供.MCLK主要用于MCU和相关系统模块作时钟使用。同样可设置相关寄存器来决定分频因子及相关的设置。3-SMCLK: 子系统时钟,SMCLK是由2个时钟源信号所提供.他们分别是XT2CLK(F13、F14)和DCO,如果是F11、F11X1则由LFXT1CLK代替TX2CLK。同样可设置相关寄存器来决定分频因子及相关的设置。MSP430X1X1系列产品中,其中XT1时钟源引脚接法有如3种应用。F13、14的XT1相同。需要注意的是,LFXT1只有工作在高频模式下才需要外接电容。对以引脚较少的MSPX1XX系列产品中有着不同时基模块,具体如下: MSP430X11X1:LFXT1CLK , DCO MSP430F12X: LFXT1CLK , DCO MSP430F13X/14X/15X/16X:LFXT1CLK , DCO , XT2CLK MSP430F4XX: LFXT1CLK , DCO , XT2CLK , FLL+ 时钟发生器的原理说明: 问题的提出:1、高频、以便能对系统硬件请求和事件作出快速响应 2、低频率,以便将电流消耗降制至最少 3、稳定的频率,以满足定时器的应用。 4、低Q值振荡器,以保证开始或停止操作没有延时MSP430采用了一个折衷的办法:就是用一个低频晶镇振,将其倍频在高频的工作频率上。一般采用这种技术的实用方法有两种,一个是说、锁相环、一个是锁频环,而锁相环采用模拟的控制容易引起“失锁”和易引起电容量的改变。而TI采用的是锁频环技术,它采用数字控制器DCO和频率积分来产生高频的运行时钟频率。低功耗设置的技巧问题: 1、LPM4:在振荡器关闭模式期间,处理机的所有部件工作停止,此时电流消耗最小。此时只有在系统上电电路检测到低点电平或任一请求异步响应中断的外部中断事件时才会从新工作。因此在设计上应含有可能需要用到的外部中断才采用这种模式。否则发生不可预料的结果。 2、LPM3:在DC发生器关闭期间,只有晶振是活动的。但此时设置的基本时序条件的DC发生器的DC电流被关闭。由于此电路的高阻设计,使功耗被抑制。注:当从DC关闭到启动DC0要花一端时间(ns-us) 3、LPM2:在此期间,晶镇振和DC发生器是工作的,所以可实现快速启动。4、LPM1:在此振荡器已经工作,所以不存在启动时间延时问题。 结合上述特点,在写程序时要综合考虑低功好耗特性,对外部事件的安排也很 重要。你必须在功能实现上综合考虑才能达到你预期的效果。使用C语言可用如下的语句:_BIS_SR(LMP3_bits)和_BIC_SR(LPM3 bits) LPM3和LPM3_EXIT 它们的定义是一样的。这里说明在C语言环境中有些定义的函数是不可见的。但你可以从in430.h文件看到它们的定义。DCOCTL DCO控制寄存器DCO.2 DCO.1 DCO.0 MOD.4 MOD.3 MOD.2 MOD.1 MOD.0DCO.0-DCO.4 定义8种频率之一,可以分段调节DCOCLK频率,相邻两种频率相差10%。而频率由注入直流发生器的电流定义。MOD.0-MOD.4 定义在32个DCO周期中插入的Fdco+1周期个数,而在下的DCO周期中为Fdco周期,控制改换DCO和DCO+1选择的两种频率。如果DCO常数为7,表示已经选择最高频率,此时不能利用MOD.0-MOD.4进行频率调整。BCSCTL1 基本时钟系统控制寄存器1XT2OFF TXS DIVA.1 DIVA.0 XT5V Rsel.2 Resl.1 Resl.0 XT2OFF 控制XT2振荡器的开启与关闭。TX2OFF=0,XT2振荡器开启。TX2OFF=1,TX2振荡器关闭(默认为TX2关闭)XTS 控制LFXT1 工作模式,选择需结合实际晶体振荡器连接情况。XTS=0,LFXT1 工作在低频模式(默认)。XTS=1,LFXT1 工作在高频模式(必须连接有高频相应的高频时钟源)。DIVA.0 DIVA.1 控制ACLK分频。0 不分频(默认)1 2分频2 4分频3 8分频XT5V 此位设置为0。Resl1.0,Resl1.1,Resl1.2 三位控制某个内部电阻以决定标称频率。Resl=0,选择最低的标称频率。.Resl=7,选择最高的标称频率。BCSCTL2 基本时钟系统控制寄存器2SELM.1 SELM.0 DIVM.1 DIVM.0 SELS DIVS.1 DIVS.0 DCORSELM.1 SELM.0 选择MCLK时钟源0 时钟源为DCOCLK(默认)1 时钟源为DCOCLK 2 时钟源为LFXT1CLK(对于MSP430F11/12X),时钟源为XT2CLK(对于MSP430F13/14/15/16X);3 时钟源为LFTXTICLK。DIVM.1 DIVM.0 选择MCLK分频0 1分频(默认)1 2分频2 4 分频3 8 分频SELS 选择SMCLK时钟源0 时钟源为DCOCLK(默认)1 时钟源为LFXT1CLK(对于MSP430F11/12X),时钟源为XT2CLK(对于MSP430F13/14/15/16X)。DIVS.1 DIVS.0 选择SMCLK分频。0 1分频1 2分频2 4分频4 8分频DCOR 选择DCO电阻0 内部电阻1 外部电阻PUC信号之后,DCOCLK被自动选择MCLK时钟信号,根据需要,MCLK的时钟源可以另外设置为LFXT1或者XT2。设置顺序如下:1 复位OscOff 2 清除OFIFG 3 延时等待至少50us 4 再次检查OFIFG,如果仍然置位,则重复3、4步骤,直到OFIFG=0为止。msp430clock.JPG (53.5 KB)2011-2-28 14:47例子:#include void main (void)unsigned int i;P2DIR = 0x10; /设置P2.4输出P2SEL = 0x10; /设置P2.4口为外围模块用作MCLK信号输出BCSCTL1 &= XT2OFF; /使TX2有效,TX2上电时默认为关闭的.doIFG1 &= OFIFG; /清振荡器失效标志for(i= 0xff; i0; i-); /延时,待稳定.while (IFG1 & OFIFG)!=0); /若振荡器失效标志有效BCSCTL2 |= SELM1; /使MCLK = XT2for(;);msp430学习笔记日期:2008-01-12 来源: 作者: 字体:大 中 小 (投递新闻) 这只是我在学习TI公司生产的16位超的功耗单片机MSP430的随笔,希望能对其他朋友有所借鉴,不对之处还请多指教。下面,开始430之旅。讲解430的书现在也有很多了,不过大多数都是详细说明底层硬件结构的,看了不免有些空洞和枯燥,我认为了解一个MCU的操作首先要对其基础特性有所了解,然后再仔细研究各模块的功能。1.首先你要知道msp430的存储器结构。典型微处理器的结构有两种:冯。诺依曼结构程序存储器和数据存储器统一编码;哈佛结构程序存储器和数据存储器;msp430系列单片机属于前者,而常用的mcs51系列属于后者。00xf特殊功能寄存器;0x100x1ff外围模块寄存器;0x200?根据不同型号地址从低向高扩展;0x10000x107f seg_b0x1080_0x10ff seg_a 供flash信息存储剩下的从0xffff开始向下扩展,根据不同容量,例如149为60KB,0xffff0x11002.复位信号是MCU工作的起点,430的复位型号有两种:上电复位信号POR和上电清楚信号PUC。POR信号只在上电和RST/NMI复位管脚被设置为复位功能,且低电平时系统复位。而PUC信号是POR信号产生,以及其他如看门狗定时溢出、安全键值出现错误是产生。但是,无论那种信号触发的复位,都会使msp430在地址0xffff处读取复位中断向量,然后程序从中断向量所指的地址开始执行。复位后的状态不写了,详见参考书,嘿嘿。3.系统时钟是一个程序运行的指挥官,时序和中断也是整个程序的核心和中轴线。430最多有三个振荡器,DCO内部振荡器;LFXT1外接低频振荡器,常见的32768HZ,不用外接负载电容;也可接高频450KHZ8M,需接负载电容;XT2接高频450KHZ8M,加外接电容。430有三种时钟信号:MCLK系统主时钟,可分频1 2 4 8,供cpu使用,其他外围模块在有选择情况下也可使用;SMCLK系统子时钟,供外围模块使用,可选则不同振荡器产生的时钟信号;ACLK辅助时钟,只能由LFXT1产生,供外围模块。4.中断是430处理器的一大特色,因为几乎每个外围模块都能产生,430可以在没有任务时进入低功耗状态,有事件时中断唤醒cpu,处理完毕再次进入低功耗状态。整个中断的响应过程是这样的,当有中断请求时,如果cpu处于活动状态,先完成当前命令;如果处于低功耗,先退出,将下一条指令的pc值压入堆栈;如果有多个中断请求,先响应优先级高的;执行完后,等待中断请求标志位复位,要注意,单中断源的中断请求标志位自动复位,而多中断的标志位需要软件复位;然后系统总中断允许位SR.GIE复位,相应的中断向量值装入pc,程序从这个地址继续执行。这里要注意,中断允许位SR.GIE和中断嵌套问题。如果当你执行中断程序过程中,希望可以响应更高级别的中断请求时,必须在进入第一个中断时把SR.GIE置位。其实,其他的外围模块时钟沿着时钟和中断这个核心来执行的。具体的结构我也不罗索了,可以参考430系列手册。上面把430单片机的基础特性交待了一下,让大家整体有了结构的印象,后面我想在写一下c语言对430编程的整体结构。基本上属于框架结构,即整体的模块化编程,其实这也是硬件编程的基本法则拉(可不是我规定的法则哦)。首先是程序的头文件,包括i nclude ,这是14系列,因为常用149;其他型号可自己修改。还可以包括i nclude data.h 等数据库头文件,或函数变量声明头文件,都是你自己定义的哦。接着就是函数和变量的声明 void Init_Sys(void);系统初始化系统初始化是个整体的概念,广义上讲包括所有外围模块的初始化,你可以把外围模块初始化的子函数写到Init_Sys()中,也可以分别写各个模块的初始化。但结构的简洁,最好写完系统的时钟初始化后,其他所用到的模块也在这里初始化。void Init_Sys() unsigned int i; BCSCTL1&=XT2OFF; /打开XT2振荡器 do IFG1 &= OFIFG; / 清除振荡器失效标志 for (i = 0xFF; i 0; i-); / 延时,等待XT2起振 while (IFG1 & OFIFG) != 0); / 判断XT2是否起振 BCSCTL2 =SELM_2+SELS; /选择MCLK、SMCLK为XT2/以下对各种模块、中断、外围设备等进行初始化 . _EINT(); /打开全局中断控制这里涉及到时钟问题,通常我们选择XT2为8M晶振,也即系统主时钟MCLK为8M,cpu执行命令以此时钟为准;但其他外围模块可以在相应的控制寄存器中选择其他的时钟,ACLK;当你对速度要求很低,定时时间间隔大时,就可以选择ACLK,例如在定时器Timea初始化中设置。主程序: void main( void ) WDTCTL = WDTPW + WDTHOLD; /关闭看门狗 InitSys(); /初始化 /自己任务中的其他功能函数 。 while(1); 主程序之后我要讲讲中断函数,中断是你做单片机任务中不可缺少的部分,也可以说是灵魂了(夸张吗)。 /* 各中断函数,可按优先级依次书写 */举个定时中断的例子: 初始化 void Init_Timer_A(void) TACTL = TASSEL0 + TACLR; / ACLK, clear TAR CCTL0 = CCIE; / CCR0 中断使能 CCR0=32768; /定时1s TACTL|=MC0; /增计数模式 中断服务 #pragma vector=TIMERA0_VECTOR _interrupt void TimerA0() / 你自己要求中断执行的任务 当然,还有其他的定时,和多种中断,各系列芯片的中断向量个数也不同。整体的程序设计结构,包括了所有外围模块及内部时钟,中断,定时的初始化。具体情况大家可以根据自己的需要添加或者减少,记住,模块化设计时最有力的武器。这可是个人总结的经典阿,谢谢支持。因为经常使用149,所以这是149的结构,其他的再更改,根据个人需要。/*文件名:main.c描述:MSP430框架程序。适用于MSP430F149,其他型号需要适当改变。 不使用的中断函数保留或者删除都可以,但保留时应确保不要打开不需要的中断。 */头文件i nclude /函数声明void InitSys();int main( void ) WDTCTL = WDTPW + WDTHOLD; /关闭看门狗 InitSys(); /初始化start: /以下填充用户代码LPM3; /进入低功耗模式n,n:04。若不希望进入低功耗模式,屏蔽本句goto start;/*系统初始化*/void InitSys() unsigned int iq0;/使用XT2振荡器 BCSCTL1&=XT2OFF; /打开XT2振荡器 do IFG1 &= OFIFG; / 清除振荡器失效标志 for (iq0 = 0xFF; iq0 0; iq0-); / 延时,等待XT2起振 while (IFG1 & OFIFG) != 0); / 判断XT2是否起振 BCSCTL2 =SELM_2+SELS; /选择MCLK、SMCLK为XT2/以下填充用户代码,对各种模块、中断、外围设备等进行初始化 _EINT(); /打开全局中断控制,若不需要打开,可以屏蔽本句/*端口2中断函数*/#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; /清除中断标志 /以下填充用户代码LPM3_EXIT; /退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽/*USART1发送中断函数*/#pragma vector=USART1TX_VECTOR_interrupt void Usart1Tx()/以下填充用户代码LPM3_EXIT; /退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽/*USART1接收中断函数*/#pragma vector=USART1RX_VECTOR_interrupt void Ustra1Rx()/以下填充用户代码LPM3_EXIT; /退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽/*端口1中断函数多中断中断源:P1IFG.0P1IFG7进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断*/#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; /清除中断标志 /以下填充用户代码LPM3_EXIT; /退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽/*定时器A中断函数多中断中断源:CC12 TA*/#pragma vector=TIMERA1_VECTOR_interrupt void TimerA1()/以下为参考处理程序,不使用的中断源应当删除switch (_even_in_range(TAIV, 10) case 2: /捕获/比较1中断 /以下填充用户代码 break; case 4: /捕获/比较2中断 /以下填充用户代码 break; case 10: /TAIFG定时器溢出中断 /以下填充用户代码 break;LPM3_EXIT; /退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽/*定时器A中断函数中断源:CC0*/#pragma vector=TIMERA0_VECTOR_interrupt void TimerA0()/以下填充用户代码LPM3_EXIT; /退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽/*AD转换器中断函数多中断源:摸拟07、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) /(AVcc-AVss)/2 /以下填充用户代码LPM3_EXIT; /退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽/*USART0发送中断函数*/#pragma vector=USART0TX_VECTOR_interrupt void Usart0Tx()/以下填充用户代码LPM3_EXIT; /退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽/*USART0接收中断函数*/#pragma vector=USART0RX_VECTOR_interrupt void Usart0Rx()/以下填充用户代码LPM3_EXIT; /退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽/*看门狗定时器中断函数*/#pragma vector=WDT_VECTOR_interrupt void WatchDog()/以下填充用户代码LPM3_EXIT; /退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽/*比较器A中断函数*/#pragma vector=COMPARATORA_VECTOR_interrupt void ComparatorA()/以下填充用户代码LPM3_EXIT; /退出中断后

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论