msp430g2553内部资源总结_第1页
msp430g2553内部资源总结_第2页
msp430g2553内部资源总结_第3页
msp430g2553内部资源总结_第4页
msp430g2553内部资源总结_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、电设工作小结之MSP430G2553学习笔记1      一,MSP430G2553单片机的各个功能模块  (一),IO口模块,  1,我们所用的MSP430G2553有两组IO口,P1和P2。  2,IO口的寄存器有:方向选择寄存器PxDIR,输出寄存器PxOUT,输入寄存器PxIN,IO口内部上拉或下拉电阻使能寄存器PxREN, IO口功能选择寄存器PxSEL和PxSEL2,IO口中断使能寄存器PxIE,中断沿选择寄存器PxIES,IO口中断标志寄存器PxIFG

2、。  3,所有的IO都带有中断,其中所有的P1口公用一个中断向量,所有的P2口公用一个中断向量。所以在使用中断时,当进入中断后,还要判断到底是哪一个IO口产生的中断,判断方法可以是判断各个IO口的电平。   4,中断标志PxIFG需要软件清除,也可以用软件置位,从而用软件触发一个中断。注意:在设置PxIESx时根据PxINx有可能会引起相应的PxIFGx置位(具体的情况见用户指南),所以在初始化完IO口中断以后,正式使用IO中断前要先将对应的PxIFGx清零。程序如下:void IO_interrupt_init() 

3、60;   /IO中断初始化函数  P1REN |= BIT4+BIT5+BIT6+BIT7;     / pull up 内部上拉电阻使能  /使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断  P1OUT = BIT4+BIT5+BIT6+BIT7;   / 当引脚上的上拉或下拉电阻使能时,PxOUT选择是上

4、拉还是下来          /0:下拉,1:上拉   P1IE |= BIT4+BIT5+BIT6+BIT7;       / interrupt enabled P13中断使能  P1IES |= BIT4+BIT5+BIT6+BIT7;     

5、0;    / Hi/lo edge  下降沿中断  /P1IES &= BIT3;                         /上升沿触发中断  P1IFG &= (

6、BIT4+BIT5+BIT6+BIT7);         /中断标志位清零  5,PxOUT:如果引脚选择了内部的上拉或下拉电阻使能,则PxOUT设定电阻是上拉还是下拉,0:下拉,1:上拉6,当IO口不用时,最好不要设为输入,且为浮动状态(这是IO口的默认状态),因为当输入为浮动时,输入电压有可能会在VIL和VIH之间,这样会产生击穿电流。所以不用的IO口可以设为输出状态,或设为输入状态但通过外围电路接至VCC或GND,或接一个上拉/下拉电阻。7,当使用msp430g2553的IO口

7、时要注意,因为g2553的IO口寄存器的操作,不像51,它不能单独针对某一位进行操作,必须对整个寄存器进行操作。所以就不像51,g2553不可以定义bit型的数据。所以在使用msp的IO口时要注意对需要位的操作,而不要影响其他无关的位,可以 用 |  &  等按位操作的符号。在使用IO都控制其他外围模块时也要注意要使用的IO口的定义,可以用如下的定义方法:#define CLR_RS P2OUT&=BIT0;    /RS = P2.0#d

8、efine SET_RS P2OUT|=BIT0;#define CLR_RW P2OUT&=BIT1; /RW = P2.1#define SET_RW P2OUT|=BIT1;#define CLR_EN P2OUT&=BIT2; /EN = P2.2#define SET_EN P2OUT|=BIT2; #define DataPort    P1OUT&

9、#160;8,g2553的P27和P26脚分别接外部晶体的输出和输入脚XOUT和XIN,默认是自动设为了晶振管脚功能,但是当想把它们用为普通的IO时,也可以,设置对应的SEL设为普通的IO即可,如下:P2DIR |= BIT6+BIT7;    /把P26和P27配置为普通IO 并为输出脚  默认为晶振的输入和输出引脚 作为dac0832的    P2SEL &= (BIT6+BIT7);   /c

