[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板子上的效果是红色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:呵呵,反正是学习,再加上**力不太好,所以就在这里给自己提醒一下,以上这些话纯属我个人之言,难免有些自以为是,有错误的地方希望大家多多批评指正
|