历史上的今天
返回首页

历史上的今天

今天是:2025年04月03日(星期四)

正在发生

2020年04月03日 | MSP430G2553学习笔记——1

2020-04-03 来源:eefocus

一,MSP430G2553单片机的各个功能模块

(一),IO口模块,


1、我们所用的MSP430G2553有两组IO口,P1和P2。


2、IO口的寄存器有:方向选择寄存器PxDIR,输出寄存器PxOUT,输入寄存器PxIN,IO口内部上拉或下拉电阻使能寄存器PxREN, IO口功能选择寄存器PxSEL和PxSEL2,IO口中断使能寄存器PxIE,中断沿选择寄存器PxIES,IO口中断标志寄存器PxIFG。


3、所有的IO都带有中断,其中所有的P1口公用一个中断向量,所有的P2口公用一个中断向量。所以在使用中断时,当进入中断后,还要判断到底是哪一个IO口产生的中断,判断方法可以是判断各个IO口的电平。


4、中断标志PxIFG需要软件清除,也可以用软件置位,从而用软件触发一个中断。


注意:在设置PxIESx时根据PxINx有可能会引起相应的PxIFGx置位(具体的情况见用户指南),所以在初始化完IO口中断以后,正式使用IO中断前要先将对应的PxIFGx清零。程序如下:


void IO_interrupt_init()     //IO中断初始化函数


{


  P1REN |= BIT4+BIT5+BIT6+BIT7;     // pullup 内部上拉电阻使能


//使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断


P1OUT = BIT4+BIT5+BIT6+BIT7;   // 当引脚上的上拉或下拉电阻使能时,PxOUT选择是上拉还是下来


//0:下拉,1:上拉


  P1IE |= BIT4+BIT5+BIT6+BIT7;       // interrupt enabled P13中断使能


  P1IES |= BIT4+BIT5+BIT6+BIT7;          // Hi/lo edge  下降沿中断


  //P1IES &= ~BIT3;                         //上升沿触发中断


  P1IFG &= ~(BIT4+BIT5+BIT6+BIT7);         //中断标志位清零


}


5、PxOUT:如果引脚选择了内部的上拉或下拉电阻使能,则PxOUT设定电阻是上拉还是下拉,0:下拉,1:上拉


6、当IO口不用时,最好不要设为输入,且为浮动状态(这是IO口的默认状态),因为当输入为浮动时,输入电压有可能会在VIL和VIH之间,这样会产生击穿电流。所以不用的IO口可以设为输出状态,或设为输入状态但通过外围电路接至VCC或GND,或接一个上拉/下拉电阻。


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


#define CLR_RS P2OUT&=~BIT0;    //RS = P2.0


#define 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


8、g2553的P27和P26脚分别接外部晶体的输出和输入脚XOUT和XIN,默认是自动设为了晶振管脚功能,但是当想把它们用为普通的IO时,也可以,设置对应的SEL设为普通的IO即可,如下:


P2DIR |= BIT6+BIT7;    //把P26和P27配置为普通IO 并为输出脚  默认为晶振的输入和输出引脚 作为dac0832的


    P2SEL &= ~(BIT6+BIT7);   //cs和wr控制端


    P2SEL2 &= ~(BIT6+BIT7);


(二),时钟系统


1、msp430能做到超低功耗,合理的时钟模块是功不可没的。但是功能强大的时钟模块设置起来也相对复杂一些。


2、msp430的时钟源有:


(1)、外接低频晶振LFXT1CLK:低频模式接手表晶体32768Hz,高频模式450KHz~8MHz;


(2)、外接高速晶振XT2CLK:8MHz;


(3)、内部数字控制振荡器DCO:是一个可控的RC振荡器,频率在0~16MHz;


(4)、超低功耗低频振荡器VLO:不可控,4~20KHz 典型值为12KHz;


3、时钟模块:430的时钟模块有MCLK  SMCLK  ACLK :


(1)、主系统时钟MCLK:提供给MSP430的CPU时钟。可以来自LFXT1CLK  XT2CLK  DCO  VLO可选,默认为DCO。


(2)、子系统时钟SMCLK: 提供给高速外设。可以来自LFXT1CLK  XT2CLK  DCO  VLO可选,默认为DCO。


(3)、辅助系统时钟ACLK:提供给低速外设。可来自LFXT1CLK  VLO。 


4、内部的振荡器DCO和VLO提供的时钟频率不是很精确,随外部环境变化较大。


DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。DCO可以用CCS提供的宏定义进行相对比较精确的设置,如下:


DCOCTL = CALDCO_12MHZ;   //DCO设为12MHz   这种方法设DCO频率比较精确,实际测得为12.08MHz左右 正弦波


