主题中讨论的其他器件: MSPWARE、 MSP430FR5969、 MSP430FR5739
您好!
我的客户很难让 MSP430FR5736进入/退出 LPM4.5。
该代码在定制电路板上运行、并已从其原始应用中剥离、以隔离 LPM4.5功能的相关问题。
以下附加代码已在连接和未连接仿真器的情况下进行测试。 在这两种情况下、在尝试进入 LPM4.5后、MSP 的电流消耗仍然稳定在大约5uA。 我们认为所有 I/O 引脚被正确上拉/下拉、问题与硬件无关、而是与进入 LPM4.5的软件有关。 出于某种原因、执行 LPM4.5代码后、MSP 看起来仍处于活动状态、并在 JTAG 接口上进行响应。 正如我所理解的那样,这应该是不可能的,对吧?
以下示例基于以下版本的 MSPWare 1_60_03_07。
引脚 P2.2配置为 LPM 中断、以便在下降沿将 MSP 从 LPM4.5唤醒。 但是、进入 LPM4.5时似乎都存在问题、如果我们在退出时进入 LPM4.5、则会有一些奇怪的情况:
- 在 LPM4.5代码执行后、功耗保持在5uA、并且仍然可以使用调试器访问 MSP。
- 当下降沿被强制为 P2.2时、未检测到 BOR。
请查看这个简短的示例、并告知我们在尝试进入 LPM4.5时可能出现的问题。
谢谢、此致、
Joakim
------------------------------------------
#include
#include "inc/hw_regaccess.h"
//
//!
//! 包含 driverlib 的空项目-测试 MSP430FR5736的 LPM4.5
//!
//
静态空 SetLPM4_5 (空)
{
//关闭不活动的模块
WDTCTL = WDTPW | WDTHOLD; //停止看门狗(先执行此操作)
DMA0CTL = DMA1CTL = DMA2CTL = 0U; //关闭 DMA
TA0CTL = TA1CTL = 0U; //关闭计时器
RTCCTL0 = 0U; //关闭 RTC
REFCTL0 &=~REFON; //关闭内部电压 REF 模块
//停止时钟函数
CSCTL0 = CSKEY; //访问密码
CSCTL1 = 0U; //清除
CSCTL2 = SELA_1;//为 ACLK 选择 VLO
CSCTL4 = 0U; //清除所有位
CSCTL4 |=(SMCLKOFF); //设置一些位
CSCTL5 &=~(XT1OFFG); //清除时钟故障
CSCTL6 = 0U; //所有 REQEN 关闭
HWREG8 (CS_BASE + OFS_CSCTL0_H)= 0x00; //锁定 CS 寄存器
//端口关闭
P1OUT = 0x00;P2OUT = 0x00;PJOUT = 0x00;
P1DIR = 0xFF &~(BIT6);//设置为输出
//设置 LPM 交叉连接 I/O
P2IE |=(BIT2); //启用端口中断
P2IES |=(BIT2); //在下降边沿上中断
P2IFG &=~(BIT2); //清除中断标志
//禁用 SVS
PMM_disableSVSL (PMM_BASE);
PMM_disableSVSH (PMM_BASE);
PMM_regOff (PMM_BASE);// PMMREGOFF = 1. 用于 LPMx.5
_bis_SR_register (GIE+LPM4_BITS); //输入 LPM4
}
int main (空)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT
//复位后检查 PMM 状态
IF (PMM_getInterruptStatus (PMM_BASE、PMMRSTIFG))
{
PMM_clearInterrupt (PMM_base、PMMRSTIFG);
}
//在 BOR 之后检查 PMM 状态
IF (PMM_getInterruptStatus (PMM_BASE、PMMBORIFG))
{
PMM_clearInterrupt (PMM_base、PMMBORIFG);
}
//是否刚刚退出 LMP4.5?
IF (PMM_getInterruptStatus (PMM_BASE、PMMLPM5IFG))
{
__no_operation();//在此处设置断点以陷阱 BOR 条件
PMM_unlockLPM5 (PMM_BASE);
PMM_clearInterrupt (PMM_base、PMMLPM5IFG);
PMM_regOn (PMM_base);
PMM_enableSVSL (PMM_BASE);
PMM_enableSVSH (PMM_BASE);
}
SetLPM4_5();
__no_operation();
while (1)
{
//只有在激活模式下才会出现在这里
__no_operation();
};
}
//唤醒端口引脚中断
#pragma vector=port2_vector
_interrupt void Port2_ISR (void)
{
P2IFG &=~(BIT2);//清除中断标志
//如果需要激活模式,请启用此代码
//PMM_regOn (PMM_base);
//LPM4_EXIT;
}
#pragma vector=Port1_vector
_interrupt void Port1_ISR (void)
{
__no_operation();
}