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.
recentley、我在进入 LPM2后遇到了 MSP430FR6972器件的一些问题
应用大部分时间都在 LPM2中、并且在定时器到期、AD 转换时被唤醒
或产生端口中断
正常情况下、程序工作正常、但器件会在一段时间后停止激活。 32kHz 冷冻小瓶停止运行、然后
该器件不再对端口更改做出反应。 我已经研究了勘误表、但无法找到所发生情况的说明
那么我的问题如下:什么会导致控制器不从 LPM2唤醒?
寄存器
Olav
你(们)好,Tony
VCC 被滤波且稳定
没有 TRIG 输出 ACLK、但由于32kHz 晶体停止、方波输出将会
终止
要发布的完整代码太大、但主要问题似乎是 LPM2
即、当我对应用程序的这条指令进行注释时
运行良好、不会停止
谢谢
Olav
你(们)好 Katie
昨天下午、我根据您的建议更改了代码、但遗憾的是、似乎没有
就像有任何变化一样。 在夜间、设备停止运行、就像之前的测试一样
不过、一件好事是、我们可以排除计时器是根本原因
此致
Olav
您好 Olav、
还有一些问题;-)
1.您的系统以何种频率运行? 是否考虑了正确的等待状态设置?
2.您施加了哪种电源电压?
3.您是否也可以使用 LPM1或 LPM0来重现此问题?
4.它在多个器件上还是仅在单个器件上可重现?
此致、
Dietmar
您好、Dietmar
感谢您关注我的帖子
系统以4MHz 运行、根据数据表、这不需要任何等待状态
电源电压为3V
这是一个有趣的问题-没有、我没有尝试运行 LPM0或1
但在未进入 LPM2的情况下运行代码时未观察到崩溃
到目前为止、我已经在6个器件中的3个上看到了这种行为
此致
Olav
您好 Olav、
感谢您提供的所有技术信息以及在此方面的协作。 因此、从系统速度与等待状态中、我看不到问题。
我还有一个棘手的问题:
您能否以某种方式测量您是否有多个连续唤醒事件的睡眠时间非常短?
这意味着您的计时器会触发、器件会返回睡眠状态、并很快由端口中断再次触发。
此致、
Dietmar
您好、Dietmar
昨天、我根据您的建议制作了一个简单的测试代码。 不过、在睡眠模式下使用快速信号触发 GPIO 引脚确实如此
不会重现我最近经历过的相同行为
但是、在使用各种设置进行测试后、我认为问题必须与 ADC 有关
设备似乎在处理 ADC 中断后停止
设置如下:
计时器用于将器件从睡眠状态唤醒、在主循环中会启动重复的通道序列扫描
在8次重复采样和转换之后、对采样进行分析、并在计时器之前禁用转换
再次过期。 下一个转换在前一个转换完成后才开始
请参阅下面的代码脚本
谢谢、
Olav
void main (void)
{
MSP430_Init(); //初始化 I/O
xt1_startup (); //开始32768Hz 冷冻、DCO = 4MHz
_DELAY_CYCLES (2000000);
/*设置时间器 B*/
TB0CTL = 0x00;
TB0CCR4 =_10ms;
TB0CCTL4 = CCIE;
TB0CTL = TBSSEL_ACLK + MC_连续+ TBCLR;
/*设置 ADC*/
ADC12CTL0 &=~ADC12ENC; //分解器 AD
ADC12CTL0 = ADC12SHT0_3 | ADC12SHT1_3 | ADC12MSC | ADC12ON; // 16个 ADC12CLK 周期、多个采样和转换、ADC12打开
ADC12CTL1 = ADC12SHS_0 | ADC12SHP | ADC12PDIV_1 | ADC12DIV_7 | ADC12CONSEQ_3;// ADCCLK = MODOSC/8;ADC12SC 作为触发源、采样计时器、
//重复通道序列
ADC12CTL2 = ADC12RES__12位; // 12位转换结果
ADC12CTL3 = ADC12CSTARTADD_0; //起始地址 ADCMEM0
ADC12MCTL0 = ADC12INCH_12 + ADC12VRSEL_4; // A12 ADC 输入选择;Vref = Vref
ADC12MCTL1 = ADC12INCH_13 + ADC12VRSEL_4; // A13 ADC 输入选择;Vref = Vref
ADC12MCTL2 = ADC12INCH_15 + ADC12VRSEL_4 + ADC12EOS; // A15 ADC 输入选择;Vref = Vref;EndOfSequence
ADC12IER0 |= ADC12IE2; //启用 ADC 转换完成中断
_EINT();
for (;;)
{
GREEN_LED (0);
LPM2;
_NOP();
TEST_FLAG.LC_measurement = true;
start_ad_siming();
绿色 LED (1);
}
}
void start_ad_sing样 片(void)
{
while (adc_flagg.adc_busy); //等待上一次转换结束!
ADC12CTL0 &=~ADC12ENC; //复位 ENC
ADC12CTL0 &=~ADC12SC;
SAMPLING_INDEX = 0; //复位计数器
ADC_Fagg.ADC_BUSY = true; //设置软件标志以指示 ADC 忙
while (ADC12CTL1&ADC12BUSY); //等待 ADC 就绪
ADC12CTL0 |= ADC12ENC + ADC12SC; //启用转换
}
void ADC12 (void)__interrupt [ADC12_vector]
{
unsigned long lc_temp;
unsigned long NTC_temp;
unsigned int didt_temp = 0;
switch (__evo_in_range (ADC12IV、12))
{
情况 0:中断; //向量 0: 无中断
情况 2:中断; //向量 2: ADC12MEMx 溢出
情况 4:中断; //矢量 4: 转换时间溢出
情况 6:中断; //向量 6: ADC12HI
情况 8:中断; //向量 8: ADC12LO
情况10:中断; //向量10: ADC12IN
情况12:中断; //向量12: ADC12MEM0中断
情况14:中断; //向量14: ADC12MEM1中断
案例16: //向量16: ADC12MEM2
A0results[SAMPLING_index]= ADC12MEM0; //移动 A0结果、IFG 被清除
A1Results[SAMPLING_index]= ADC12MEM1; //移动 A1结果、IFG 被清除
A2Results[SAMPLING_index]= ADC12MEM2; //移动 A2结果、IFG 被清除
SAMPLING_index++; //使结果索引递增、
if (sampling_index >= nmbr_of_samples) // nmbr_of_samples = 8
{
ADC12CTL0 &=~ADC12ENC; //禁用转换
对于(I = 0;I < NMBR_of_samplples;I++)
{
lc_temp += A0results[i]; //求和
NTC_temp += A2Results[i]; //求和
if (A1Results[i]> didt_temp) //最大
didt_temp = A1Results[i];
}
load_raw =(unsigned int) lc_temp/nmbr_of_samples/;
if (test_flagg.lc_measurement)
{
TEST_FLAG.LC_measurement = false;
measuring_value.load =(load_raw/2.89)/44.13;
}
ADC_FLAGG.ADC_BUSY = false; //复位标志 ADC 不再忙
}
中断;
情况18:中断; //向量18: ADC12MEM3
情况20:中断; //向量20: ADC12MEM4
情况22:中断; //向量22: ADC12MEM5
情况24:中断; //向量24: ADC12MEM6
情况26:中断; //向量26: ADC12MEM7
情况28:中断; //向量28: ADC12MEM8
情况30:中断; //向量30: ADC12MEM9
情况32:中断; //向量32: ADC12MEM10
案例34:中断; //向量34: ADC12MEM11
案例36:中断; //向量36: ADC12MEM12
案例38:中断; //向量38: ADC12MEM13
情况40:中断; //向量40: ADC12MEM14
情况42:中断; //向量42: ADC12MEM15
案例44:中断; //向量44: ADC12MEM16
情况46:中断; //向量46: ADC12MEM17
情况48:中断; //向量48: ADC12MEM18
情况50:中断; //向量50: ADC12MEM19
情况52:中断; //向量52: ADC12MEM20
情况54:中断; //向量54: ADC12MEM21
情况56:中断; //向量56: ADC12MEM22
判例58:中断; //向量58: ADC12MEM3
情况60:中断; //向量60: ADC12MEM24
情况62:中断; //向量62: ADC12MEM25
情况64:中断; //向量64: ADC12MEM26
案例66:中断; //向量66: ADC12MEM27
情况68:中断; //向量68: ADC12MEM28
情况70:中断; //向量70: ADC12MEM29
情况72:中断; //向量72: ADC12MEM30
案例74:中断; //向量74: ADC12MEM31
情况76:中断; //向量76: ADC12RDY
默认值:break;
}
}
void Timer0_B1 (void)_interrupt [TIMERB1_Vector]
{
开关(TB0IV)
{
案例2: 中断;
案例4: 中断;
案例6: 中断;
案例8:
TB0CTL &=~MC__continous;
TB0CCR4 +=_10ms;
TB0CTL |= MC__continous;
LPM2_EXIT;
中断;
案例10: 中断;
案例12: 中断;
案例14: 中断;
默认值: break;
}
}
您好 Olav、
感谢测试和其他信息、这有助于我们至少排除一些情形。
根据您提供的代码、以下情况会很有趣:
1.如果您为计时器选择 SMCLK 而不是 ALCK、这会很有用
2.增加用于唤醒的计时器接口、以确保在 ADC 处于重复通道转换序列时不会触发 ADC
3.如果使用重复的单通道转换,问题也会出现
另一个想法是在中断结束时通过切换 ADC12SC 位再次触发 ADC 序列。
最后、您将不使用重复序列、而是使用序列、并"手动"重复
所有测试将帮助我们更好地了解您的设置中发生的情况。
此致、
Dietmar
您好、Dietmar
感谢您的所有建议-我们对此深表感激
1.如果我选择 SMCLK 作为定时器时钟源,我怀疑整体电流消耗会增加,因为 SMCLK 永远不会被禁用?
电流消耗实际上是此应用的关键
2、是的、我知道这个勘误表、但希望 ADC_BUSY 软件标志能够防止这种情况的发生?
4.这可能是一个解决方案,但我仍然想知道为什么设备在重复通道序列中运行时停止
此致
Olav
您好 Olav、
请允许我提供我们夜间测试的更新信息。 我们使用附带的简化测试代码对 FR6972修订版 A 器件进行了编程、并让其在25摄氏度和 DVCC=3.0V 下运行~12小时而不会暂停。 请参阅下面的示波器屏幕截图:
在我们的情况下、计时器始终能够唤醒器件。 现在、我们将继续使用更多的器件进行测试、并在温度范围内进行测试。
但一旦我们不能再现、就很难找到解释。 因此、我请您尝试我在您的设置中附加的代码、看看您是否可以复制。 如果不是、请向我们发送故障代码的缩减包。
e2e.ti.com/.../7266.main.c
其他一些事情也会很有趣:
1、如果您处于挂起状态、那么 GPIO 中断不再起作用了吗? (您之前发布过此内容、但我想再次确认)
2.它是否与不再执行的定时器中断相同、或者在 ADC 中断期间、您是否有时也会看到它挂起?
3.如您所述、您有3个故障样品、您可以更改故障样品的电压2.2V 或3.6V、看看是否消失?
如果我们无法成功地使用我们的器件复制它、我们将联系您、让您的部分器件发送回 TI。
此致、
Dietmar