BCSCTL1 = CALBC1_12MHZ;


用这种方法可以设置1,8,12,16MHz


宏定义如下:


#ifndef __DisableCalData


SFR_8BIT(CALDCO_16MHZ);                       


SFR_8BIT(CALBC1_16MHZ);                       


SFR_8BIT(CALDCO_12MHZ);                       


SFR_8BIT(CALBC1_12MHZ);                       


SFR_8BIT(CALDCO_8MHZ);                        


SFR_8BIT(CALBC1_8MHZ);                        


SFR_8BIT(CALDCO_1MHZ);                        


SFR_8BIT(CALBC1_1MHZ);                        


#endif 


5、使用超低功耗低频振荡器VLO可以很大程度地降低系统功耗,下面的例子是设置ACLK为VLO,MCLK为VLO的8分频:


#include 


//1延时


//#define CPU_F ((double)16000000)//cpu frequency16000000


#define CPU_F ((double)1630)//cpu frequency1630   //CPU的实际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;                  // Volatile to prevent removal


  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer


  BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO  低频时钟选择为VLO ACLK选为VLO


  IFG1 &= ~OFIFG;                           // Clear OSCFault flag  清除振荡器错误中断标志


  __bis_SR_register(SCG1 + SCG0);           // Stop DCO  SCG1禁止SMCLK  SCG0禁止DCO


  BCSCTL2 |= SELM_3 + DIVM_3;               // MCLK = LFXT1/8


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


  P1DIR = 0xFF;                             // All P1.x outputs


  P1OUT = 0;                                // All P1.x reset


  P2DIR = 0xFF;                             // All P2.x outputs


  P2OUT = 0;                                // All P2.x reset


  P1SEL |= BIT0+BIT4;                // P10 P14options  功能选择为外围模块


  //p10输出ACLK,来自VLO,p14输出SMCLK,  因为禁止了SMCLK,所以P14脚无波形输出


  //VLO典型值为12KHz  实际用示波器测得为:13.05KHz 左右波动


  //所以CPU的实际MCLK大约为13.05/8=1.63KHz


  for (;;)


  {


    P1OUT ^= BIT6;          // P1.6 闪烁


    delay_ms(1000);


  }


}


6、如上面的程序所示,其中的延迟函数用那种方法,使用系统的延迟周期函数__delay_cycles(int n); 可以达到比较精确的延迟,如下:


//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))


//2空函数


#define nop() _NOP();


7、系统上电后默认使用的是DCO时钟,DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。


(三)、定时器Timer_A


1、MSP430g2553具有两个16位的定时器:Timer0_A   Timer1_A。分别具有三个捕捉/比较寄存器,具有输入捕捉,输出比较功能。可以产生定时中断,也可以产生PWM。


2、产生PWM,例子如下:


#include


 void Timer_A0_1_init()  //TA0.1输出PWM


{


TACTL|= TASSEL_1+MC_1;//ACLK,增计数


CCTL1=OUTMOD_7;//输出模式为复位/置位


CCR0=328;//时钟频率为32768HZ,100HZ


//CCR1=164;//时钟频率为32768HZ,占空比CCR1/CCR0=50%


CCR1=109;//占空比CCR1/CCR0=1/3                              TA0.1由P1.2 P1.6输出


}


 void Timer_A1_2_init()    //TA1.2输出PWM


{


TA1CTL|= TASSEL_1+MC_1;//ACLK,增计数


TA1CCTL2=OUTMOD_7;//输出模式为复位/置位,注意CCTL2要写为TA1CCTL2


TA1CCR0=164;//时钟频率为32768HZ,波形32768/CCR0=199HZ


TA1CCR2=41;//占空比CCR2/CCR0=1/4,注意CCR2要写成TA1CCR2       TA1.2由P2.4 P2.5输出


}


 void Timer_A1_1_init()   //TA1.1输出PWM


 {


 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


 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;


    IO_init();


Timer_A0_1_init();


Timer_A1_2_init();


Timer_A1_1_init();


_BIS_SR(CPUOFF);                          // Enter LPM0  进入低功耗模式0 SMCLK ON,ACLK ON


}


3、Timer_A的捕获/比较寄存器


TAR寄存器是Timer_A的16位的计数寄存器。TACCRx是Timer_A的捕获/比较寄存器,当为捕获模式时:当捕获发生时,把TAR的值装载到TACCRx中。当为比较模式时:TACCRx中装的是要与TAR寄存器相比较的值。


4、捕获模式


