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.

[参考译文] MSP430G2202:不同的 IFG2运行方式取决于封装

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1304281/msp430g2202-different-ifg2-behaviour-depending-on-package

器件型号:MSP430G2202
主题中讨论的其他器件: TPS61221

大家好!

我有一个有趣的例子、在这种情况下、MSP430G2202的行为会有所不同、具体取决于封装。

在第一个设计中、我使用了一个 IN20型号。 PIR 传感器的信号经过调节后转换为数字 H/L。 微控制器处于 LPM4状态、并在 P2.7的上升沿唤醒。 传感器电路工作正常、我验证了没有误报。 固件执行以下操作。

BIT_CLEAR (P2IFG、GPIO_IR_DETECT_PIN);
BIT_SET (P2IE、GPIO_IR_DETECT_PIN);
__ bis_SR_register (LPM4_bits);
// ZZZ...
NextState = StateCheckUndervoltageLockout;

其中:

void GpioInit (){
 //通过下拉使 GPIO 进入
 P1OUT = 0x00;
 P1REN=0xff;
 P1DIR = 0x00;

 P2OUT = 0x00;
 P2REN = 0xff;
 P2DIR = 0x00;

 //禁用有源驱动引脚上的拉电阻器
 BIT_CLEAR (P2REN、GPIO_IR_DETECT_PIN);
 BIT_CLEAR (P1REN、GPIO_日光_DETECT_PIN);
 
...

 // IR 检测信号的上升沿
 Bit_Clear (P2IES、GPIO_IR_DETECT_PIN);
 BIT_CLEAR (P2SEL2、GPIO_IR_DETECT_PIN);
 BIT_CLEAR (P2SEL、GPIO_IR_DETECT_PIN);


#pragma vector=port2_vector
__interrupt void Port2Isr (void){

 开关(P2IFG){

   案例 GPIO_IR_DETECT_PIN:{
     //避免卡在这里
     GPIO_EDGE_INTERRUPT_DISABLE ();
     BIT_CLEAR (P2IFG、GPIO_IR_DETECT_PIN);
     __ bic_SR_register_on_exit (LPM4_bits);
     中断;
   }

   默认值:{
     中断;
   }
 }


微控制器在 DCO (1 MHz)上运行、WDT 被关闭。 没有启用其他中断源。

该函数运行得非常好。 它在几周内一直在三个原型上运行。

在第二批处理中、使用了 IRSA16封装。 传感器电路可根据需要工作、这已经过我的验证。 但是、微型器件在被置于 LPM4后会立即唤醒。 即使传感器朝完全没有热移动的墙壁转动、它也会一直开启。 我的第一个猜测是 XIN/XOUT 的行为不同、因为它们在数据表中看起来有点杂乱。 连接调试器(MSP430G2 Launchpad)后、我将单步执行以上各行。 它起作用了! 没有检测到假中断、微型器件将保持睡眠状态、直到我将手放在传感器前面。 只要我让它自由运行、微控制器就会忘记 LPM4并再次唤醒。


CCS:12.4.0.00007
操作系统: Linux Mint 20.3 Cinnamon
编译器:TI v21.6.0.LTS   

有人知道、它可能来自哪里吗? 显然、它必须链接到调试器。

原理图:
 
e2e.ti.com/.../Nachtlicht_5F00_Schema_5F00_Rev_5F00_2.00.pdf

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

    为了避免一些挥之不去的疑虑,我建议你开始添加这些 GpioInit ():

    > P2SEL = 0;  // P2.6/7作为 GPIO,非 LFXT1

    > BCSCTL3 |= LFXT1S_2; // ACLK=VLOCLK 以真正禁用 LFXT1

    XIN/XOUT 的链接方式为奇数、因此、如果您在 P2.7上禁用 LFXT 功能、则应在 P2.6上执行相同操作。

    第二条线只是额外的保险,灵感来自(新?) 注意、位于用户指南(SLAU144K)第8.1节的开头。

    ---

    您提到 LPM4会立即唤醒。 在这种情况下是否调用了 Port2 ISR?

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

    您好、Bruce、感谢您的快速回复。 我尝试了您的解决方案、但它没有改变任何东西。 我将尝试将固件剥离至尽可能少的行、然后带着它回来。

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

    要完全回答您的问题、是的、这是 P2 ISR。
    e2e.ti.com/.../4643.main.c

    我将其精简为一个较小的主函数和 ISR。

    • 当运行附加的编码时、它运行良好。 只要您在传感器前面移动、P1.2 LED 就会短暂亮起。 这会重复运行。
    • 当重新激活线路60-62时、这两个 LED 一个接一个地亮起、但仅闪烁一次。 我使用 launchpad 刷入代码并断开连接。 同样、在下电上电后、该功能保持单稳态。

    因此、如果您看到我做错了任何事情、我很高兴知道。

    但假设我的代码正确、它会保留以下原因:

    • launchpad /调试器上的 ESD 损坏
    • P2.6 LED (55mA)关断会导致电源电压出现一些有趣的振荡、从而导致 MCU 的这种行为。
    • 我们不知道 P2.6/7的一些内部错误行为。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    55mA LED 吸引了我的目光。 您的原理图显示它由电池(通过 TPS61221)供电、但您提到了 Launchpad。 您是这样为它供电的吗?

    我问、因为我记得(旧的) G2 Launchpad 对于50mA 的一切都只有用。 (较新的) G2ET Launchpad 具有一个 TPS73533、它声称支持400mA (但我从未推得这么远)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    关闭 P2.6 LED (55mA)会导致电源电压出现异常振荡,从而导致 MCU 出现这种行为

    考虑到 TPS61221数据表中的图15 (负载瞬态响应)、这似乎不太可能。

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

    > 开关(P2IFG){

    开关 P2OUT.6 (打开/关闭 LED)将设置 P2IFG.6、因此此开关()不会执行您的预期。 请尝试改用:

    > 开关(P2IFG 和 GPIO_IR_DETECT_PIN){

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    55mA 指示灯抓住了我的眼睛。 您的原理图显示它由电池(通过 TPS61221)供电、但您提到了 Launchpad。 这是您为其供电的方式吗?

    不是、它由电池供电。 与 LaunchPad 的连接包含 GND + SBW。

    根据 TPS61221数据表中的图15 (负载瞬态响应),这似乎不太可能实现。

    可以。 电源应该正常。 但我还没有使用示波器测量它。

    > 开关(P2IFG){

    开关 P2OUT.6 (打开/关闭 LED)将设置 P2IFG.6、因此此开关()不会执行您的预期。 请尝试改用:

    > 开关(P2IFG 和 GPIO_IR_DETECT_PIN){

    [/报价]

    复杂的三个因素。 一次可以设置一个以上的标志。 谢谢、我修复了它。

    由于我只将 P2IE 中的 PIR GPIO 引脚 P2.7设定、P2.6应该不能触发一个中断。 对吧?


    在审查代码后、我暂时将固件排除为一个原因。 我将立即返回工作状态、通过示波器检查电源和传感器电路、看看实际上存在哪些波形。

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

    P2IFG.6=1不会触发一个中断、但是它会导致开关()不"看到" P2IFG.7中断(第二次开始直到)。 这将导致您描述的症状。

    我在您的原始代码片段中看到了相同的错误、但可能那里的(可见的)症状不同。

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

    使用 switch()是错误的,而不是参数。

    > IF (P2IFG 和 GPIO_IR_DETECT_PIN){

    在具有 PxIV 寄存器的器件上使用 switch ()是有意义的。

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

    我找到了执行先前承诺的测量的时间。

    首先、将 ISR 更改为

    #pragma vector=PORT2_VECTOR
    __interrupt void Port2Isr(void) {
    
      if(BIT_READ(P2IFG, GPIO_IR_DETECT_PIN) != 0) {
        // Avoid getting stuck here
        GPIO_EDGE_INTERRUPT_DISABLE();
        BIT_CLEAR(P2IFG, GPIO_IR_DETECT_PIN);
        SystemWakeup();
      }
    }


    更换调试器(EXP-MSP430FR4133 -> EXP-MSP430G2)没有帮助。

    此外、我使用我们的 SDS6104A 进行了测量。
    U_Bat 为2.7V。环境是实验室/办公室。

    为了测量 PIR 信号、按如下方式建立了连接。
    是的,在微风中的接地线(回路)不是最佳的。
     
    然后根据其标签(第一篇文章的原理图)对信号进行指示。
    我把手伸到她的大腿内侧,轻轻地抚摸着她的阴蒂。 看起来都很好。
    当然、您始终应该首先进行的是电源测量。
    使用了 SAP2500有源探头。
    3.3V、C10靠近 MSP430
    3.3VA、C22、这是 LC 滤波器的一部分。
    3.3VA、C38置于 PIR 运算放大器旁边。 不是很好,也不是很差
    在左侧、我们可以看到一个 LED 亮起时的纹波。
    关闭 LED 后、可以观察到更多纹波。

    我意识到、当微控制器处于 LPM4时、我还应该测量纹波。 可能是低电流消耗和不连续模式导致的难看的纹波...

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

    您现在的症状是什么? 之前、由于 IFG 未被清除、它只是 ISR 中的一个变量、但我希望您的代码更改也能修正此值。