请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR5969 大家好、我正在尝试使用 MSP430FR5969上的计时器 B0。 基本上、我想在引脚 P1.4、PIN1.5和 PIN3.4上使用 PWM。 我还希望每1ms 生成一个中断、以在将来执行一些任务。
我已经配置了微控制器、以使用 TBIFG。 如果 TBIE 被禁用、PWM 就会工作、但是当我启用中断(TBIE)以每1ms 生成一个中断时、TBIFG 被置位、但是微控制器不会进入中断例程。
这是我设置计时器的代码部分:
//计时器 B0:PWM TB0CTL = TBSSEL_SMCLK |ID_1| MC_UP | TBCLR | TBIE; // SMCLK、向上计数模式、清零 TAR TB0EX0 = TBIDEX_7; // DIV8:SO TIMER_CLK = SMCLK/8 TB0CCR0 = 2000; // PWM 周期1kHz/Tick 1ms 计时器 TB0CCTL1 = OUTMOD_7; // P1.4:CCR1重置/置 TB0CCR1 = 500; // P1.4:CCR1 PWM 占空比 TB0CCTL2 = OUTMOD_7; // P1.5:CCR2重置/置 TB0CCR2 = 1000; // P1.5:CCR2 PWM 占空比 TB0CCTL3 = OUTMOD_7; // P3.4:CCR3复位/置位 TB0CCR3 = 1500; // P3.4:CCR3 PWM 占空比 //中断 _bis_SR_register (GIE); //启用中断
这个是 main: #include #include #include "Setup.h" #include "Screen_Nextion.h" #include "otel_functions.h" int main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 Setup(); while (1) { SEND_Data_TO_PC ("aaa"); _delay_cycles (32000000); SEND_Data_TO_PC ("BBB"); _DELAY_CYCLES (32000000); } } // Timer0_B0中断 #pragma vector=TIMER0_B0_vector __interrupt void TIMER0_B0_ISR (void) { switch (__even_in_range (TB0IV、TB0IV_TBIFG)) }{ 案例 TB0IV_NONE: 中断; 案例 TB0IV_TBCCR1: 中断; // CCR1中断 案例 TB0IV_TBCCR2: 中断; // CCR2中断 案例 TB0IV_TBCCR3: 中断; //CCR3中断 案例 TB0IV_TBCCR4: 中断; // CCR4中断 案例 TB0IV_TBCCR5: 中断; // CCR5中断 案例 TB0IV_TBCCR6: 中断; // CCR6中断 案例 TB0IV_TBIFG: P1OUT ^= BIT0; 中断; // TBIFG 中断 默认值:break; } 我 还尝试使用捕获/比较中断(CCIE/CCIFG)代替 TBIFG 中断请求、所有操作都很好。 感谢 Riccardo