10、s和wr控制端    P2SEL2 &= (BIT6+BIT7);   (二),时钟系统     1,msp430能做到超低功耗,合理的时钟模块是功不可没的。但是功能强大的时钟模块设置起来也相对复杂一些。     2,msp430的时钟源有:(1),外接低频晶振LFXT1CLK:低频模式接手表晶体32768Hz,高频模式450KHz8MHz;(2),外接高速晶振XT2CLK:8MHz;(3),内部数

11、字控制振荡器DCO:是一个可控的RC振荡器,频率在016MHz;(4),超低功耗低频振荡器VLO:不可控,420KHz 典型值为12KHz;     3,时钟模块:430的时钟模块有MCLK  SMCLK  ACLK :(1),主系统时钟MCLK:提供给MSP430的CPU时钟。可以来自LFXT1CLK  XT2CLK  DCO  VLO可选,默认为DCO。(2),子系统时钟SMCLK: 提供给高速外设。可以来自LF

12、XT1CLK  XT2CLK  DCO  VLO可选,默认为DCO。(3),辅助系统时钟ACLK:提供给低速外设。可来自LFXT1CLK  VLO。      4,内部的振荡器DCO和VLO提供的时钟频率不是很精确,随外部环境变化较大。DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。DCO可以用CCS提供的宏定义进行相对比较精确的设置,如下:DCOCTL&

13、#160;= CALDCO_12MHZ;   /DCO设为12MHz   这种方法设DCO频率比较精确,实际测得为12.08MHz左右 正弦波BCSCTL1 = CALBC1_12MHZ;用这种方法可以设置1,8,12,16MHz宏定义如下:#ifndef _DisableCalData SFR_8BIT(CALDCO_16MHZ);            

14、           SFR_8BIT(CALBC1_16MHZ);                       SFR_8BIT(CALDCO_12MHZ);        &#

15、160;              SFR_8BIT(CALBC1_12MHZ);                       SFR_8BIT(CALDCO_8MHZ);     

16、;                   SFR_8BIT(CALBC1_8MHZ);                        SFR_8BIT(CALDCO_1MH

17、Z);                        SFR_8BIT(CALBC1_1MHZ);                      

18、;   #endif  5,使用超低功耗低频振荡器VLO可以很大程度地降低系统功耗,下面的例子是设置ACLK为VLO,MCLK为VLO的8分频:#include  <msp430g2553.h> /1延时/#define CPU_F (double)16000000)/cpu frequency16000000#define CPU_F (double)1630)/cpu frequency1630   /CPU的

19、实际MCLK大约为13.05/8=1.63KHz#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)  void main(void)  volatile unsigned int i;       &#

20、160;          / Volatile to prevent removal  WDTCTL = WDTPW + WDTHOLD;                 / Stop watchdog

21、60;timer   BCSCTL3 |= LFXT1S_2;                      / LFXT1 = VLO  低频时钟选择为VLO ACLK选为VLO   IFG1 &= OFIFG;&

22、#160;                          / Clear OSCFault flag  清除振荡器错误中断标志   _bis_SR_register(SCG1 + SCG0);   

23、0;       / Stop DCO  SCG1禁止SMCLK  SCG0禁止DCO   BCSCTL2 |= SELM_3 + DIVM_3;               / MCLK = LFXT1/8 

24、 /因为前面已经选择了LFXT1 = VLO 所以MCLK选为VLO  8分频  所以CPU的MCLK大约为1.5KHz   P1DIR = 0xFF;                          

25、60;  / All P1.x outputs  P1OUT = 0;                                / All P1.x re

26、set  P2DIR = 0xFF;                             / All P2.x outputs  P2OUT = 0;    

27、;                            / All P2.x reset   P1SEL |= BIT0+BIT4;         

28、;       / P10 P14options  功能选择为外围模块  /p10输出ACLK,来自VLO,p14输出SMCLK,  因为禁止了SMCLK,所以P14脚无波形输出  /VLO典型值为12KHz  实际用示波器测得为:13.05KHz 左右波动  /所以CPU的实际MCLK大约为13.05/8=1.63KHz    for&

