主题中讨论的其他器件:TM4C123
大家好、
我有一个从某些传感器采样数据、然后进入深度睡眠模式的系统。 系统从深度睡眠模式唤醒的方法是通过来自外部源的 GPIO 中断。 我的系统有多个 GPIO 中断源、因此我的系统可以由不同的源进行唤醒。
后来我意识到、我的系统偶尔不会从深度睡眠模式唤醒。 在查看 TM4C123勘误表后、我意识 到我的系统设置解决了 SYSCTL_01问题、对于特定的时钟配置、器件可能无法从深度睡眠模式唤醒。
因此、我选择了权变措施、在进入深度睡眠模式之前禁用 PLL、并在触发 GPIO 中断时启用 PLL (在单独的 ISR 中启用 PLL)
这是一个问题;在进入深度睡眠之前、我将禁用 PLL、但是、如果在深度睡眠 API 被调用之前的这一刻、GPIO 中断进入并启用 PLL、那么我的系统在进入深度睡眠之前处于勘误表的状态、 这将使我的系统有可能无法从深度睡眠中唤醒。
//伪代码
//典型 GPIO ISR
void GPIO_ISR (){
enable_pll ();
做 ISR 工作...
}
(笑声)
//运行状态(唤醒状态)的时钟设置
SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTAL_XTAL_16MHz | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN);
…
//.... 进入深度睡眠之前的步骤
SysTickDisable();
系统深度睡眠时钟集(SYSCTL_DSLP_DIV_4 | SYSCTL_DSLP_OSC_INT30 | SYSCTL_DSLP_PIOSC_PD);
SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_XTAL_16MHz | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN); //禁用 PLL
SysCtlDeepSleep PowerSet (SYSCTL_TEMP_LOW_POWER | SYSCTL_FLASH_LOW_POWER | SYSCTL_SRAM_LOW_POWER);
SysCtlLDODeepSlepSet (SYSCTL_LDO_0_90V);
>>哦、这里没有 GPIO 中断、并且启用 PLL <<<
SysCtlDeepSleep ();
我认为这个问题的一个原因是将代码的这个部分包含在一个临界区内、这样应该防止中断在这个期间改变我的 PLL 设置。 但是、在离开临界区和进入深度睡眠之间、中断仍然存在一小段距离。 因此,我的这种变通办法还不够好。
有人能帮我解决这个问题吗? 我是否有任何方法可以禁用 PLL 并平稳进入深度睡眠而不受任何干扰? 我不希望更改我的系统设置、也不使用 PIOSC、但我们非常感谢任何权变措施。
提前感谢!
Jacky