捕获外部输入的信号的上升沿或下降沿或上升沿下降沿都捕捉,当捕捉发生时,把TAR的值装载到TACCRx中,同时也可以进入中断,执行相应的操作。这样利用捕捉上升沿或下降沿就可以计算外部输入信号的周期,得出频率。利用捕捉上升沿和下降沿可以得出输入信号的高电平或低电平的持续时间。也可以算出占空比。下面是一个例子,是Timer_A捕获初始化的程序:


void timer_init()      //使用Timer1_A时要特别注意各个寄存器的写法,因为Timer0_A的寄存器都简写了,所以在写


//Timer1_A的寄存器时,要特别注意与Timer0_A的不同


{


P1SEL |= BIT2;    //选择P12作为捕捉的输入端子  Timer0_A


 //TACCTL1 |=CM_3+SCS+CAP+CCIE;  //上下沿都触发捕捉,用于测脉宽,同步模式、时能中断  CCI1A


TACCTL1 |=CM_1+SCS+CAP+CCIE;  //上升沿触发捕捉,同步模式、时能中断  CCI1A


    TACTL |= TASSEL1+MC_2;  //选择SMCLK时钟作为计数时钟源,不分频   增计数模式不行,必须连续计数模式


  P2SEL |= BIT1;    //选择P21作为捕捉的输入端子    Timer1_A


  //TA1CCTL1 |=CM_3+SCS+CAP+CCIE;  //上下沿都触发捕捉,用于测脉宽,同步模式、时能中断  CCI1A


  TA1CCTL1 |=CM_1+SCS+CAP+CCIE;  //上升沿触发捕捉,同步模式、时能中断  CCI1A


  TA1CTL |= TASSEL1+MC_2;  //选择SMCLK时钟作为计数时钟源,不分频   增计数模式不行,必须连续计数模式


}


相对应的中断函数如下:


#pragma vector=TIMER0_A1_VECTOR   //Timer0_A CC1  的中断向量


__interrupt void Timer_A(void)


{


// CCI0A 使用的捕捉比较寄存器是TA0CCR0,TA0CCR0单独分配给一个


    //中断向量TIMER1_A0_VECTOR,所以进入中断后直接就是Timer0_A CC0产生的中断,不用经过类似


   //下面的方法判断中断源了  。


//Timer0_A CC1-4, TA0公用一个中断向量 TIMER0_A1_VECTOR,所以进入了中断后还要用下面


    //的方法进行判断是哪一个中断源产生的中断


  switch(TAIV)    //如果是Timer0_A CC1产生的中断


  {


  case 2:


   {


   flag=1;


   LPM1_EXIT;      //退出低功耗模式


  // _BIC_SR_IRQ(LPM1_bits);


   //_bic_SR_register_on_exit(LPM1_bits);


   break;


   }


  case 4: break;


  case 10:break;


  }


}


#pragma vector=TIMER1_A1_VECTOR      //Timer1_A CC1  的中断向量


__interrupt void Timer_A1(void)