29、#160;(;)      P1OUT = BIT6;          / P1.6 闪烁    delay_ms(1000);     6,如上面的程序所示,其中的延迟函数用那种方法,使用系统的延迟周期函数_delay_cycles(int n); 可以达到比较精确的延迟,如下:

30、60;/more_/1延时/#define CPU_F (double)16000000)/cpu frequency16000000#define CPU_F (double)12000000)/cpu frequency12000000#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)/

31、2空函数#define nop() _NOP();    7,系统上电后默认使用的是DCO时钟,DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。    (三),定时器Timer_A   1,MSP430g2553具有两个16位的定时器:Timer0_A   Timer1_A。分别具有三个捕捉/比较寄存器,具有输入捕捉,输出比较功能。可以

32、产生定时中断,也可以产生PWM。   2,产生PWM,例子如下: #include <msp430g2553.h>  void Timer_A0_1_init()  /TA0.1输出PWMTACTL|= TASSEL_1+MC_1;/ACLK,增计数CCTL1=OUTMOD_7;/输出模式为复位/置位CCR0=328;/时钟频率为32768HZ,100HZ/CCR1=164;/时钟频率为32768HZ,占空比CCR1/CCR0=50%CCR1=109;/占空比CCR1/CC

33、R0=1/3                              TA0.1由P1.2 P1.6输出  void Timer_A1_2_init()    /TA1.2输出PWMTA1CTL|= TASS

34、EL_1+MC_1;/ACLK,增计数TA1CCTL2=OUTMOD_7;/输出模式为复位/置位,注意CCTL2要写为TA1CCTL2 TA1CCR0=164;/时钟频率为32768HZ,波形32768/CCR0=199HZTA1CCR2=41;/占空比CCR2/CCR0=1/4,注意CCR2要写成TA1CCR2       TA1.2由P2.4 P2.5输出   void Timer_A1_1_init()   /TA1.1输出PWM

35、  TA1CCTL1=OUTMOD_7; TA1CCR1=123;   /占空比CCR1/CCR0=3/4,注意CCR1要写成TA1CCR1   TA1.1由P2.1 P2.2输出   void IO_init()  P1SEL|=BIT2+BIT6; P1DIR|=BIT2+BIT6;/P1.2 P1.6输出   TA0.1   OUT1 

36、60;P2SEL|=BIT4+BIT5; P2DIR|=BIT4+BIT5;/P2.4 P2.5输出   TA1.2   OUT2  P2SEL|=BIT1+BIT2; P2DIR|=BIT1+BIT2; /P2.1 P2.2输出  TA1.1   OUT1  void main(void) WDTCTL=WDTPW+WDTHOLD;   

37、0; IO_init(); Timer_A0_1_init();Timer_A1_2_init();Timer_A1_1_init();  _BIS_SR(CPUOFF);                          / Enter LPM0  进入低功

38、耗模式0 SMCLK ON,ACLK ON   3,Timer_A的捕获/比较寄存器TAR寄存器是Timer_A的16位的计数寄存器。TACCRx是Timer_A的捕获/比较寄存器,当为捕获模式时:当捕获发生时,把TAR的值装载到TACCRx中。当为比较模式时:TACCRx中装的是要与TAR寄存器相比较的值。   4,捕获模式捕获外部输入的信号的上升沿或下降沿或上升沿下降沿都捕捉,当捕捉发生时,把TAR的值装载到TACCRx中,同时也可以进入中断,执行相应的操作。这样利用捕捉上升沿或下降沿就可以计算外部输

39、入信号的周期,得出频率。利用捕捉上升沿和下降沿可以得出输入信号的高电平或低电平的持续时间。也可以算出占空比。下面是一个例子,是Timer_A捕获初始化的程序:void timer_init()      /使用Timer1_A时要特别注意各个寄存器的写法,因为Timer0_A的寄存器都简写了,所以在写/Timer1_A的寄存器时,要特别注意与Timer0_A的不同P1SEL |= BIT2;    /选择P12作为捕捉的输入端子  Timer0_

