您好、MSP 低功耗微控制器论坛、
我目前正在使用 MSP430F5529并尝试根据 ADC 输入更改占空比。 当我在调试器中运行代码时、它可能会运行两次并更新 TA0CCR1、但随后它会卡在 while 循环中的_bis_SR_register (LPM0_bits + GIE)上。
请帮助您弄清这是为什么?
请参阅以下代码:
#include int main (void) { TA0CCR1 = 499;//占空比 WDTCTL = WDTPW + WDTHOLD; //停止 WDT ADC12CTL0 = ADC12SHT02 + ADC12ON; //采样时间、ADC12在 ADC12CTL1 = ADC12SHP 上的时间; //使用采样定时器 ADC12IE = 0x01; //启用中断 ADC12CTL0 |= ADC12ENC; P6SEL |= 0x01; // P6.0 ADC 选项选择 P1DIR |= 0x01; // P1.0输出 P2DIR |= BIT2; // P2.2 P2SEL |= BIT2; // P2.2选项选择 TA0CCR0 = 512-1; // PWM 周期 TA0CCTL1 = OUTMOD_7; // CCR1复位/置位 TA0CTL = tassel_2 + MC_1 + TACLR; // SMCLK、向上计数模式、清零 TAR // _bis_SR_register (LPM0_bits + GIE); while (1) { ADC12CTL0 |= ADC12SC; //开始采样/转换 _bis_SR_register (LPM0_bits + GIE); // LPM0、ADC12_ISR 将强制退出 //_no_operation (); //对于调试 器} #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__) #pragma vector = ADC12_vector __interrupt void ADC12_ISR (void) #elif defined (__GNU__) void __attribute__((interrupt (ADC12_vector)#if Compiler (void)(void))#define_ISR (void)错误! #endif { switch (__even_in_range (ADC12IV、34)) { case 0:break; //向量0:无中断 情况2:中断; //向量2:ADC 溢出 情况4:中断; //向量4:ADC 时序溢出 情况6: //向量6:ADC12IFG0 if (ADC12MEM0 >= 0x7ff){ // ADC12MEM = A0 > 0.5AVcc? P1OUT |= BIT0; 如果(TA0CCR1 = 0){TA0CCR1 = 0;} IF (TA0CCR1 > TA0CCR0){TA0CCR1 = TA0CCR0;} 其他 TA0CCR1---; } // P1.0 = 1 否则{ 如果(TA0CCR1 = 0){TA0CCR1 = 0;} IF (TA0CCR1 > TA0CCR0){TA0CCR1 = TA0CCR0;} P1OUT &=~BIT0; TA0CCR1++; } _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU 案例8:中断; //向量8:ADC12IFG1 大小写10:break; //向量10:ADC12IFG2 大小写12:break; //向量12:ADC12IFG3 case 14:break; //向量14:ADC12IFG4 情况16:中断; //向量16:ADC12IFG5 情况18:中断; //向量18:ADC12IFG6 案例20:中断; //向量20:ADC12IFG7 case 22:break; //向量22:ADC12IFG8 case 24:break; //向量24:ADC12IFG9 大小写26:break; //向量26:ADC12IFG10 case 28:break; //向量28:ADC12IFG11 case 30:break; //向量30:ADC12IFG12 大小写32:break; //向量32:ADC12IFG13 case 34:break; //向量34:ADC12IFG14 默认值:break; } }