停机模式使用RTC自动唤醒(AWU)偶尔无法唤醒

使用RTC(AWU)周期性唤醒停机模式的单片机进行低功耗开发遇到运行一段时间(不确定时长)后无法唤醒

低功耗产品功能是,运行模式时完成功能,后进入停机模式减少功耗。使用RTC的自动唤醒功能进行周期性的唤醒,以及按键外部中断唤醒。
在功能正常使用后进行长时间测试,8个小时后停掉(没进行相应的功能,功耗停留在停机模式)

可能的问题:
1、外部32.768晶振有问题
2、RTC(自动唤醒的中断)优先级不是最高被其他中断占着系统,导致无法唤醒

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F103系列微控制器支持低功耗模式,其中停机模式是其中一种常见的低功耗模式停机模式可以使芯片进入非常低功耗状态,只保持RTC(实时时钟)和唤醒源的工作。 下面是一个简单的STM32F103停机模式RTC唤醒的代码示例: 首先,需要进行相应的配置和初始化。在初始化阶段,需要设置RTC工作和时钟源,同时配置唤醒源。 ```c // 初始化RTC RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); RCC_LSEConfig(RCC_LSE_ON); while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){} RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE); RTC_WaitForSynchro(); RTC_WakeUpCmd(DISABLE); RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits); RTC_SetWakeUpCounter(0x0800); ``` 然后,在需要进入停机模式的地方,使用以下代码: ```c PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_StopEntry_WFI); ``` 当系统运行到这一行代码时,芯片进入停机模式。在停机模式下,除了RTC唤醒源之外,所有的时钟和外设都被停止,电源消耗非常低。 当满足唤醒条件时,RTC自动唤醒芯片。例如,当定时器到达设定的唤醒时间时,芯片会被唤醒。然后,可以通过以下代码进行唤醒后的操作: ```c if (PWR_GetFlagStatus(PWR_FLAG_WU) != RESET) { PWR_ClearFlag(PWR_FLAG_WU); // 唤醒后的操作 } ``` 在操作完成后,程序即可继续正常运行。 以上就是一个简单的STM32F103停机模式RTC唤醒的代码示例。根据实际需求可能还需要对一些参数进行调整和优化,但基本的流程和原理是相同的。希望对您有所帮助。 ### 回答2: STM32F103系列微控制器支持RTC唤醒功能,可用于在停机模式下通过RTC中断来唤醒芯片并恢复正常运行。以下是一个简单的示例代码: 1. 配置RTC时钟和相关寄存器: ```c RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); // 使能PWR和BKP模块时钟 PWR_BackupAccessCmd(ENABLE); //允许访问后备寄存器 BKP_RTCOutputConfig(BKP_RTCOutputSource_None); //禁用RTC输出信号 BKP_RTCCLKConfig(BKP_RTCCLKSource_LSE); //配置RTC时钟源为LSE(外部低速振荡器) RCC_LSEConfig(RCC_LSE_ON); //启动LSE时钟 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); //等待LSE时钟稳定 RCC_RTCCLKCmd(ENABLE); //启动RTC时钟 RTC_WaitForSynchro(); //等待RTC寄存器同步 RTC_ITConfig(RTC_IT_WUT, ENABLE); //使能RTC唤醒中断 RTC_WakeUpCmd(ENABLE); //使能RTC唤醒功能 ``` 2. 配置RTC唤醒时间: ```c RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits); //配置RTC唤醒时钟源为1 Hz(利用预分频器实现) RTC_SetWakeUpCounter(3600); //设置RTC唤醒时间间隔为1小时(1 Hz * 3600秒) ``` 3. 进入停机模式: ```c PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); //进入低功耗停机模式并等待唤醒 ``` 4. 唤醒处理: ```c void RTC_WKUP_IRQHandler(void) //RTC唤醒中断处理函数 { if (RTC_GetITStatus(RTC_IT_WUT) != RESET) { RTC_ClearITPendingBit(RTC_IT_WUT); //清除RTC唤醒中断标志位 // 执行唤醒时需要的操作 } } ``` 上述代码通过配置RTC时钟、设置RTC唤醒时间间隔以及使用低功耗停机模式来实现RTC唤醒功能。在进入停机模式后,当RTC唤醒定时器到达预定时间时,芯片将被唤醒并执行唤醒时需要的操作。 ### 回答3: 为了在STM32F103停机模式下通过RTC唤醒,我们需要进行以下步骤: 首先,需要配置RTC时钟和唤醒时间。可以通过初始化RTC外设的时钟和配置RTC预分频器来实现RTC时钟的配置。然后,需要使用RTC的初始化函数来设置RTC的时钟源和时间格式。接着,我们可以配置RTC唤醒时间,即设置唤醒时间的秒数。这可以通过将RTC唤醒时间设置为相对于当前时间的秒数来实现。 其次,我们需要启用RTC唤醒功能以及配置RTC唤醒中断。可以通过设置RTC唤醒定时器和启用唤醒定时器来启用RTC唤醒功能。然后,通过配置RTC唤醒中断并使能RTC唤醒中断来配置RTC唤醒中断。通过这些配置,当唤醒时间到达时,RTC将会发出唤醒中断信号。 最后,需要配置STM32F103的电源管理单元(PWR)。可以通过配置PWR寄存器来选择停机模式。在停机模式下,所有外设和主时钟将会关闭,但RTC唤醒系统仍然可以工作。为了使STM32F103进入停机模式,我们需要在代码中调用PWR_EnterSTOPMode函数,并设置参数以选择停机模式。 综上所述,通过配置RTC时钟和唤醒时间、启用RTC唤醒功能和配置RTC唤醒中断、配置STM32F103的电源管理单元,我们可以实现在STM32F103停机模式下通过RTC唤醒的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值