40、A /TACCTL1 |=CM_3+SCS+CAP+CCIE;  /上下沿都触发捕捉,用于测脉宽,同步模式、时能中断  CCI1ATACCTL1 |=CM_1+SCS+CAP+CCIE;  /上升沿触发捕捉,同步模式、时能中断  CCI1A    TACTL |= TASSEL1+MC_2;  /选择SMCLK时钟作为计数时钟源,不分频   增计数模式不行,必须连续计数模式&#

41、160;  P2SEL |= BIT1;    /选择P21作为捕捉的输入端子    Timer1_A  /TA1CCTL1 |=CM_3+SCS+CAP+CCIE;  /上下沿都触发捕捉,用于测脉宽,同步模式、时能中断  CCI1A  TA1CCTL1 |=CM_1+SCS+CAP+CCIE;  /上升沿触发捕捉,同步模式、时能中断  

42、CCI1A  TA1CTL |= TASSEL1+MC_2;  /选择SMCLK时钟作为计数时钟源,不分频   增计数模式不行,必须连续计数模式   相对应的中断函数如下: #pragma vector=TIMER0_A1_VECTOR   /Timer0_A CC1  的中断向量_interrupt void Timer_A(void) / CCI0A&#

43、160;使用的捕捉比较寄存器是TA0CCR0,TA0CCR0单独分配给一个    /中断向量TIMER1_A0_VECTOR,所以进入中断后直接就是Timer0_A CC0产生的中断,不用经过类似   /下面的方法判断中断源了  。/Timer0_A CC1-4, TA0公用一个中断向量 TIMER0_A1_VECTOR,所以进入了中断后还要用下面    /的方法进行判断是哪一个中断源产生的中断  swit

44、ch(TAIV)    /如果是Timer0_A CC1产生的中断    case 2:      flag=1;   LPM1_EXIT;      /退出低功耗模式  / _BIC_SR_IRQ(LPM1_bits);   /_bic_SR_register_on_exit(LPM1_

45、bits);   break;     case 4: break;  case 10:break;    #pragma vector=TIMER1_A1_VECTOR      /Timer1_A CC1  的中断向量_interrupt void Timer_A1(void) / P

46、1OUT|=BIT0;  /led调试用的/ LPM1_EXIT;      /退出低功耗模式  因为使用的是CCI0A 使用的捕捉比较寄存器是TA1CCR0,TA1CCR0单独分配给一个                /中断向量TIMER1_A0_VECTOR,所以进入中断后直接就是Timer1_A CC0

47、产生的中断,不用经过类似               /下面注释掉的方法判断  。               /而Timer1_A CC1-4, TA1则公用一个中断向量 TIMER1_A1_VECTOR,所以进入了中断后还要用下面 &#

48、160;     /的方法进行判断是哪一个中断源产生的中断  switch(TA1IV)    /如果是Timer1_A CC1产生的中断    case 2:      flag=2;   LPM1_EXIT;      /退出低功耗模式   /&

49、#160;_BIC_SR_IRQ(LPM1_bits);   /_bic_SR_register_on_exit(LPM1_bits);   break;     case 4:break;  case 10:break;   /如果要测量更低频率的信号的话,可以在中断中判断溢出中断发生的次数,这样就可以得到溢出的次数,从而可以测量更/低频率的信号   5,Timer_A的计数模式计数模

50、式有:增计数模式,连续计数模式和增减计数模式。具体的各个模式的详解,参见用户指南。   6,定时器的定时中断在使用定时器的定时中断时,要注意定时器计数模式的选择。在使用中断时,要注意中断向量的使用和中断源的判断,下面就举一个例子,注释的也较详细:#include <msp430g2553.h> unsigned int t=0; void main(void)  WDTCTL = WDTPW + WDTHOLD;  

51、;               / Stop WDT  P1DIR |= 0x01;                         

