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的行为会有所不同、具体取决于封装。
在第一个设计中、我使用了一个 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、感谢您的快速回复。 我尝试了您的解决方案、但它没有改变任何东西。 我将尝试将固件剥离至尽可能少的行、然后带着它回来。
Bruce McKenney47378 要完全回答您的问题、是的、这是 P2 ISR。
e2e.ti.com/.../4643.main.c
我将其精简为一个较小的主函数和 ISR。
因此、如果您看到我做错了任何事情、我很高兴知道。
但假设我的代码正确、它会保留以下原因:
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(); } }
为了测量 PIR 信号、按如下方式建立了连接。 是的,在微风中的接地线(回路)不是最佳的。 |
![]() |
然后根据其标签(第一篇文章的原理图)对信号进行指示。 我把手伸到她的大腿内侧,轻轻地抚摸着她的阴蒂。 看起来都很好。 |
![]() |
当然、您始终应该首先进行的是电源测量。 使用了 SAP2500有源探头。 |
|
3.3V、C10靠近 MSP430 | ![]() |
3.3VA、C22、这是 LC 滤波器的一部分。 | ![]() |
3.3VA、C38置于 PIR 运算放大器旁边。 不是很好,也不是很差 在左侧、我们可以看到一个 LED 亮起时的纹波。 关闭 LED 后、可以观察到更多纹波。 |
![]() |
我意识到、当微控制器处于 LPM4时、我还应该测量纹波。 可能是低电流消耗和不连续模式导致的难看的纹波...
您现在的症状是什么? 之前、由于 IFG 未被清除、它只是 ISR 中的一个变量、但我希望您的代码更改也能修正此值。