{


// P1OUT|=BIT0;  //led调试用的


// LPM1_EXIT;      //退出低功耗模式  因为使用的是CCI0A 使用的捕捉比较寄存器是TA1CCR0,TA1CCR0单独分配给一个


                //中断向量TIMER1_A0_VECTOR,所以进入中断后直接就是Timer1_A CC0产生的中断,不用经过类似

推荐阅读

史海拾趣

巨盛电子(Chesen)公司的发展小趣事

在电子行业,成本控制对于企业的竞争力至关重要。巨盛电子(Chesen)通过优化供应链管理,实现了成本的降低。公司与供应商建立了长期稳定的合作关系,实现了原材料的规模化采购和成本控制。同时,公司还加强了对生产过程的监控和管理,降低了生产过程中的浪费和损耗。这些措施使得巨盛电子在保持产品质量的同时,实现了成本的降低,提高了企业的盈利能力。

Advanced Analog公司的发展小趣事

创新是Advanced Analog公司发展的核心动力。公司始终坚持自主研发和技术创新,不断推出新的产品和技术。这些新产品不仅满足了市场的多样化需求,也进一步巩固了公司在电源管理IC领域的领先地位。同时,Advanced Analog还积极关注行业发展趋势和未来技术走向,为公司的长远发展做好战略布局。

ENPIRION公司的发展小趣事

经过数年的研发和技术积累,ENPIRION公司在2004年推出了其首款革命性的产品——将电感集成的DCDC芯片。这款产品的问世引起了业界的广泛关注,因为它极大地减小了负载点稳压所需要的PCB面积和高度,实现了最高功率密度和最小外形封装。这一创新不仅获得了EDN 2004年度全球电源IC最佳产品奖,还赢得了其他众多国际大奖,为ENPIRION公司赢得了业界的广泛认可。

Gulf Semiconductor公司的发展小趣事

随着ENPIRION公司产品的不断推出和市场的逐步扩大,公司开始寻求与各大电子制造商的合作。通过与小米、OPPO、vivo等知名品牌建立合作关系,ENPIRION公司的电源管理解决方案得到了更广泛的应用,进一步提升了其市场影响力和竞争力。这些合作伙伴关系的建立不仅为ENPIRION公司带来了更多的商业机会,也为其技术创新和产品升级提供了更广阔的平台。

Hi-Light Electronic Co Ltd公司的发展小趣事

在电源管理领域,ENPIRION公司不断面临各种技术挑战。例如,如何满足企业级、工业级、通信等市场对产品的高可靠性要求?如何提供最优的电源转换率以降低成本和散热?为了应对这些挑战,ENPIRION公司不断投入研发力量,推出了一系列创新的电源管理解决方案。这些解决方案不仅满足了市场的需求,还进一步巩固了ENPIRION公司在电源管理领域的领先地位。

DCD [Digital Core Design]公司的发展小趣事

在快速变化的市场环境中,创新成为DCD公司持续发展的关键。公司不断加大研发投入,鼓励员工提出创新性的想法和建议。同时,公司还积极引进国内外先进的技术和管理经验,为公司的发展注入了新的活力。在创新驱动下,DCD公司不断推出具有竞争力的新产品和解决方案,赢得了客户的广泛赞誉和市场的持续认可。

问答坊 | AI 解惑

mos管

MOS管的阈值电压等于backgate和source接在一起时形成channel需要的gate对source偏置电压。如果gate对source偏置电压小于阈值电压,就没有channel。一个特定的晶体管的阈值电压和很多因素有关,包括backgate的掺杂,电介质的厚度,gate ...…

查看全部问答>

build 和compile 的区别?

keil uv3 中 build      target     “target1” compile   *.1c compile   *.2c compile   *.3c compile   *.4c link… programsize… error warning… ...…

查看全部问答>

业内春哥爆料 君正4725 4755的惊天揭秘!

1、 君正的4725的ECC纠错能力 实际上只有4bit ECC,也就是说现在用的50nm的Flash(8bit ECC纠错需求)他们都是支持不好的,何况12bit ECC纠错需求的Flash(34nm的Micron、Intel Flash)。所以君正4725的百分之十几的返修,很多是掉程序造成的。 ...…

查看全部问答>

电子大赛须知

本帖最后由 paulhyde 于 2014-9-15 09:37 编辑 9月2日上午7:30报到,带学生证进行核实。 1、设计报告。 2、实物。 3、登记表。 4、专科10后接 01-04,本科11后接 01-15:本组:1107 冯琦:1106 老马:1108。 5、论文要求: 1:8000字之内 ...…

查看全部问答>

JPG图片的显示问题?

下面是在网上找的代码,可是不知为什么报这样的错误? Mywork.obj   :   error   LNK2019:   unresolved   external   symbol   __imp__OleLoadPicture   refere ...…

查看全部问答>

keil中关于片外RAM的疑问

MOV A,#30H MOV R1,#0E0H MOVX @R1,A MOVX A,@R1复制代码 意思是一个对片外RAM操作的,用keil下自带的模拟下,调用内存,输入I:0e0h,现实的是00,为什么啊?不是应该是30h的嘛?? 最终的a的值是30h,但是片外里面显示的是00,怎么回事啊??…

查看全部问答>

-----海腾数据◇庆圣诞迎元旦◇推出以下活动:-----

-----海腾数据◇庆圣诞迎元旦◇推出以下活动:----- ◇河南网通◇Intel PD双核915芯片散热CPU4M缓存-本月限量销售一年送产权6800元 CPU处理器:Intel PD 915双核处理器( 4M缓存) 内存:1024MB DDR2内存 硬盘:160GB SATA2硬盘/7200转 网卡:Inte ...…

查看全部问答>

利用ADF7023和RFFM6901 915 MHz ISM频段收发模块实现的一种范围扩展参考设计

本帖最后由 雨中 于 2014-11-12 08:41 编辑 利用ADF7023和RFFM6901 915 MHz ISM频段收发模块(带分集开关)实现的一种范围扩展参考设计下载 …

查看全部问答>

【TI首届低功耗设计大赛】GPS定位与数据提取

本帖最后由 tianshuihu 于 2015-1-7 15:26 编辑 串口获得GPS数据之后,接下来就看MSP430FR5969的处理了 我这里用到的GPS模块为VK16U16,3.3V供电 GPS模块VK16其输出数据遵循NMEA0183协议 其中;GGA格式的数据包含了经纬度信息,对于我的应 ...…

查看全部问答>

verilog编写问题

verilog程序修改后为什么新添加的管脚没有输出,是因为配置文件的问题吗?…

查看全部问答>