我正在尝试在低功耗模式 LPM3下唤醒我的器件并处理 ADC 阈值中断(ADC 结果大于预设的阈值)。 如果器件处于激活模式、我的代码可以正常服务中断、但是如果 SR 中的 LPM3位被置位、我的代码不会有任何问题。 我希望能够在 LPM3中使用 ADC 及其中断。 我是不是弄错了、还是需要其他设置才能使其正常工作?
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.
我正在尝试在低功耗模式 LPM3下唤醒我的器件并处理 ADC 阈值中断(ADC 结果大于预设的阈值)。 如果器件处于激活模式、我的代码可以正常服务中断、但是如果 SR 中的 LPM3位被置位、我的代码不会有任何问题。 我希望能够在 LPM3中使用 ADC 及其中断。 我是不是弄错了、还是需要其他设置才能使其正常工作?
感谢您的答复。
我在这方面做了更多的工作,发现我的问题陈述是不完整的。 导致中断的事件何时发生取决于:
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、可以关闭窗口。
有两种方法可以使用单通道重复传输。 如果 MSC=0、那么你每次转换都需要一些触发器。 计时器。 如果 MSC=1、那么在一次转换完成之后、下一次转换开始。
具体使用哪一个取决于信号和您的要求。
另一方面、我刚查看了另一器件(slau367)上有关 ADC12的文档、其中有一个部分显示只有在某些条件下 ADC 才会在 LPM3或 LMP4中保持激活状态。 我看不到此器件的此类注意事项。 但需要考虑一下。 与使用 LPM0进行测试一样、看看这是否起作用。