MSP430F5438學(xué)習(xí)筆記 TA1溢出中斷加比較匹配中斷
// 時鐘默認(rèn)情況
// FLL時鐘 FLL選擇 XT1
// 輔助時鐘 ACLK選擇 XT1 32768Hz
// 主系統(tǒng)時鐘 MCLK選擇 DCOCLKDIV 8000000Hz
// 子系統(tǒng)時鐘 SMCLK選擇 DCOCLKDIV 8000000Hz
// TA1選擇ACLK,最大計數(shù)值為65535
// 比較匹配值為 32768
// 在TIMER1_A0_VECTOR中 CCR0中斷 P4.0 = 0
// 在TIMER1_A1_VECTOR中 OVF中斷 P4.0 = 1
// 實(shí)際效果 P4.0 1s為高電平,1s為低電平,交替進(jìn)行
#include
#include
void clock_config(void);
void select_xt1(void);
void dco_config(void);
int main(void)
{
clock_config(); // 初始化時鐘
P4DIR |= BIT0; // P4.0輸出
TA1CCTL0 = CCIE; // 使能TA1CCR0,比較匹配中斷
TA1CCR0 = 16384; // 初始化比較匹配值
TA1CTL = TASSEL_1 + MC_2 + TACLR + TAIE; // 選擇ACLK,最大值為65535,清除計數(shù)值
_EINT(); // 初始化全局中斷
while(1)
{
;
}
}
void clock_config(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停止看門狗
select_xt1(); // 選擇XT1
dco_config(); // ACLK = XT1 = 32.768K
// MCLK = SMCLK = 8000K
}
void select_xt1(void)
{
// 啟動XT1
P7SEL |= 0x03; // P7.0 P7.1 外設(shè)功能
UCSCTL6 &= ~(XT1OFF); // XT1打開
UCSCTL6 |= XCAP_3; // 內(nèi)部電容
do
{
UCSCTL7 &= ~XT1LFOFFG; // 清楚XT1錯誤標(biāo)記
}while (UCSCTL7&XT1LFOFFG); // 檢測XT1錯誤標(biāo)記
}
void dco_config(void)
{
__bis_SR_register(SCG0); // 禁止FLL功能
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_5; // DCO最大頻率為16MHz
UCSCTL2 = FLLD_1 + 243; // 設(shè)置DCO頻率為8MHz
// MCLK = SMCLK= Fdcoclkdiv = (N+1)X(Ffllrefclk/n)
// N為唯一需要計算的值
// Ffllrefclk FLL參考時鐘,默認(rèn)為XT1
// n取默認(rèn)值,此時為1
// (243 + 1) * 32768 = 8MHz
__bic_SR_register(SCG0); // 使能FLL功能
// 必要延時
__delay_cycles(250000);
// 清楚錯誤標(biāo)志位
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
// 清除所有振蕩器錯誤標(biāo)志位
SFRIFG1 &= ~OFIFG; // 清除振蕩器錯誤
}while (SFRIFG1&OFIFG); // 等待清楚完成
}
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
{
P4OUT &= ~BIT0;
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER1_A1_ISR(void)
{
switch(__even_in_range(TA1IV,14))
{
case 0: break; // No interrupt
case 2: break; // CCR1中斷
case 4: break; // CCR2中斷
case 6: break; // reserved
case 8: break; // reserved
case 10: break; // reserved
case 12: break; // reserved
case 14: // 溢出中斷
P4OUT |= BIT0;
break;
default: break;
}
}