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.

[参考译文] MSP430FR2355:我可以从一个寄存器上的两个不同位触发两个中断吗?

Guru**** 2478765 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1301711/msp430fr2355-can-i-trigger-two-interrupts-from-two-different-bits-on-one-register

器件型号:MSP430FR2355

我尝试使用中断来用 ADC 中断执行两个不同的任务。 低于加载到 ADCLO 中的特定 ADC 值、我需要执行一个 ISR、高于加载到 ADCHI 中的值、我需要执行不同的 ISR。 因此、我使用了以下 IRQ 设置:

	ADCIE |= 0xC;               // enable low and high ADC threshold IRQ
	__enable_interrupt();       // enable maskable IRQs

问题是、当我调用中断时、我不知道如何挑选 ADC_vector 中的一个特定位。

我 可以使用 ADCIE0 IRQ 在转换完成时触发并在其中输入 if 语句、但我希望可以选择 ADCLOIE 和 ADCHIIE 位并分别执行它们。

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

    只有一个中断矢量、所以只有一个中断。 您可以并且应该读取 ADCIV、以确定引起中断的源。 例如、ADCIV__ADCLOIFG (8)。

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

    好的、为了检查方向是否正确、我刚刚重写了 ISR:

    // ADC 检测门爆震
    #pragma vector = ADC_vector
    __interrupt void Knocksense (){
       if (P2IN!= BIT4 && ADCIV__ADCLOIFG == 1) P1OUT |= BIT0;        //如果压板按下,打开 LED1
       否则 P1OUT &&~BIT0;                   //将 LED1设置为关闭
       ADCIFG &&~ADCLOIFG +~ADCHIIFG;       //清除 IFG 标志


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

    否。 ADCIV__ADCLOIFG 是一个常数。 您是否阅读过21.2.7.10? 有一个汇编语言中的示例、但它可以轻松转换为 C:

     
       switch(ADCIV)
         {
         case ADCIV__ADCHIIFG:
    
         case ADCIV__LOIFG:
           
         default:
         }

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

    好的、这更有意义。 谢谢。