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.
您好!
我正在尝试通过 RTC 匹配和唤醒引脚从休眠中唤醒。 MSP432可以通过引脚唤醒、但不能通过 RTC 唤醒。 这里是配置休眠和进入休眠的部分代码。 我想我忘了一些配置线路、但我不知道是哪条配置线路。
__attribute__((optnone)) Public void CtrlHibernateInit(void) { /* Enable the the Hibernate module and wait for it to be ready */ SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); /* If first start up, enable hibernate * and RTC. */ if (HibernateIsActive() == FALSE) { HibernateEnableExpClk((uint32)CPU_FREQUENCY); HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC); HibernateRTCEnable(); HibernateCounterMode(HIBERNATE_COUNTER_RTC); HibernateRTCSet(0); } } __attribute__((optnone, noreturn)) Public void CtrlHibernateDoHibernate(void) { /* * Read and clear any status bits that might have been set since * last clearing them. */ uint32 hibIntStatus = HibernateIntStatus(FALSE); HibernateIntClear(hibIntStatus); // wake up each 30 seconds HibernateRTCMatchSet(0, HibernateRTCGet()+30); HibernateRequest(); for (;;) { /* Spin for a while for hibernate to activate. */ __NOP(); } }
您好!
我没有看到您调用 MAP_HIBernateWakeSet (HIBERIN_WAKE_RTC)来启用 RTC 唤醒中断。 我建议您查看 C:\ti\simplelink_msp432e4_sdk_4_20_00_12\examples\nortos\msp_EXP432E401Y\driverlib\HIBERIN_vdd3on_rtcwake 的示例。 本示例使用 RTC 从休眠状态唤醒。
您好、第12行。 我将使用此示例并进行了修改
好的。
我刚刚按 原样尝试 HIBERIN_vdd3on_rtcwake 示例、它对我很有效。 在我按下 SW1开关以将器件置于休眠模式后、休眠模块将在5秒后唤醒。 为什么不首先在 LaunchPad 上未经修改就尝试示例、然后在您的定制板上尝试? 您能否让这个示例正常工作? 如果您可以使该示例正常工作、那么您可以将其与您修改过的代码进行比较。 您也可以在 LaunchPad 上尝试自己的代码。 它在 LaunchPad 上是否工作? 检查是否向器件发送了有效的32.769kHz XOSC 信号。
您好!
我已在 launchpad 上进行了测试、工作正常。 但我需要修改代码以便在没有 IRQ 的情况下使用、仅由 RTC 唤醒并转至 main。 有可能吗?
您好!
,但我需要修改代码,以便在没有 IRQ 的情况下使用,
这是不可能的。 当器件处于休眠模式时、除 RTC 外的所有时钟均停止。 这意味着 CPU 处于空闲状态。 您必须生成中断才能唤醒时钟和 CPU。 RTC 匹配生成一个到处理器的 IRQ 来唤醒器件。
我已修改了代码、可以在没有 IRQ 的情况下运行。 但我试图移动它到我们的系统,它不起作用... 我必须调查更多发生了什么……
/* DriverLib Includes */ #include <ti/devices/msp432e4/driverlib/driverlib.h> /* Standard Includes */ #include <stdint.h> #include <stdbool.h> void delay(uint32_t delay_ms) // assumes 1 ms tick. { uint32_t start = 0; while (start < delay_ms) { start++;// nop } } int main(void) { uint32_t systemClock; uint32_t hibIntStatusRaw = 0u; /* Configure the system clock for 120 MHz */ systemClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000); /* Enable the clock to the GPIO Port N and wait for it to be ready */ MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION); while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPION))) { } /* Configure the GPIO PN0-PN1 as output and switch it LED D2 ON */ MAP_GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, (GPIO_PIN_0 | GPIO_PIN_1)); MAP_GPIOPinWrite(GPIO_PORTN_BASE, (GPIO_PIN_1), 0); delay(12000000); /* Enable the clock to the Hibernate and wait for it to be ready */ MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_HIBERNATE))) { } /* Configure Hibernate for VDD3ON Mode with Pin Wakeup if Hibernate * module has not been configured */ if(!MAP_HibernateIsActive()) { MAP_HibernateEnableExpClk(systemClock); MAP_HibernateWakeSet(HIBERNATE_WAKE_RTC | HIBERNATE_WAKE_PIN); MAP_HibernateRTCSet(0); MAP_HibernateRTCEnable(); } else { hibIntStatusRaw = MAP_HibernateIntStatus(true); MAP_HibernateIntClear(hibIntStatusRaw); if ((hibIntStatusRaw & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0)) != 0u) { MAP_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1, GPIO_PIN_1); delay(12000000); } } MAP_HibernateRTCMatchSet(0, (MAP_HibernateRTCGet()+5)); MAP_HibernateRequest(); while(1) { } }