52、60;  / P1.0 output   CCTL0 = CCIE;   / CCTLx是捕获/比较控制寄存器   interrupt enabled  CCIE=0x0010  时能定时器A中断   CCR0 = 50000;   /捕获/比较寄存器   设置计数器CCR0的初

53、值  16位寄存器,最大值为65535                /默认SMCLK使用的是DCO,默认的DCO大约为800KHz,而CCR0=50000,所以中断产生的频率大约为16Hz  TACTL = TASSEL_2 + MC_2;          

54、;        / SMCLK, contmode  连续计数模式从0计到0FFFFh  /TACTL = TASSEL_2 + MC_1;                  / SMCLK, upmode 

55、 增计数模式从0计到CCR0   _BIS_SR(LPM0_bits + GIE);                 / Enter LPM0 w/ interrupt  进入低功耗模式0,允许中断 / Timer A0 interrupt service&#

56、160;routine#pragma vector=TIMER0_A0_VECTOR_interrupt void Timer_A (void)    /CCIFG中断被响应后,该标志位自动清零   /P1OUT = 0x01;                    &

57、#160;       / Toggle P1.0t+;if(t=5)P1OUT = BIT0;           / Toggle P1.0t=0;   CCR0 += 50000;          &#

58、160;                 / Add Offset to CCR0  增加CCR0偏移      /定时器总是从0开始往上计数,一直到计满再从0开始,在连续计数模式下,当定时器的值等于CCR0时,产生中断  /在中断中对CCR0增加50000,这样的话定时器从当前值到下一时

59、刻再次等于CCR0时的间隔为50000,恒定  /这样产生中断的时间间隔就相等了 /所以在连续计数模式下,要想使中断的时间间隔一定,就要有CCR0 += n;这句话                                &

60、#160;             /在中断中CCR0不需要从新赋值,区别于51 中断的使用注意情况:还是把举个例子吧:#include <msp430g2553.h> void main(void)  WDTCTL = WDTPW + WDTHOLD;        

61、0;        / Stop WDT  P1DIR |= 0x01;                            / P1.0 output

62、60; TACTL = TASSEL_2 + MC_2 + TAIE;           / SMCLK, contmode, interrupt  TAIE允许定时器溢出中断   _BIS_SR(LPM0_bits + GIE);       &

63、#160;         / Enter LPM0 w/ interrupt  GIE允许中断 / Timer_A3 Interrupt Vector (TA0IV) handler#pragma vector=TIMER0_A1_VECTOR_interrupt void Timer_A(void) switch( TA0IV

64、0;)    /TAIV中断向量寄存器  用于    case  2: break;                          / CCR1 not used &

65、#160; 捕获/比较器1   case  4: break;                          / CCR2 not used    捕获/比较器2   

66、;case 10: P1OUT = 0x01;                  / overflow  定时器溢出            break;      7,注

67、意:定时器Timer0_A的时钟可以选择为外接时钟输入TACLK(P10),这样当外接一个信号时,定时器Timer0_A就相当于一个计数器使用。这样就可以用Timer0_A接外接信号,Timer1_A接标准的时钟如32768Hz的晶振,就可以实现等精度测频了。其实Timer1_A的时钟也可以外接的,但是在g2553中没有这个外接管脚(P37),所以就只能选择正常的时钟了。Timer0_A的外接时钟输入TACLK(P10)的设置如下:下面是我实现等精度测频时,两个定时器的初始化程序:void timer0_init()TACTL |= TASSEL_0+MC_2+T

68、ACLR;  /选择TACLK时钟作为计数时钟源,不分频   必须连续计数模式 P1SEL |= BIT0;   /P10为Timer0_A的时钟TACLK输入,接外部待测信号,这样Timer0_A就当作计数器用/Timer1_A采用ACLK作为时钟源计数,这样ACLK就相当于是标准信号,这样两个定时器相当于都工作在计数器方式,/ACLK 32768Hz作为标准信号,这样可以实现等精度测频void timer1_init() TA1CCTL0 =

