This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430FR5969:添加多个中断例程时出现问题

Guru**** 2576215 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/634193/ccs-msp430fr5969-problem-adding-multiple-interruption-routines

部件号:MSP430FR5969

工具/软件:Code Composer Studio

您好,

我正在编写一个C代码,它混合了3个TI示例:timer_a_ex1_pwmSIngle (driverlib示例),timer_b_ex2_overflowISR和ADC。 我想使用定时器b来触发ADC读数,使用定时器A来触发PWM。 PWM功能工作正常,但计时器b不工作。 我想这是我如何声明中断向量的问题。 有人能帮你吗? 我将在下面发布我的中断代码。

#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector = ADC12_vector
#pragma vector=TIMERB1_Vector
__中断
__attribute__(中断(TIMERB1_Vector))
__interrupt void ADC12_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (ADC12_vector))) ADC12_ISR (void)
#否则
错误编译器不受支持!
#endif

开关(__偶 数_IN_RANGE (ADC12IV,ADC12IV_ADC12RDYIFG))

CASE ADC12IV_NONE:Break;// Vector 0:NO INTERRUPT
CASE ADC12IV_ADC12OVIFG:中断;//矢量2:ADC12MEMx溢出
CASE ADC12IV_ADC12TOVIFG:中断;//矢量4:转换时间溢出
CASE ADC12IV_ADC12HIIFG:Break;// Vector 6:ADC12BHI
CASE ADC12IV_ADC12LOIFG:中断;//矢量8:ADC12BLO
CASE ADC12IV_ADC12INIFG:中断;//矢量10:ADC12BIN
CASE ADC12IV_ADC12IFG0://矢量12:ADC12MEM0中断
如果(ADC12MEM0 >= 0x6B4)// ADC12MEM = A1 > 0.5V?
P1OUT |= BIT0;// WFP 1.0 = 1.
否则
P1OUT &=~BIT0;// WFP 1.0 = 0
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出活动CPU
断开;//从0 (SR)清除CPUOFF位

CASE ADC12IV_ADC12IFG1:Break;// Vector 14:ADC12MEM1
CASE ADC12IV_ADC12IFG2:中断;//矢量16:ADC12MEM2
CASE ADC12IV_ADC12IFG3:中断;//矢量18:ADC12MEM3
CASE ADC12IV_ADC12IFG4:中断;//矢量20:ADC12MEM4
CASE ADC12IV_ADC12IFG5:中断;//矢量22:ADC12MEM5
CASE ADC12IV_ADC12IFG6:Break;// Vector 24:ADC12MEM6
CASE ADC12IV_ADC12IFG7:中断;//矢量26:ADC12MEM7
CASE ADC12IV_ADC12IFG8:中断;//矢量28:ADC12MEM8
CASE ADC12IV_ADC12IFG9:中断;//矢量30:ADC12MEM9
CASE ADC12IV_ADC12IFG10:中断;//矢量32:ADC12MEM10
CASE ADC12IV_ADC12IFG11:中断;//矢量34:ADC12MEM11
CASE ADC12IV_ADC12IFG12:中断;//矢量36:ADC12MEM12
CASE ADC12IV_ADC12IFG13:Break;// Vector 38:ADC12MEM13
CASE ADC12IV_ADC12IFG14:Break;// Vector 40:ADC12MEM14
CASE ADC12IV_ADC12IFG15:Break;// Vector 42:ADC12MEM15
CASE ADC12IV_ADC12IFG16:中断;//矢量44:ADC12MEM16
CASE ADC12IV_ADC12IFG17:Break;// Vector 46:ADC12MEM17
CASE ADC12IV_ADC12IFG18:中断;//矢量48:ADC12MEM18
CASE ADC12IV_ADC12IFG19:中断;//矢量50:ADC12MEM19
CASE ADC12IV_ADC12IFG20:中断;//矢量52:ADC12MEM20
CASE ADC12IV_ADC12IFG21:中断;//矢量54:ADC12MEM21
CASE ADC12IV_ADC12IFG22:中断;//矢量56:ADC12MEM22
CASE ADC12IV_ADC12IFG23:Break;// Vector 58:ADC12MEM23
Case ADC12IV_ADC12IFG24:Break;// Vector 60:ADC12MEM24
CASE ADC12IV_ADC12IFG25:中断;//矢量62:ADC12MEM25
CASE ADC12IV_ADC12IFG26:Break;// Vector 64:ADC12MEM26
CASE ADC12IV_ADC12IFG27:Break;// Vector 66:ADC12MEM27
CASE ADC12IV_ADC12IFG28:Break;// Vector 68:ADC12MEM28
CASE ADC12IV_ADC12IFG29:Break;// Vector 70:ADC12MEM29
CASE ADC12IV_ADC12IFG30:中断;//矢量72:ADC12MEM30
CASE ADC12IV_ADC12IFG31:中断;//矢量74:ADC12MEM31
CASE ADC12IV_ADC12RDYIFG:中断;//矢量76:ADC12RDY
默认值:中断;
}
}

作废TIMERB1_ISR(void)

/*对TBIV寄存器的任何访问(读或写)都会自动重置
最高的"待定"中断标志。 */
SWITCH(__EIV_IN_RANGE(TBIV,14))

