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.

[参考译文] CCS/MSP430F6435:LPM3的警报唤醒中断

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/608477/ccs-msp430f6435-alarm-wakeup-interrupt-for-lpm3

器件型号:MSP430F6435

工具/软件:Code Composer Studio

我正在处理一个小代码、该代码将我的控制器(MSP430F6435)设置为睡眠模式、并通过警报中断返回激活模式。 我提到了这些源、但我仍然缺少一些东西、代码永远不会从 LPM3中输出。 我随附了我的代码以供参考

#include 
#include 

/*用于测试 MSP430F6435睡眠模式(低功耗模式)的示例代码*/

void Init_GPIO (void)
{
//端口配置
P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;P5OUT = 0x00;P6OUT = 0x00;
P7OUT = 0x00;P8OUT = 0x00;PJP8FF = 0x00;PJP8OUT = 0x00;PJP8OUT = 0x00
P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;P5DIR = 0xFF;P6DIR = 0xFF;
P7DIR = 0xFF;P8DIR = 0xFF;P9DIR = 0xFF;PJDIR = 0xFF;
}

void INIT_RTC_B (void) //未使用预分频器
{

UCSCTL6 &=~(XT1OFF); //用于 MCLK、SMCLK、ACLK 的32kHz 电容器
UCSCTL6 |= XCAP_3; //内部负载电容12pF 配置
while (BAKCTL 和 LOCKBAK) //解锁 XT1引脚以进行操作
BAKCTL &=~(LOCKBAK);
操作
{
UCSCTL7 &=~(XT1LFOFFG + DCOFFG);
//如果可能的故障会将这些寄存器设置为高电平、则清除 XT1、DCO 故障标志
SFRIFG1 &=~OFIFG; //清除振荡器故障标志
} while (SFRIFG1&OFIFG); //直到振荡器故障标志不被清除

RTCCTL0 = RTCAIE; //用于从低功耗模式唤醒的报警中断
RTCAMIN = 0x81; //持续1分钟中断

RTCCTL1 = RTCHOLD; //禁用日历模式

RTCHOUR = 0x5; //小时= 0x5
RTCMIN = 0x6; //分钟= 0x15
RTCSEC = 0x7; //秒= 0x25
}

void EnterLPM3 (void)
{
PMMCTL0_H = PMMPW_H; //打开 PMM 寄存器以写入
PMMCTL0_L |= PMMREGOFF; //并设置 PMMREGOFF
_bis_SR_register (LPM3_bits+ GIE); //使用中断进入 LPM3.5模式// 3.5,因为备份 RTC
的最低功耗__NO_OPERATION (); //启用
}

#pragma vector=RTC_vector
__interrupt void RTCISR (void)
{
PMMCTL0_H = PMMPW_H; //打开 PMM
PM5CTL0 &=~LOCKLPM5; //清除 LOCKBAK 并启用端口
PMMCTL0_H = 0x00; //关闭 PMM

RTCCTL0 &=~RTCAIE;
__BIC_SR_REGISTER_ON_EXIT (LPM3_BITM+ GIE); //退出 LPM3
__NO_OPERATION ();
}

int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P5DIR |= BIT5;
int i、sec;

init_gpio();
init_rtc_b();

EnterLPM3();

P5OUT |= 0X0020;
while (1);
} 

我是这里的新手、任何帮助都是值得称道的。 谢谢你。

此致

