[资料分享] MSP430的时钟系统问题

Aguilera   2018-4-22 13:06 楼主
TI的430系列主打是低功耗,它的技术文档和Dome程序都非常详细,尤其是技术文档真让人有种膜拜的感觉,在每个模块的时候还有个框图,对理解模块内设置非常有帮助,我当时还特意打印了。当时它的User's Guide还没有中文版,如果实在看不懂,可以借鉴F149系列的(这款有人翻译了中文版本)。

个人觉得在学习g2553这款单片机中,主要注意的点:

(1)注意低功耗的使用,选用不同的模式。

(2)IO的设置,由于IO口比较少,复用的比较严重,当时 一直纠结IO口的REN与OUT,DIR的问题,下面这个表概括详细,总结I/O 口配置时PxDIRx、PxRENx和PxOUTx寄存器的用法


PxDIRx          PxRENx       PxOUTx       I/O 口配置  
                 0                0                 x                输入   
                 0                1                 0               
置低
                 0                1                 1               
置高
                 1                x                 x                输出


其他具体的由于当时的笔记找不到,就不能一一说明了。

下面是比较实用的G2553框架程序:


[objc] view plain copy
#include   

//函数声明   
void InitSys();   


int main( void )   
{   

     WDTCTL = WDTPW + WDTHOLD; //关闭看门狗   

     InitSys(); //初始化   

     start:   
     //以下填充用户代码   


     LPM3; //进入低功耗模式n,n:0~4。若不希望进入低功耗模式,屏蔽本句   
     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.0~P1IFG7  
进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断  
******************************************************************************/   
#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中断函数  
多中断中断源:CC1~2 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转换器中断函数  
多中断源:摸拟0~7、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; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽   
}   

/*****************************************************************************  
定时器B中断函数  
多中断源:CC1~6 TB  
******************************************************************************/   
#pragma vector=TIMERB1_VECTOR   
__interrupt void TimerB1()   
{   
     //以下为参考处理程序,不使用的中断源应当删除   
     switch (__even_in_range(TBIV, 14))   
     {   
     case 2:   
           //捕获/比较1中断   
           //以下填充用户代码   

           break;   
     case 4:   
           //捕获/比较2中断   
           //以下填充用户代码   

           break;   
     case 6:   
           //捕获/比较3中断   
           //以下填充用户代码   

           break;   
     case 8:   
           //捕获/比较4中断   
           //以下填充用户代码   

           break;   
     case 10:   
           //捕获/比较5中断   
           //以下填充用户代码   

           break;   
     case 12:   
           //捕获/比较6中断   
           //以下填充用户代码   

           break;   
     case 14:   
           //TBIFG定时器溢出中断   
           //以下填充用户代码   

           break;   
     }   

     LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽   
}   

/*****************************************************************************  
定时器B中断函数  
中断源:CC0  
******************************************************************************/   
#pragma vector=TIMERB0_VECTOR   
__interrupt void TimerB0()   
{   
     //以下填充用户代码   

     LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽   
}   

/*****************************************************************************  
不可屏蔽中断函数  
******************************************************************************/   
#pragma vector=NMI_VECTOR   
__interrupt void Nmi()   
{   
     //以下为参考处理程序,不使用的中断源应当删除   
     if((IFG1&OFIFG)==OFIFG)   
     {   
           //振荡器失效   
           IFG1 &= ~OFIFG;   
           //以下填充用户代码   

     }   
     else if((IFG1&NMIIFG)==NMIIFG)   
     {   
           //RST/NMI不可屏蔽中断   
           IFG1 &= ~NMIIFG;   
           //以下填充用户代码   

     }   
     else //if((FCTL3&ACCVIFG)==ACCVIFG)   
     {   
           //存储器非法访问   
           FCTL3 &= ~ACCVIFG;   
           //以下填充用户代码   

     }   

     LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽   
}   

/*****************************************************************************  
基本定时器中断函数  
******************************************************************************/   
#pragma vector=BASICTIMER_VECTOR   
__interrupt void BasTimer()   
{   
     //以下填充用户代码   

     LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽   
}  
时延函数(注意选择时钟)

[objc] view plain copy
//1us延时函数  
void delay_1us(void) {  
        asm("nop");  
}  
//N us延时函数  
void delay_nus(unsigned int n) {  
        unsigned int i;  
        for (i = 0; i < n; i++)  
                delay_1us();  
}  
//1ms延时函数  
void delay_1ms(void) {  
        unsigned int i;  
        for (i = 0; i < 1140; i++)  
                ;  
}  
//N ms延时函数  
void delay_nms(unsigned int n) {  
        unsigned int i = 0;  
        for (i = 0; i < n; i++)  
                delay_1ms();  
}   

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复