- #include <msp430.h>
-
- #define LED BIT0 // 假设LED连接在P1.0端口
-
- void init_led(void)
- {
- P1DIR |= LED; // 设置P1.0为输出
- P1OUT &= ~LED; // 初始LED熄灭
- }
-
- // Timer_A中断服务程序
- #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
- #pragma vector=TIMERA0_VECTOR
- __interrupt void Timer_A (void)
- #elif defined(__GNUC__)
- void __attribute__ ((interrupt(TIMERA0_VECTOR))) Timer_A (void)
- #else
- #error Compiler not supported!
- #endif
- {
- P1OUT ^= LED; // 切换LED状态
- }
-
- void init_timer(void)
- {
- // 配置Timer_A为增计数模式,SMCLK分频,分频系数和计数周期视需要设定
- TACCR0 = 0; // 计数器清零
- TACTL = TASSEL_2 + ID_3 + MC_1; // SMCLK, 分频8, 增计数模式
-
- // 假设SMCLK = 1MHz, 分频8, 则Timer_A计数周期为1us
- // 为了得到0.5秒的中断周期, 需要计数500,000次
- // 但TACCR0是16位的, 所以可能需要用到TACCR1 (如果TACCR1存在)
- // 或者使用其他策略, 如溢出中断+TACCR0计数
-
- // 示例: 使用溢出中断 + TACCR0计数到某个值
- TACCR1 = 0; // 假设TACCR1存在且用作高位
- TACCR0 = 某个值; // 取决于你的SMCLK频率和所需的中断频率
-
- // 清除中断标志位
- TAIFG = 0;
-
- // 使能定时器A中断
- TAIE = 1;
-
- // 启动定时器A
- TACTL |= MC_1;
- }
-
- int main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
- init_led();
- init_timer();
-
- // 等待中断
- __bis_SR_register(GIE); // 使能全局中断
- __bis_SR_register(CPUOFF); // CPU进入低功耗模式, 等待中断
-
- return 0;
- }
复制代码
可以参考一下这个 |