- #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;
- }
復制代碼
可以參考一下這個 |