完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
///////////////////////////////////////////////////////////
在Standby模式休眠后,等RTC时间到后会复位一次。但进入STOP1模式时,RTC无法唤醒系统 //////////////////////////////////////////////////////////// void RCT_Init(void) { /* Enable RTC APB clock */ LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_RTC); LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); LL_PWR_EnableBkUpAccess(); /* Enable LSE only if disabled.*/ if (LL_RCC_LSE_IsReady() == 0) { LL_RCC_ForceBackupDomainReset(); LL_RCC_ReleaseBackupDomainReset(); LL_RCC_LSE_Enable(); while (LL_RCC_LSE_IsReady() != 1) { } LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE); } /* Peripheral clock enable */ LL_RCC_EnableRTC(); ///////////////////////////////////////////////// /* ######## ENABLE WUT #################################################*/ /* Disable RTC registers write protection */ LL_RTC_DisableWriteProtection(RTC); /* Set prescaler according to source clock */ LL_RTC_SetAsynchPrescaler(RTC, RTC_ASYNCH_PREDIV); LL_RTC_SetSynchPrescaler(RTC, RTC_SYNCH_PREDIV); /* Disable wake up timer to modify it */ LL_RTC_WAKEUP_Disable(RTC); /* Wait until it is allow to modify wake up reload value */ while (LL_RTC_IsActiveFlag_WUTW(RTC) != 1) { } /* Setting the Wakeup time to RTC_WUT_TIME s If LL_RTC_WAKEUPCLOCK_CKSPRE is selected, the frequency is 1Hz, this allows to get a wakeup time equal to RTC_WUT_TIME s if the counter is RTC_WUT_TIME */ LL_RTC_WAKEUP_SetAutoReload(RTC, 1); LL_RTC_WAKEUP_SetClock(RTC, LL_RTC_WAKEUPCLOCK_CKSPRE); /* Enable RTC registers write protection */ LL_RTC_EnableWriteProtection(RTC); /* Disable RTC registers write protection */ LL_RTC_DisableWriteProtection(RTC); //禁用RTC寄存器写入保护 /* Enable wake up counter and wake up interrupt */ /* Note: Periodic wakeup interrupt should be enabled to exit the device from low-power modes.*/ LL_RTC_EnableIT_WUT(RTC); //启用唤醒计数器和唤醒中断(没看见这个中断入口函数) LL_RTC_WAKEUP_Enable(RTC); //唤醒使能 /* Enable RTC registers write protection */ LL_RTC_EnableWriteProtection(RTC); /* Reset Internal Wake up flag */ LL_RTC_ClearFlag_WUT(RTC); /* ######## ENTER IN STANDBY MODE ######################################*/ ///////////////////////////////////////////////// } void EnterStandbyMode(void) { /* Set Standby mode */ LL_PWR_SetPowerMode(LL_PWR_MODE_STANDBY); /* Set SLEEPDEEP bit of Cortex System Control Register */ LL_LPM_EnableDeepSleep(); /* This option is used to ensure that store operations are completed */ /* Request Wait For Interrupt */ __WFI(); } void EnterSTOP1Mode(void) { /* Set STOP1 mode */ LL_PWR_SetPowerMode(LL_PWR_MODE_STOP1); /* Set SLEEPDEEP bit of Cortex System Control Register */ LL_LPM_EnableDeepSleep(); /* This option is used to ensure that store operations are completed */ /* Request Wait For Interrupt */ __WFI(); } |
|
相关推荐
1个回答
|
|
在STM32G0系列微控制器中,Standby模式和STOP1模式都是低功耗模式,用于在不需要执行任务时节省能源。然而,它们在唤醒机制上有所不同。在Standby模式下,RTC(实时时钟)可以唤醒系统,但在STOP1模式下,RTC可能无法唤醒系统。以下是一些可能的原因和解决方案:
1. **RTC时钟源配置**:确保RTC时钟源已正确配置。通常,RTC使用LSI(低速度内部)时钟或LSE(低速度外部)时钟。在STOP1模式下,LSI时钟可能无法工作,因此需要使用LSE时钟。 2. **唤醒源配置**:在STOP1模式下,需要确保RTC唤醒源已正确配置。在初始化RTC时,使用`LL_RTC_SetWakeUpTimer()`函数设置唤醒时间,并使用`LL_RTC_EnableWakeUpTimer()`函数启用唤醒定时器。 3. **电源模式配置**:在STOP1模式下,需要确保PWR(电源)模块已正确配置。使用`LL_PWR_SetPowerMode()`函数设置电源模式为STOP1,并使用`LL_PWR_ConfigWakeUpPins()`函数配置唤醒引脚。 4. **时钟树配置**:在STOP1模式下,需要确保时钟树已正确配置。使用`LL_RCC_SetSMPSMode()`函数设置SMPS(开关模式电源)模式,并使用`LL_RCC_SetSMPSStepping()`函数设置SMPS步进。 5. **中断配置**:确保已正确配置RTC中断。使用`LL_RTC_EnableIT_WUT()`函数启用RTC唤醒定时器中断,并在中断服务例程中处理唤醒事件。 6. **低功耗模式退出**:在STOP1模式下,需要确保系统能够正确退出低功耗模式。使用`LL_PWR_ClearFlag_C2DS()`函数清除C2DS(系统停止2深度睡眠)标志,然后使用`LL_PWR_ClearFlag_WU()`函数清除WU(唤醒)标志。 7. **时钟和电源初始化**:在初始化RTC之前,确保已正确初始化时钟和电源模块。使用`LL_RCC_SetSysClkSource()`函数设置系统时钟源,并使用`LL_RCC_SetSMPSClockRange()`函数设置SMPS时钟范围。 8. **备份域电源**:确保备份域电源已启用。使用`LL_PWR_EnableBkUpAccess()`函数启用备份域访问,并使用`LL_PWR_EnableBkUpRegulator()`函数启用备份域电源。 9. **时钟分配**:确保已正确分配时钟给RTC。使用`LL_RCC_SetRTCClockSource()`函数设置RTC时钟源。 10. **检查硬件问题**:如果以上步骤都无法解决问题,可能存在硬件问题。检查RTC引脚连接和外部晶振(如果使用LSE时钟)。 通过检查和解决这些问题,应该可以解决STM32G0在STOP1模式下RTC无法唤醒系统的问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1641 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1562 浏览 1 评论
988 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
691 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1608 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
655浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
525浏览 3评论
541浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
514浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 07:45 , Processed in 0.823716 second(s), Total 82, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号