-Onkar

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

    感谢您发布此问题。 查看过您的代码后、我相信我知道是什么导致您保持在 LPM3模式。

    首先、您需要启用 RTC 寄存器以接受中断。 使用以下代码:

    RTCMODE = 1;

    您可以在以下代码之前添加此代码:

    RTCCTL0 = RTCAIE; //用于从低功耗模式唤醒的报警中断
    RTCAMIN = 0x81; //中断1分钟

    此外、通过查看您的代码、我注意到您使用了以下代码:

    RTCCTL1 = RTCHOLD; //禁用日历模式

    以获取您的小时、分钟和秒数。 然后、您将丢失代码的重要部分。 然后、您需要在采样数据后重新启动 RTC 日历模式。 这由以下代码完成。

    RTCCTL1 &=~(RTCHOLD); //启动 RTC 日历模式

    因此、换句话说、您需要在以下代码之后添加上述代码:

    RTCHOUR = 0x5; //小时= 0x5
    RTCMIN = 0x6; //分钟= 0x15
    RTCSEC = 0x7; //秒= 0x25

    如果您转到 TI Resource Explorer 并搜索示例代码 msp430f66xx_rtc_01.c、您将找到一个很好的示例。

    请告诉我这是否可以解决您的问题。

    此致、
    特拉维斯黑
    应用工程师
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复 Travis。

    我目前正在使用 MSP430F6435以及 RTC_B、因此我在其中没有 RTCMODE 选项(参考 slau208p)。 其次、我特意禁用了日历模式、因为这是一个用于测试警报中断和 LPM 的示例代码。 我认为这不应该是中断响应的问题。

    最重要的是--


    如果我们等待1小时、上面的代码就会工作、微控制器就会退出睡眠模式、因为我将时钟设置为05:06:07、并给出了一个1分钟的中断、中断实际上发生在06:01:00。 我将初始时间更改为5:00:00、现在我将获得预期结果。

    我仍然不知道这部分代码的工作方式(关于函数调用、控制流程)、因此、如果我能获得有关这方面的帮助/参考、我将非常感激

    #pragma vector=RTC_Vector
    _INTERRUPT void RTCISR (void)
    {
    PMMCTL0_H = PMMPW_H; //打开 PMM
    PM5CTL0 &=~LOCKLPM5; //清除 LOCKBAK 并启用端口
    PMMCTL0_H = 0x00; //关闭 PMM
    
    RTCCTL0 &=~RTCAIE;
    __BIC_SR_REGISTER_ON_EXIT (LPM3_BITM+ GIE); //退出 LPM3
    __NO_OPERAT();
    }
    

    此致

    -Onkar

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

    RTCMODE 的好地方 因此、要回答您的问题、您将有效地进入 LPM3.5 (而不是 LPM3)。 不会立即进入中断、该标志会触发重启、而不是 ISR。 这就是为什么示例 msp430f66xx_LPM35_rtc.c 检查 SYSRSTIV 并具有 WakeUpLPM35配置函数的原因。 只有在启用 I/O 和 RTC_B 中断后,才应为导致唤醒的中断提供服务(《用户指南》第23.3.6节)。 此 ISR 似乎是防止不当操作的某种保护措施、因为它仅通过清零 LOCKIO 位来启用 I/O、清除 IFG 并退出 LPM3。 我知道可以安全地删除代码而不会影响操作,但我想知道您是否在调试期间输入过该代码?

    此致、
    特拉维斯黑
    应用工程师
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢您 Travis、

    我认为我的代码正在进入 LPM3、如果我错了、请纠正我的错误、因为我有 RAM 保持(在 LPM 之前和唤醒之后、在调试模式下初始化一些整数并将其打印出来、并观察到 RAM 保持)。 我想知道是什么让您认为代码使用 LPM3.5。

    当我删除代码时、控制器永远不会退出睡眠模式。

    此致、

    Onkar

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

    您的代码令人困惑、因为您是从专为 LPM3.5条目设计的 msp430f66xxLPM35_rtc.c 采样、但随后您更改了代码、使其仅进入 LPM3。 使用 LPM3时、无需打开 PMM 寄存器并设置 PMMREFOFF 位。 在初始化期间清零 LOCKBAK 位应该发生、而不是在每次触发 ISR 时发生。 LPM3位被清零、这样器件进入激活模式并通过 EnterLPM3功能继续运行、其中端口2的位5在进入 while 环路前被置位。

    此致、
    Ryan