案例0:中断;//不中断
案例2:中断;// CCR1未使用
案例4:中断;// CCR2未使用
案例6:中断;// CCR3未使用
案例8:中断;// CCR4未使用
案例10:中断;// CCR5未使用
案例12:中断;// CCR6未使用
判例14://溢出
ADC12CTL0 || ADC12ENC | ADC12SC;
//切换WFP 1.0
gPIO_ToggleOutputOnPin(.
GPIO端口P1,
GPIO _PIN7
);
中断;
默认值:中断;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Luiz:

    看起来您已将TimerB中断和ADC中断的“#pragma向量”组合在一起。 与其将其放在一起,不如将其放在一个位置上,其外观如下所示:

    #if defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)
    #pragma vector=ADC12_vector
    __interrupt void ADC12ISR (void)
    #Elif defined(__GMNU__)
    void __attribute__(interrupt (ADC12_vector)) ADC12ISR (void)
    #elimer)
    不支持#else错误编译器#else
    #endif
    {
    switch (__sene_in_range(ADC12IV, ADC12IV_ADC12RDYIFG)){
    
    CASE ADC12IV_NONE: Break;// Vector 0: NO INTERRUPT
    CASE ADC12IV_ADC12OVOVIFG:Break;// Vector 2:ADC12MEMx
    CASE ADC12F; CASE CADIF: CA12:CADIVEC12
    
    
    //矢量10:ADC12BIN
    CASE ADC12IV_ADC12IFG0://矢量12:ADC12MEM0中断
    IF (ADC12MEM0 >= 0x6B4)// ADC12MEM = A1 > 0.5V?
    P1OUT |= BIT0;// WFP 1.0 = 1
    ELSE
    P1OUT &=~BIT0;// WFP 1.0 = 0
    __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出活动CPU
    中断;//清除CPUFF位,从0(SR)
    
    起,CASE ADC12IV_ADC12IF14:中断;CAMP0_MECMI/
    
    ADC12M2/
    Break;// Vector 20:ADC12MEM4
    Case ADC12IV_ADC12IFG5:Break;// Vector 22:ADC12MEM5
    Case ADC12IV_ADC12IFG6:Break;// Vector 24:ADC12MEM6
    Case ADC12IV_ADC12IFG7:Break;// Vector
    
    
    CAMP12
    //矢量34:ADC12MEM11
    CASE ADC12IV_ADC12IFG12:Break;// Vector 36:ADC12MEM12
    CASE ADC12IV_ADC12IFG13:Break;// Vector 38:ADC12MEM13
    CASE ADC12IV_ADC12IFG14:Break;// CASE:ADC1216:CAMEC1216:CAMEC12DIV
    
    
    :CASE:CAMP12
    :CAMP12:CAMP12 //矢量48:ADC12MEM18
    CASE ADC12IV_ADC12IFG19:Break;// Vector 50:ADC12MEM19
    CASE ADC12IV_ADC12IFG20:Break;// Vector 52:ADC12MEVector
    CASE ADC12IV_ADC12IFG21:Break;// CAMEM1224: CAMEC1224: CAMEM12M12M12M1224: CASE CAMEM1224:
    
    
    
    //矢量62:ADC12MEM25
    CASE ADC12IV_ADC12IFG26:中断;//矢量64:ADC12MEM26
    CASE ADC12IV_ADC12IFG27:中断;//矢量66:ADC12MEM27
    CASE ADC12IV_ADC12IFG28:中断;//
    
    
    CASE:CAMEC12ICVector ADC1229:CADIV:CADIVector CADIV:中断CADIV:CADIF12.123万 CADIV:CADIV:CADIV:CADIV:CADIV:CADIC12121212121230 CADIV
    :CADIV:CADIV:CADIV:CADIV CADIV:CADIV CADIV:CADIV CADIV //矢量76:ADC12RDY
    缺省值:中断;
    }
    
    
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
    #pragma vector = TIMER0_B1_vector
    __interrupt void Timer0_B1_ISR (void)
    #Elif defined(___GNUS___) void Timer0_Isr_erran_erran_0
    
    
    
    #endif
    {/*
    对TBIV寄存器的任何访问(读或写)都会自动重置
    最高的"待定"中断标志。 */
    switch (__sent_in_range(TBIV,14))
    {
    案例0:中断;//无中断
    案例2:中断;// CCR1未使用
    案例4:中断;// CCR2未使用
    案例6:中断;// CCR3未使用
    案例8:中断;// CCR4未使用
    案例10:中断;// CCR5未使用
    案例12:中断; // CCR6未用
    案例14://溢出
    ADC12CTL0 |= ADC12ENC | ADC12SC;
    //切换1.0 GPIO_ToggleOutputOnPin(
    
    GPIO_PORT_P1,
    GPI_PIN7
    );
    中断;
    默认:中断;
    }
    

    此致,  
    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Luiz:

    还有一点。 您可以将ADC设置为从计时器触发,而无需使用计时器ISR。 msp430fr59xx_ADC12_11.c 示例显示了如何完成此操作。

    此致,

    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你Caleb!

    此致,

    Luiz Moreira