69、 CCIE;TA1CCR0 = 32768;    /1s定时 TA1CTL |= TASSEL_1+MC_2+TACLR;  /选择ACLK时钟作为计数时钟源,不分频   必须连续计数模式 8,用定时器和比较器可以实现DAC   使用定时器也可以实现串口通信(四),ADC10 1,ADC10是十位的AD,在g2553上有A0A7八个可以外接的AD通道,A10接到片上的温度传感器上,其他的通道都接

70、在内部的V或GND上。因为是为的所以计算公式如下: 2 ,ADC参考电压的选择:ADC的参考电压可以为: 由ADC控制寄存器0 ADC10CTL0控制。但是要提高ADC的精度的话,尽量不要用内部的参考电压,最好外接一个比较稳定的电压作为参考电压,因为内部的产生的参考电压不是特别稳定或精度不是特别的高。例如我在使用时遇到的情况如下:Vref设为2.5V  但实际的值大概为2.475V, 选择VCC  VSS作为参考,用电压表测得大概为3.58V  还是不小的偏差的。另外,在有可能的情况下,尽量采用较大的VR+和VR-

71、,以减小纹波对采样结果的影响。    3,ADC10的采样方式有:单通道单次采样,单通道多次采样,多通道单次采样,多通道多次采样。4,DTC:因为ADC10只有一个采样结果存储寄存器ADC10MEM,所以除了在单通道单次采样的模式下,其他的三个模式都必须使用DCT,否则转换结果会不停地被新的结果给覆盖。DTC是转换结果传送控制,也就是转换结果可以不用CPU的干预,就可以自动地存储在指定的存储空间内。使用这种方式转换速度快,访问方便,适用于高速采样模式中。DTC的使用可以从下面的例子中很容易看明白:#include <msp430g2553.h>

72、;#include "ser_12864.h"uchar s1="DTC:"uchar s2="2_cha_2_time_DTC"void ADC_init() ADC10CTL1 = CONSEQ_3 + INCH_1;     / 2通道多次转换, 最大转换通道为A1  ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; / ADC10ON, interrupt enabl  参考电压

73、选默认值VCC和VSS  /采样保持时间为16 x ADC10CLKs,ADC内核开,中断使能   MSC多次转换选择开  /如果MSC置位,则第一次开始转换时需要触发源触发一次,以后的转换会自动进行  中断使能  /使用DTC时,当一个块传送结束,产生中断  /数据传送控制寄存器0 ADC10DTC0设置为默认模式:单传送块模式,单块传送完停止  ADC10DTC1 = 0x04; /数据传送控制寄存器1 4 conversions 

74、 定义在每块的传送数目  一共采样4次 所以单块传送4次  /以后就停止了传送 因为是两通道的,所以是每个通道采样数据传送2次  ADC10AE0 |= BIT0+BIT1;         / P1.0 P1.1 ADC option select 使能模拟输入脚A0 A1     /不知道为什么,当P10 P11都悬空时,采样值不同,用电压表测得悬空电压不同,但是当都接上采样源的时候

75、,  /采样是相同的 void main(void)uint adc_sample8=0;    /存储ADC序列采样结果WDTCTL = WDTPW+WDTHOLD;    BCSCTL1 = CALBC1_12MHZ;  /设定cpu时钟DCO频率为12MHz    DCOCTL = CALDCO_12MHZ;    P2DIR |=BIT3+BIT4;  

76、60;   /液晶的两条线    init_lcd();    ADC_init();    wr_string(0,0,s1);    wr_string(0,3,s2);    for (;)           ADC10CTL0 &= ENC;

77、   /ADC不使能  其实这句话可以放在紧接着CPU唤醒之后的,因为CPU唤醒了,说明我们想要的     /转换数据传送完成了,如果ADC继续转换,那么转换结果也不再传输,是无用的。所以紧接着放在CPU唤醒之后     /计时关闭ADC,有利于降低功耗        while (ADC10CTL1 & BUSY);   

