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/MSP430F5529:如果我使用低功耗模式、则无法退出 ADC12 ISR

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/670663/ccs-msp430f5529-cannot-exit-adc12-isr-if-i-use-low-power-mode

器件型号:MSP430F5529

工具/软件:Code Composer Studio

大家好、我有一个问题、希望大家能帮忙。

我使用 TA0.1每30ms 触发一次 A0上的 ADC 转换。

除了我使用 LPM0而不是 while (1)之外、一切都能完美运行。

如果我使用 LPM0、它仅在第一次运行时起作用;TA0.1触发 ADC、在转换结束时、进入 ISR。

之后、它将永远不会退出 ISR、也不会再使用计时器来触发 ADC。

我想摆脱 while 循环、仅使用 LPM。  

我有什么问题吗?

这是我的代码。

很抱歉打扰了。

Ralf

#include
volatile unsigned char datos[100];

int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止 WDT

//配置 ADC12
ADC12CTL0 |= ADC12SHT01 + ADC12ON;// Con 采样定时器8 ciclos、ADC12打开
ADC12CTL1 |= ADC12SHP + ADC12CONSEQ_2;// usar 采样计时器,无通道,多路转换器
ADC12CTL2 = ADC12RES_0;//结果8位

ADC12MCTL0 |= ADC12INCH_0;// Canal A0、Vref=AVCC (默认值)
ADC12IE |= ADC12IE0;// se habilita interruption en A0
ADC12CTL1 |= ADC12SH_1;// Trigger viene de TA0.1
ADC12CTL0 |= ADC12ENC;//适应转换

//Configuracion de TA0.1
TA0CTL |= TASSEL_SMCLK + MC_UP + TACLR;//时钟计时器=SMCLK、MODO UP、清除 TA
TA0CCR0 = 32878;// Periodo de señal 1、085、000/33 -1= 1084 (第30ms 段)
TA0CCTL1 = OUTMOD_7;// salida 复位、设置
TA0CCR1 = 16439;//%CT=50%
_enable_interrupt ();

bis_SR_register (GIE + LPM0_bits);//如果我添加此行、将永远不会退出 ISR

//如果我只使用 while,工作正常

/*while (1){

__no_operation();

}*/

#pragma vector = ADC12_vector
_interrupt void ADC12_ISR (void)

静态 unsigned char i=0;//se 声明一个静态参数 evitar que se inicialice i cada que entra a ISR

switch (__evo_in_range (ADC12IV、34))

情况0:中断;//向量0:无中断
情况2:中断;//矢量2:ADC 溢出
情况4:中断;//矢量4:ADC 时序溢出
情况6://向量6:ADC12IFG0
dataos[i]= ADC12MEM0;// Pasa MEM0 A arreglo
i++;// Incrementa celda de arreglo
如果(i ==100) i=0;// vuelve a inicio del arreglo
中断;
情况8:中断;//向量8:ADC12IFG1
情况10:中断;//向量10:ADC12IFG2
情况12:中断;//向量12:ADC12IFG3
案例14:中断;//矢量14:ADC12IFG4
情况16:中断;//向量16:ADC12IFG5
情况18:中断;//向量18:ADC12IFG6
情况20:中断;//向量20:ADC12IFG7
情况22:中断;//向量22:ADC12IFG8
情况24:中断;//向量24:ADC12IFG9
情况26:中断;//向量26:ADC12IFG10
情况28:中断;//向量28:ADC12IFG11
情况30:中断;//向量30:ADC12IFG12
情况32:中断;//向量32:ADC12IFG13
案例34:中断;//矢量34:ADC12IFG14

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

    您需要放置

    LPM0_EXIT;

    在 ISR 中的某个位置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bruce 您好:
    非常感谢您的回复。
    我已经尝试过、但它会使我退出 LPM0模式。
    我想退出 ISR 并返回 LPM0、然后等待、直到我从 TA0.1获取下一个触发信号。

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

    好的、我可能不理解您的问题。

    您如何知道您不会从 ISR 返回?

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

    要测试我的代码、我进入调试器并进行分步仿真。

    如果 CPU 始终处于活动状态并且我使用"while (1)"周期、则运行正常:在 ISR 之后、它将返回 while 周期并保持该周期、直到 TA0.1发送下一个触发脉冲、该脉冲超过32K 个周期(包含 image1)。

    如果我为"_bis_SR_register (GIE + LPM0_bits);"替换 while 周期、一旦它进入 ISR 并完成、它会立即返回到 ISR 的开头、 我可以看到、只需要几个周期、因此我想这意味着不是启动后续 ADC 转换的计时器、它实际上从未离开 ISR (图像2)。

    这可能是什么?  

    感谢你能抽出时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不熟悉右下角的时钟、但我认为您看到的是调试器创建的幻想、即 LPM 和"STEP"之间的一些交互。

    我将该代码放在 Launchpad 上、并添加了代码以在 ISR 持续期间打开 LED1、它会非常暗淡地亮起、表示占空比非常低。 (我也颠倒了这种感觉、它明亮地发光。)

    当我在 ISR 的第一行设置断点时、我看到 TA0R 始终是一个小值、这进一步表明 ISR 在计时器周期被调用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bruce 您好:
    非常感谢你能抽出时间。
    我执行了与您相同的操作、并使用示波器检查了 LED1信号、它工作正常。
    无论是否使用 LPM0、ISR 都在预期的周期执行。
    我想右下角显示的 CPU 周期在 LPM0模式下没有正确注册、因此不是很可靠。
    嗯、至少我学到了一些新东西。
    再次感谢!