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.

[参考译文] MSP430FR5994:如何更改中断优先级?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1236775/msp430fr5994-how-to-change-interrupt-priority

器件型号:MSP430FR5994

大家好、团队成员:

   如何修改中断的优先级、根据查询信息、MSP430的中断优先级是根据它所在向量的大小来安排的。 中断矢量地址越高、优先级越高。

现在、我使用 ADC 采样中断和计时器中断。 根据矢量表地址、我发现 ADC 采样中断的优先级高于计时器中断的优先级。 如果我想使计时器中断优先级高于 ADC 采样中断、我应该怎么做?  

以前:

我可以只交换它们的中断地址吗?

之后:  

#define ADC12_B_VECTOR  41*1U

#define Timer1_A0_vector      46*1u

我期待您的回复,谢谢。

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

    优先级是固定的、不能更改。 (也不能更改向量地址。)

    一些 MSP430具有中断比较控制器、 该控制器允许对优先级进行有限的调整、但该部件没有。

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

    在 MSP430FR5994上、根据器件数据表9.5中断矢量表和签名、中断优先级是固定的。

    感谢 David 的支持和评论!

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

    现在代码中有两个中断、一个是 ADC 采样中断、另一个是计时器中断。 ADC 采样中断服务函数的执行时间大约为33ms。 我每隔2ms 设置一个计时器中断,并在计时器中断服务函数中计数,当计数达到50次时,将生成一个100ms 超时标志,该标志将用于以后的计时操作; 采用此设置时、当执行 ADC 采样中断时、低优先级计时器中断无法响应、这将导致100ms 时基不准确。

    现在我无法更改计时器中断和 ADC 中断的优先级、如何在执行 ADC 中断时通常输入计时器中断进行计数?

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

    33ms 是一个很长的时间花在 ISR 上。 您应该更改它。

    由于 GIE 在 ISR 启动时被清零、中断优先级无关紧要、这是因为在 ADC ISR 退出前不会处理任何中断。

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

    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=ADC12_VECTOR
    __interrupt
    #elif defined(__GNUC__)
    __attribute__((interrupt(ADC12_VECTOR)))
    #endif
    void ADC12_ISR(void)
    {
    
        static uint16_t index = 0;
        static uint8_t memory[Num_of_Results]={ADC12_B_MEMORY_0,ADC12_B_MEMORY_1,ADC12_B_MEMORY_2,ADC12_B_MEMORY_3,
                                 ADC12_B_MEMORY_4,ADC12_B_MEMORY_5,ADC12_B_MEMORY_6,ADC12_B_MEMORY_7,
                                 ADC12_B_MEMORY_8,ADC12_B_MEMORY_9,ADC12_B_MEMORY_10,ADC12_B_MEMORY_11,
                                 ADC12_B_MEMORY_12,} ;
      switch(__even_in_range(ADC12IV,42))
      {
        case  0: break;                         // Vector  0:  No interrupt
        case  2: break;                         // Vector  2:  ADC12BMEMx Overflow
        case  4: break;                         // Vector  4:  Conversion time overflow
        case  6: break;                         // Vector  6:  ADC12BHI
        case  8: break;                         // Vector  8:  ADC12BLO
        case 10: break;                         // Vector 10:  ADC12BIN
        case 12: break;                         // Clear CPUOFF bit from 0(SR)
        case 14: break;                         // Vector 14:  ADC12BMEM1
        case 16: break;                         // Vector 16:  ADC12BMEM2
        case 18: break;                         // Vector 18:  ADC12BMEM3
        case 20: break;                         // Vector 20:  ADC12BMEM4
        case 22: break;                         // Vector 22:  ADC12BMEM5
        case 24: break;                         // Vector 24:  ADC12BMEM6
        case 26: break;                         // Vector 26:  ADC12BMEM7
        case 28: break;                         // Vector 28:  ADC12BMEM8
        case 30: break;                         // Vector 30:  ADC12BMEM9
        case 32: break;                         // Vector 32:  ADC12BMEM10
        case 34: break;                         // Vector 34:  ADC12BMEM11
        case 36:
            for(index =0;index< Num_of_Results;index++)
               {
                   results[index] = ADC12_B_getResults(ADC12_B_BASE,memory[index]);
               }
            break;                         // Vector 36:  ADC12BMEM12
        case 38: break;                         // Vector 38:  ADC12BMEM13
        case 40: break;                         // Vector 40:  ADC12BMEM14
        case 42: break;                         // Vector 42:  ADC12BMEM15
        default: break;
      }
     
    }

    编写这样的中断服务函数是否存在任何问题?

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

    为了解决 ADC 运行时计时器计数不准确的问题、现在我将计时器中断更改为50ms、同时每50ms 读取一次 ADC 收集的值、我不知道这是否可行

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

    如何更改中断服务函数以减少中断执行时间?

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

    一般做法是快速地将数据存储在某个位置。 然后退出低功耗模式、以便前台进程可以完成该工作。

    但到目前为止、您尚未显示任何应该很慢的内容。 因此、我不知道在哪里得到33ms。