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.

[参考译文] MSP430FR2111:微控制器在处于 LPM3中时能否检测 ADC 中断?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1325665/msp430fr2111-can-the-microcontroller-detect-adc-interrupts-while-in-lpm3

器件型号:MSP430FR2111

我正在尝试在低功耗模式 LPM3下唤醒我的器件并处理 ADC 阈值中断(ADC 结果大于预设的阈值)。 如果器件处于激活模式、我的代码可以正常服务中断、但是如果 SR 中的 LPM3位被置位、我的代码不会有任何问题。 我希望能够在 LPM3中使用 ADC 及其中断。 我是不是弄错了、还是需要其他设置才能使其正常工作?

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

    当然、所有中断都在低功耗模式下工作。

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

    是的、这可以正常工作、但您需要确保不依赖于 SMCLK。

    这包括 ADC 时钟(ADCSSEL)--这里 MODCLK 是一个不错的选择--如果你使用的是一个定时器触发器,那么定时器应该从 ACLK 运行。

    您的配置看起来是什么样的?

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

    感谢您的答复。

    我在这方面做了更多的工作,发现我的问题陈述是不完整的。 导致中断的事件何时发生取决于:

    1.如果事件发生在配置 ADC 通道的代码执行前、则在 LPM3中检测到中断。

    2.如果事件在 配置 ADC 通道的代码被执行后发生,则在 LPM3中不会检测到中断。

    如果在激活模式下启用了中断、则在任一测试场景中都可检测到 ADC 中断。 场景2是系统必须工作的实际情况。 目前 ADC 的配置是这样的--

    void initADC (void)
    {
    静态 const int fireThresholdFlu8_9 = 10;
    静态 const int fireThresholdFlu12 = 20;

    //配置 ADC10通道4
    ADCCTL0 &=~μ A ADCENC;                 //禁用 ADC
    ADCCTL0 |= ADCSHT_2 | ADCON;         // ADCON、S&H = 16 ADC 时钟
    ADCCTL1 = ADCSHP;                   // ADCCLK = MODOSC;从采样计时器采样
    ADCCTL2 = ADCRES_1;// 10位转换结果
    ADCIE = ADCHIIE;//启用阈值上限中断 ADC
    //假设现在流感8/9。
    ADCHI = fireThresholdFlu8_9;
    ADCMCTL0 = ADCINCH_4 | ADCSREF_0;// A4 ADC 外部输入选择
    //基准:V (R+)= 3V V (R-)= GND
    返回;

    在基本级循环开始之前运行一次的初始化例程中、并在基本级循环中启动 ADC 采样和启用中断。

    while (1)
    {
    ADCCTL0 |= ADCENC | ADCSC;//采样和转换开始

    __ bis_SR_register (GIE + LPM3_bits);
    ___ no_operation();

    ...

    请告诉我、我的配置是否能让您深入了解我看到的内容。

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

    我最初将"未检测到中断"解释为"未调用 ISR "。 现在、我怀疑您的意思是"ISR 被调用、但 main 未唤醒"。 [可以通过在 ISR 中设置断点来区分这一点。]

    对于后者、请尝试在设置 ADCSC 之前将其插入到行中:

    >_disable_interrupt (); //避免竞争

    唤醒(LPM3_EXIT 或__ bic_SR_register_on_EXIT ()))仅在 main 处于 LPM 的情况下才会唤醒 main;如果 main 处于活动状态、则唤醒会丢失。 在一次竞争中、ADC 完成并在 main 进入 LPM 之前触发中断。

    MODOSC 非常快、因此当 MCLK=MCLK 时、时序(3个1MHz)实际上非常紧张;如果一个杂散(例如)定时器中断恰好在正确的时间命中、窗口会变得非常大。 [遗憾的是、许多 TI 示例都忽略了该工件、但它们是偶然发生的。] 通过在启动 ADC 之前禁用(GIE=0)、然后自动启用(GIE=1)、之后进入 LPM、可以关闭窗口。

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

    另一种实现此目的的方法是将 ADC 配置为连续转换、而不是在软件中显式触发每个转换。 我本以为该模式会始终与窗口比较器配合使用。

    哦、编译器会为您插入 SR 后添加 NOP、这种做法非常浪费。 汇编器会在没有看到时发出警告。

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

    为了澄清这一点、我确实是说在未检测到中断时不会调用 ISR。

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

    也许我应该在这里指出、它的编码方式、如果在您检查时 A4上的电平低于您的阈值、中断不会触发、您也不会获得另一个机会。 这与 LPM 有关、而不是具体与 LPM3有关。 您的测试案例是否考虑了这一点?

    [编辑:这是大卫关于 CONSEQ=3 2的建议的地方。]

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

    有两种方法可以使用单通道重复传输。 如果 MSC=0、那么你每次转换都需要一些触发器。 计时器。 如果 MSC=1、那么在一次转换完成之后、下一次转换开始。

    具体使用哪一个取决于信号和您的要求。

    另一方面、我刚查看了另一器件(slau367)上有关 ADC12的文档、其中有一个部分显示只有在某些条件下 ADC 才会在 LPM3或 LMP4中保持激活状态。 我看不到此器件的此类注意事项。 但需要考虑一下。 与使用 LPM0进行测试一样、看看这是否起作用。

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

    如果 ADC 设置为重复单通道且 MSC=1、则在 LPM3中调用 ISR。 感谢你的帮助。