×
嵌入式 > 技术百科 > 详情

msp430g2553单片机学习心得

发布时间:2020-06-19 发布时间:
|

四年前学习的TI的Msp430g2553这款单片机,最近在整理学习记录的时候把当时的学习心得重新写下来。学习单片机最早是学习的51系列的,看的也是广为推崇的郭天祥郭老师的《十天学习单片机》,个人觉得单片机学习还是最先攻克51的。学习好51之后,对单片机操作有了基本的认识,再学习其他款单片机自然是能融会贯通。

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框架程序:


  1. #include   

  2.   

  3. //函数声明   

  4. void InitSys();   

  5.   

  6.   

  7. int main( void )   

  8. {   

  9.        

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

  11.        

  12.      InitSys(); //初始化   

  13.        

  14.      start:   

  15.      //以下填充用户代码   

  16.        

  17.        

  18.      LPM3; //进入低功耗模式n,n:0~4。若不希望进入低功耗模式,屏蔽本句   

  19.      goto start;   

  20.        

  21. }   

  22.   

  23. /*****************************************************************************  

  24. 系统初始化  

  25. ******************************************************************************/   

  26. void InitSys()   

  27. {   

  28.      unsigned int iq0;   

  29.        

  30.      //使用XT2振荡器   

  31.      BCSCTL1&=~XT2OFF; //打开XT2振荡器   

  32.      do   

  33.      {   

  34.            IFG1 &= ~OFIFG; // 清除振荡器失效标志   

  35.            for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振   

  36.      }   

  37.      while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振   

  38.        

  39.      BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2   

  40.        

  41.      //以下填充用户代码,对各种模块、中断、外围设备等进行初始化   

  42.        

  43.      _EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句   

  44. }   

  45.   

  46. /*****************************************************************************  

  47. 端口2中断函数  

  48. ******************************************************************************/   

  49. #pragma vector=PORT2_VECTOR   

  50. __interrupt void Port2()   

  51. {   

  52.      //以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。   

  53.      if((P2IFG&BIT0) == BIT0)   

  54.      {   

  55.            //处理P2IN.0中断   

  56.            P2IFG &= ~BIT0; //清除中断标志   

  57.            //以下填充用户代码   

  58.              

  59.      }   

  60.      else if((P2IFG&BIT1) ==BIT1)   

  61.      {   

  62.            //处理P2IN.1中断   

  63.            P2IFG &= ~BIT1; //清除中断标志   

  64.            //以下填充用户代码   

  65.              

  66.      }   

  67.      else if((P2IFG&BIT2) ==BIT2)   

  68.      {   

  69.            //处理P2IN.2中断   

  70.            P2IFG &= ~BIT2; //清除中断标志   

  71.            //以下填充用户代码   

  72.              

  73.      }   

  74.      else if((P2IFG&BIT3) ==BIT3)   

  75.      {   

  76.            //处理P2IN.3中断   

  77.            P2IFG &= ~BIT3; //清除中断标志   

  78.            //以下填充用户代码   

  79.              

  80.      }   

  81.      else if((P2IFG&BIT4) ==BIT4)   

  82.      {   

  83.            //处理P2IN.4中断   

  84.            P2IFG &= ~BIT4; //清除中断标志   

  85.            //以下填充用户代码   

  86.              

  87.      }   

  88.      else if((P2IFG&BIT5) ==BIT5)   

  89.      {   

  90.            //处理P2IN.5中断   

  91.            P2IFG &= ~BIT5; //清除中断标志   

  92.            //以下填充用户代码   

  93.              

  94.      }   

  95.      else if((P2IFG&BIT6) ==BIT6)   

  96.      {   

  97.            //处理P2IN.6中断   

  98.            P2IFG &= ~BIT6; //清除中断标志   

  99.            //以下填充用户代码   

  100.              

  101.      }   

  102.      else   

  103.      {   

  104.            //处理P2IN.7中断   

  105.            P2IFG &= ~BIT7; //清除中断标志   

  106.            //以下填充用户代码   

  107.              

  108.      }   

  109.        

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

  111. }   

  112.   

  113. /*****************************************************************************  

  114. USART1发送中断函数  

  115. ******************************************************************************/   

  116. #pragma vector=USART1TX_VECTOR   

  117. __interrupt void Usart1Tx()   

  118. {   

  119.      //以下填充用户代码   

  120.        

  121.        

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

  123. }   

  124.   

  125. /*****************************************************************************  

  126. USART1接收中断函数  

  127. ******************************************************************************/   

  128. #pragma vector=USART1RX_VECTOR   

  129. __interrupt void Ustra1Rx()   

  130. {   

  131.      //以下填充用户代码   

  132.        

  133.        

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

  135. }   

  136.   

  137. /*****************************************************************************  

  138. 端口1中断函数  

  139. 多中断中断源:P1IFG.0~P1IFG7  

  140. 进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断  

  141. ******************************************************************************/   

  142. #pragma vector=PORT1_VECTOR   

  143. __interrupt void Port1()   

  144. {   

  145.      //以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。   

  146.      if((P1IFG&BIT0) == BIT0)   

  147.      {   

  148.            //处理P1IN.0中断   

  149.            P1IFG &= ~BIT0; //清除中断标志   

  150.            //以下填充用户代码   

  151.              

  152.      }   

  153.      else if((P1IFG&BIT1) ==BIT1)   

  154.      {   

  155.            //处理P1IN.1中断   

  156.            P1IFG &= ~BIT1; //清除中断标志   

  157.            //以下填充用户代码   

  158.              

  159.      }   

  160.      else if((P1IFG&BIT2) ==BIT2)   

  161.      {   

  162.            //处理P1IN.2中断   

  163.            P1IFG &= ~BIT2; //清除中断标志   

  164.            //以下填充用户代码   

  165.              

  166.      }   

  167.      else if((P1IFG&BIT3) ==BIT3)   

  168.      {   

  169.            //处理P1IN.3中断   

  170.            P1IFG &= ~BIT3; //清除中断标志   

  171.            //以下填充用户代码   

  172.              

  173.      }   

  174.      else if((P1IFG&BIT4) ==BIT4)   

  175.      {   

  176.            //处理P1IN.4中断   

  177.            P1IFG &= ~BIT4; //清除中断标志   

  178.            //以下填充用户代码   

  179.              

  180.      }   

  181.      else if((P1IFG&BIT5) ==BIT5)   

  182.      {   

  183.            //处理P1IN.5中断   

  184.            P1IFG &= ~BIT5; //清除中断标志   

  185.            //以下填充用户代码   

  186.              

  187.      }   

  188.      else if((P1IFG&BIT6) ==BIT6)   

  189.      {   

  190.            //处理P1IN.6中断   

  191.            P1IFG &= ~BIT6; //清除中断标志   

  192.            //以下填充用户代码   

  193.              

  194.      }   

  195.      else   

  196.      {   

  197.            //处理P1IN.7中断   

  198.            P1IFG &= ~BIT7; //清除中断标志   

  199.            //以下填充用户代码   

  200.              

  201.      }   

  202.        

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

  204. }   

  205.   

  206. /*****************************************************************************  

  207. 定时器A中断函数  

  208. 多中断中断源:CC1~2 TA  

  209. ******************************************************************************/   

  210. #pragma vector=TIMERA1_VECTOR   

  211. __interrupt void TimerA1()   

  212. {   

  213.      //以下为参考处理程序,不使用的中断源应当删除   

  214.      switch (__even_in_range(TAIV, 10))   

  215.      {   

  216.      case 2:   

  217.            //捕获/比较1中断   

  218.            //以下填充用户代码   

  219.              

  220.            break;   

  221.      case 4:   

  222.            //捕获/比较2中断   

  223.            //以下填充用户代码   

  224.              

  225.            break;   

  226.      case 10:   

  227.            //TAIFG定时器溢出中断   

  228.            //以下填充用户代码   

  229.              

  230.            break;   

  231.      }   

  232.        

  233.        

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

  235. }   

  236.   

  237. /*****************************************************************************  

  238. 定时器A中断函数  

  239. 中断源:CC0  

  240. ******************************************************************************/   

  241. #pragma vector=TIMERA0_VECTOR   

  242. __interrupt void TimerA0()   

  243. {   

  244.      //以下填充用户代码   

  245.        

  246.        

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

  248. }   

  249.   

  250. /*****************************************************************************  

  251. AD转换器中断函数  

  252. 多中断源:摸拟0~7、VeREF+、VREF-/VeREF-、(AVcc-AVss)/2  

  253. 没有处理ADC12TOV和ADC12OV中断标志  

  254. ******************************************************************************/   

  255. #pragma vector=ADC_VECTOR   

  256. __interrupt void Adc()   

  257. {   

  258.      //以下为参考处理程序,不使用的中断源应当删除   

  259.      if((ADC12IFG&BIT0)==BIT0)   

  260.      {   

  261.            //通道0   

  262.            //以下填充用户代码   

  263.              

  264.      }   

  265.      else if((ADC12IFG&BIT1)==BIT1)   

  266.      {   

  267.            //通道1   

  268.            //以下填充用户代码   

  269.              

  270.      }   

  271.      else if((ADC12IFG&BIT2)==BIT2)   

  272.      {   

  273.            //通道2   

  274.            //以下填充用户代码   

  275.              

  276.      }   

  277.      else if((ADC12IFG&BIT3)==BIT3)   

  278.      {   

  279.            //通道3   

  280.            //以下填充用户代码   

  281.              

  282.      }   

  283.      else if((ADC12IFG&BIT4)==BIT4)   

  284.      {   

  285.            //通道4   

  286.            //以下填充用户代码   

  287.              

  288.      }   

  289.      else if((ADC12IFG&BIT5)==BIT5)   

  290.      {   

  291.            //通道5   

  292.            //以下填充用户代码   

  293.              

  294.      }   

  295.      else if((ADC12IFG&BIT6)==BIT6)   

  296.      {   

  297.            //通道6   

  298.            //以下填充用户代码   

  299.              

  300.      }   

  301.      else if((ADC12IFG&BIT7)==BIT7)   

  302.      {   

  303.            //通道7   

  304.            //以下填充用户代码   

  305.              

  306.      }   

  307.      else if((ADC12IFG&BIT8)==BIT8)   

  308.      {   

  309.            //VeREF+   

  310.            //以下填充用户代码   

  311.              

  312.      }   

  313.      else if((ADC12IFG&BIT9)==BIT9)   

  314.      {   

  315.            //VREF-/VeREF-   

  316.            //以下填充用户代码   

  317.              

  318.      }   

  319.      else if((ADC12IFG&BITA)==BITA)   

  320.      {   

  321.            //温度   

  322.            //以下填充用户代码   

  323.              

  324.      }   

  325.      else if((ADC12IFG&BITB)==BITB)   

  326.      {   

  327.            //(AVcc-AVss)/2   

  328.            //以下填充用户代码   

  329.              

  330.      }   

  331.        

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

  333. }   

  334.   

  335. /*****************************************************************************  

  336. USART0发送中断函数  

  337. ******************************************************************************/   

  338. #pragma vector=USART0TX_VECTOR   

  339. __interrupt void Usart0Tx()   

  340. {   

  341.      //以下填充用户代码   

  342.        

  343.        

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

  345. }   

  346.   

  347. /*****************************************************************************  

  348. USART0接收中断函数  

  349. ******************************************************************************/   

  350. #pragma vector=USART0RX_VECTOR   

  351. __interrupt void Usart0Rx()   

  352. {   

  353.      //以下填充用户代码   

  354.        

  355.        

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

  357. }   

  358.   

  359. /*****************************************************************************  

  360. 看门狗定时器中断函数  

  361. ******************************************************************************/   

  362. #pragma vector=WDT_VECTOR   

  363. __interrupt void WatchDog()   

  364. {   

  365.      //以下填充用户代码   

  366.        

  367.        

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

  369. }   

  370.   

  371. /*****************************************************************************  

  372. 比较器A中断函数  

  373. ******************************************************************************/   

  374. #pragma vector=COMPARATORA_VECTOR   

  375. __interrupt void ComparatorA()   

  376. {   

  377.      //以下填充用户代码   

  378.        

  379.        

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

  381. }   

  382.   

  383. /*****************************************************************************  

  384. 定时器B中断函数  

  385. 多中断源:CC1~6 TB  

  386. ******************************************************************************/   

  387. #pragma vector=TIMERB1_VECTOR   

  388. __interrupt void TimerB1()   

  389. {   

  390.      //以下为参考处理程序,不使用的中断源应当删除   

  391.      switch (__even_in_range(TBIV, 14))   

  392.      {   

  393.      case 2:   

  394.            //捕获/比较1中断   

  395.            //以下填充用户代码   

  396.              

  397.            break;   

  398.      case 4:   

  399.            //捕获/比较2中断   

  400.            //以下填充用户代码   

  401.              

  402.            break;   

  403.      case 6:   

  404.            //捕获/比较3中断   

  405.            //以下填充用户代码   

  406.              

  407.            break;   

  408.      case 8:   

  409.            //捕获/比较4中断   

  410.            //以下填充用户代码   

  411.              

  412.            break;   

  413.      case 10:   

  414.            //捕获/比较5中断   

  415.            //以下填充用户代码   

  416.              

  417.            break;   

  418.      case 12:   

  419.            //捕获/比较6中断   

  420.            //以下填充用户代码   

  421.              

  422.            break;   

  423.      case 14:   

  424.            //TBIFG定时器溢出中断   

  425.            //以下填充用户代码   

  426.              

  427.            break;   

  428.      }   

  429.        

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

  431. }   

  432.   

  433. /*****************************************************************************  

  434. 定时器B中断函数  

  435. 中断源:CC0  

  436. ******************************************************************************/   

  437. #pragma vector=TIMERB0_VECTOR   

  438. __interrupt void TimerB0()   

  439. {   

  440.      //以下填充用户代码   

  441.        

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

  443. }   

  444.   

  445. /*****************************************************************************  

  446. 不可屏蔽中断函数  

  447. ******************************************************************************/   

  448. #pragma vector=NMI_VECTOR   

  449. __interrupt void Nmi()   

  450. {   

  451.      //以下为参考处理程序,不使用的中断源应当删除   

  452.      if((IFG1&OFIFG)==OFIFG)   

  453.      {   

  454.            //振荡器失效   

  455.            IFG1 &= ~OFIFG;   

  456.            //以下填充用户代码   

  457.              

  458.      }   

  459.      else if((IFG1&NMIIFG)==NMIIFG)   

  460.      {   

  461.            //RST/NMI不可屏蔽中断   

  462.            IFG1 &= ~NMIIFG;   

  463.            //以下填充用户代码   

  464.              

  465.      }   

  466.      else //if((FCTL3&ACCVIFG)==ACCVIFG)   

  467.      {   

  468.            //存储器非法访问   

  469.            FCTL3 &= ~ACCVIFG;   

  470.            //以下填充用户代码   

  471.              

  472.      }   

  473.        

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

  475. }   

  476.   

  477. /*****************************************************************************  

  478. 基本定时器中断函数  

  479. ******************************************************************************/   

  480. #pragma vector=BASICTIMER_VECTOR   

  481. __interrupt void BasTimer()   

  482. {   

  483.      //以下填充用户代码   

  484.        

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

  486. }  

时延函数(注意选择时钟)


  1. //1us延时函数  

  2. void delay_1us(void) {  

  3.         asm("nop");  

  4. }  

  5. //N us延时函数  

  6. void delay_nus(unsigned int n) {  

  7.         unsigned int i;  

  8.         for (i = 0; i 

  9.                 delay_1us();  

  10. }  

  11. //1ms延时函数  

  12. void delay_1ms(void) {  

  13.         unsigned int i;  

  14.         for (i = 0; i 

  15.                 ;  

  16. }  

  17. //N ms延时函数  

  18. void delay_nms(unsigned int n) {  

  19.         unsigned int i = 0;  

  20.         for (i = 0; i 

  21.                 delay_1ms();  

  22. }   


 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Semtech的LoRa技术携手Chipsafer将牧场连接至云端