78、60;           / Wait if ADC10 core is active  等待忙        ADC10SA = (unsigned int)adc_sample;   /数据传送开始地址寄存器  设置DTC的开始地址  Data buffer start   

79、0;    /设置数据开始传送的地址为数组adc_sample的首地址,因为寄存器ADC10SA和转换结果都是16位的,所以要把        /地址强制转换为16位的int或unsigned int        /应该也可以用指针直接访问DTC的存储区,还没试过        /例如:前面定义了单块传送4次数据,所

80、以每次传送完成了一个块,也就是4次,就会把中断标志位置位,产生中断        /因为上面设置的地址为数组adc_sample的首地址,所以每次转换的结果就会传送到该数组的前4位上,所以如果        /一切正常的话,数组里应该是前4位为转换的结果,后4位为初始值0  通过下面的显示,验证转换是正确的        /一次触发首先对

81、A1、A0采样,放入a0和a1中,再对A1、A0采样,放入a2和a3中。如此循环下去。        /验证得知,当多通道采样时,先采高的通道,再采低的通道。如上面每次采样时,先采A1 再A0        /因为一共采样传送4次,所以数组的后4位为初始值0         ADC10CTL0 |= ENC + ADC10SC; / Samplin

82、g and conversion start   ADC使能,开始转换 ADC10SC为采样触发源        /不需要cpu的干预,DTC就可以把采样结果存储到指定的存储区中        _bis_SR_register(CPUOFF + GIE);    / LPM0, ADC10_ISR will force exit  如果转换结果传送

83、完成,        /就会进入中断,CPU唤醒 继续往下运行        wr_int(2,0,adc_sample0);   /显示转换结果  A1        wr_int(6,0,adc_sample1);   /A0    &

84、#160;   wr_int(0,1,adc_sample2);   /A1        wr_int(3,1,adc_sample3);   /A0        wr_int(6,1,adc_sample4);        wr_int(0,2,adc_samp

85、le5);        wr_int(3,2,adc_sample6);        wr_int(6,2,adc_sample7);       / ADC10 interrupt service routine#pragma vector=ADC10_VECTOR_interrupt void ADC10_ISR(void)  /中断响应以

86、后,中断标志位自动清零  _bic_SR_register_on_exit(CPUOFF);        / Clear CPUOFF bit from 0(SR)上面的例子是把存储结果存储在了uint型的数组中。也可以用指针直接指定要存放的地址,然后再用指针进行访问(理论上可以,但还没有试过)。也可以把存储结果直接存放在一个16位的寄存器中,如:ADC10SA = (unsigned int)&TACCR1;      &#

87、160; / Data transfer location  把转换结果存储在TACCR1所在的    /位置处,就相当于存储在TACCR1中 因为ADC转换结果和寄存器TACCR1都是16位的,所以要把地址强制转换为16位的    /int 或 unsigned int型 5,ADC采样注意事项:用片上的ADC10进行采样,如果外部分压电路的电阻过大(比如几K以上),AD引脚会把电压拉高,使采样结果发生很大的偏差。应换成小电阻(几十几百欧),如果要求更精确的话,要加运放进行

88、电压跟随。  6,AD采样交流信号:一般是50Hz,100Hz,1000Hz。方法是在交流信号的一个周期内采样多次(如40次,30次等),然后利用公式可以求出交流信号的有效值,平均值等。  7,片上温度传感器ADC的A10通道接片上的温度传感器,MSP430内嵌的温度传感器实际上就是一个输出电压随环境温度而变化的温度二极管。当使用片上温度传感器时,采样周期必须大于30us    片上温度传感器的偏移很大,所以精确测量需要进行校准。选择片上温度传感器INCH_10,ADC其他的设置都和外部通道的设置相同,包括参考电压

89、源的选择和转换存储的选择选择了片上温度传感器,会自动地打开片上参考电压源发生器作为温度传感器的电压源,但是这并不会时能VREF+输出,也不会影响AD转换参考源的选择,转换参考源的选择和其他通道的选择相同公式为:VTEMP=0.00355(TEMPC)+0.986片上温度传感器的校准,可以参见我的温度传感器校准程序,也可以参考其他的论文。下面只给出程序的一部分:void ADC_init()ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; / ADC10ON, interrupt enabled 参考电压选默认值VCC和VSS/采样保持时间为16 x ADC

