【转】Launchpad USI

2019-07-20 14:41发布

[cpp] view plain copy
print?

  • #include <msp430g2231.h>  
  •   
  •   
  • void main(void)  
  • {  
  •   WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer  
  •   BCSCTL3 |= LFXT1S_2;                      // ACLK = VLO  
  •   P1DIR |= 0x01;                            // Set P1.0 to output direction  
  •   USICTL0 |= USIMST;                        // Master mode  
  •   USICTL1 |= USIIE;                         // Counter interrupt, flag remains set  
  •   USICKCTL = USIDIV_7 + USISSEL_1;          // /128 ACLK  
  •   USICTL0 &= ~USISWRST;                     // USI released for operation  
  •   _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/ interrupt  
  • }  
  •   
  •   
  • // USI interrupt service routine  
  • #pragma vector=USI_VECTOR  
  • __interrupt void universal_serial_interface(void)  
  • {  
  •   P1OUT ^= 0x01;                            // Toggle P1.0 using exclusive-OR  
  •   USICNT = 0x1F;                            // re-load counter  
  • }  




这是官方的一个源程序,下载到Launchpad-G2板子上的效果是红 {MOD}LED灯闪烁(我一般都是先把程序下载进去看效果,然后再研究程序)
现在结合官方手册来一步步分析程序的运行情况:
前面的那几句相信不用我说了,下面从 USICTL1 |= USIIE;                         // Counter interrupt, flag remains set这句说起,该句程序的作用是使能计数中断,并且中断标志位置1


从手册中可以看到USIIFG初始值就为1.程序刚开始就已经挂起中断了

USICKCTL = USIDIV_7 + USISSEL_1;         // /128 ACLK      USI的时钟为ACLK/128


USICTL0 &= ~USISWRST;                     // USI released for operation这句话是将USISWRST位置0,手册中有这么一句话While the USI software reset bit USISWRST is set, the flags USIIFG,USISTTIFG, USISTP, and USIAL will be held in their reset state. 这句话是说如果将USISWRST位置1,USIIFG,USISTTIFG, USISTP,USIAL 这些标志将全部被锁定在复位状态,而手册中USISWRST的复位值为1,所以需要将该位清0




下面的一句就不说了,开中断,低功耗模式

接下来就是中断服务程序了

P1OUT ^= 0x01;                            // Toggle P1.0 using exclusive-OR 进中断,翻转P1.0口电平


USICNT = 0x1F;                            // re-load counter 给USICNTx重新装值

手册中关于装载此位数值的介绍是这样介绍的:


大体意思是这样的:
计数器计数采样位的个数,当USICNTx内的值变为0时,USI的中断标志位USIIFG置1,USICNTx的值变为0的情况分为两种:递减至0或直接将0写入USICNTx位。当USIIFGCC=0时,将大于0的数值写入USICNTx会自动清除USIIFG标志位,而当USIIFGCC=1时则不会对USIIFG产生影响。USICNTx位的数值为0时会停止递减,因此不会下
溢为0FFh。(我的翻译水平烂的的要死,大约也就是自己骗自己,呵呵)


所以说,给USICNTx重新赋值的同时也清除了中断标志位,退出循环,准备下一次进入中断。

PS:呵呵,反正是学习,再加上记忆力不太好,所以就在这里给自己提醒一下,以上这些话纯属我个人之言,难免有些自以为是,有错误的地方希望大家多多批评指正

0条回答

一周热门 更多>