90、10CLKs,ADC开,中断使能ADC10CTL1 = INCH_10;       / ADC输入通道选择A10,为内部的温度传感器/其他是默认,采样触发输入源选择为ADC10SC,采样输入信号不翻转,转换时钟选择内部时钟源:ADC10OSC,3.76.3MHz/不分频,单通道单次转换/ADC10AE0 |= 0x02;                 &

91、#160;       / PA.1 ADC option select 使能模拟输入脚A1/P1DIR |= 0x01;                            / Set P1.0 to output direction 

92、 /所以是P11为ADC输入脚,P10控制led  (五),通用串行通信接口(USCI)   1,USCI_A:支持UART,  IrDA,  SPI      USCI_B:支持I2C, SPI   2,UART   这个模块没什么好说的,和其他的一写处理器如S12,ARM等差不多。只要设置好几个控制寄存器,波特率,写几个收发函数就可以了。下面就给出msp430g2553于P

93、C用UART通信的基本程序:#include  "msp430g2553.h"unsigned char rev;char *string1="Helloworld!"char string2="Get it!n"    /n是换行符void putchar(unsigned char c)    /发送字符函数while (!(IFG2&UCA0TXIFG);     

94、0;          / USCI_A0 TX buffer ready? 等待TX buffer为空UCA0TXBUF = c;                    / TX -> RXed character  发送字符cvoid putstr(char *s)&#

95、160;  /发送字符串函数IE2 &= UCA0RXIE;   /发送时先关闭接收中断,不接收while(*s)!='0')    /如果没有发完,就继续循环发送putchar(*s);/ putchar('n');     /发送换行符s+;IE2 |= UCA0RXIE;    /发送完了打开接收中断void main(void)  WDTCTL =

96、WDTPW + WDTHOLD;                 / Stop WDT  P1DIR=BIT0;  BCSCTL1 = CALBC1_1MHZ;                   &

97、#160;/ Set DCO 为1MHz  DCOCTL = CALDCO_1MHZ;  P1SEL = BIT1 + BIT2 ;                     / P1.1 = RXD, P1.2=TXD  P1SEL2 = BIT1 + BIT2;     /第二

98、外围模式选择/  UCA0CTL1 |= UCSSEL_2;           / SMCLK 其他默认:软件复位使能 USCI逻辑保持在复位状态,用于设置串口  /UCA0CTL0全部为默认状态:无奇偶校验,LSB first,8bit_data,一位停止位,UART模式,异步模式/  UCA0BR0 = 8;         

99、60;                    / SMCLK 1MHz 115200    8/  UCA0BR1 = 0;                  

100、            / 1MHz 115200/  UCA0MCTL = UCBRS2 + UCBRS0;               / Modulation UCBRSx = 5  /下面是选择ACLK,波特率设置为固定的  UCA0CTL1 |= UCSSEL

101、_1;      /ACLK  UCA0BR0 = 3;                              / ACLK 32768Hz 9600   32768Hz/9600 =

102、3.41  UCA0BR1 = 0;                              / 32768Hz 9600  UCA0MCTL = UCBRS1 + UCBRS0;      

103、60;        / Modulation UCBRSx = 3  UCA0CTL1 &= UCSWRST;                     / *Initialize USCI state machine*  初始化释放,可以操作 

104、60;IE2 |= UCA0RXIE;                          / Enable USCI_A0 RX interrupt  接收中断使能  _bis_SR_register(LPM0_bits + GIE);       / Enter LPM0, interrupts enabled/ Echo back RXed character, confirm TX buffer is ready first#pragma vector=USCIAB0RX_VECTOR_interrupt void USCI0RX_ISR(void)  while (!(IFG2&UCA0TXIFG); 

温馨提示

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

最新文档

评论

0/150

提交评论