21ic问答首页 - GD32F105进入深度睡眠后,RTC中断不能正常运行。
GD32F105进入深度睡眠后,RTC中断不能正常运行。
地瓜土豆2021-05-28
本帖最后由 地瓜土豆 于 2021-6-1 15:28 编辑
GD32F105进入深度睡眠后,RTC中断不能正常运行。常规模式下是可以产生中断的。我想深度睡眠之后定时唤醒,但是深度睡眠之后,RTC中断不能相应。一直都在深度睡眠模式,退不出来。求大佬解惑。谢谢!以下是我的代码。void rtc_conf(void)
{
nvic_irq_enable(RTC_IRQn,1,4); //中断优先级
rcu_periph_clock_enable(RCU_BKPI); //开启时钟 后备寄存器
rcu_periph_clock_enable(RCU_PMU);
pmu_backup_write_enable(); //允许访问 后备寄存器
bkp_deinit(); //反初始化
//rcu_osci_on(RCU_LXTAL);
//rcu_osci_stab_wait(RCU_LXTAL);
//rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
rcu_osci_on(RCU_IRC40K); //使能低速慢时钟
rcu_osci_stab_wait(RCU_IRC40K);//等待低速慢时钟稳定
rcu_rtc_clock_config(RCU_RTCSRC_IRC40K); //选择低速慢时钟源
rcu_periph_clock_enable(RCU_RTC); //使能RTC
rtc_register_sync_wait(); //等待RTC寄存器同步
rtc_lwoff_wait(); //等待RTC寄存器上的最后一次写入操作完成
rtc_interrupt_enable(RTC_INT_SECOND); //使能 秒中断
rtc_lwoff_wait(); //等待RTC寄存器上的最后一次写入操作完成
rtc_prescaler_set(32767);
rtc_lwoff_wait();
}
void RTC_IRQHandler(void)
{
if(rtc_flag_get(RTC_FLAG_SECOND) != RESET)
{
Rtc_Time.s++;
SleepS_Rtc++;
rtc_flag_clear(RTC_FLAG_SECOND);
}
}
void Sleep_Wdog(long sleep_s)
{
float car_v=0;
SleepS_Rtc=0;
Rtc_Time.s=0;
while(SleepS_Rtc<sleep_s)
{
fwdgt_counter_reload(); //喂狗
pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD);
delay_ms(50);
}
}
GD32F105进入深度睡眠后,RTC中断不能正常运行。常规模式下是可以产生中断的。我想深度睡眠之后定时唤醒,但是深度睡眠之后,RTC中断不能相应。一直都在深度睡眠模式,退不出来。求大佬解惑。谢谢!以下是我的代码。void rtc_conf(void)
{
nvic_irq_enable(RTC_IRQn,1,4); //中断优先级
rcu_periph_clock_enable(RCU_BKPI); //开启时钟 后备寄存器
rcu_periph_clock_enable(RCU_PMU);
pmu_backup_write_enable(); //允许访问 后备寄存器
bkp_deinit(); //反初始化
//rcu_osci_on(RCU_LXTAL);
//rcu_osci_stab_wait(RCU_LXTAL);
//rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
rcu_osci_on(RCU_IRC40K); //使能低速慢时钟
rcu_osci_stab_wait(RCU_IRC40K);//等待低速慢时钟稳定
rcu_rtc_clock_config(RCU_RTCSRC_IRC40K); //选择低速慢时钟源
rcu_periph_clock_enable(RCU_RTC); //使能RTC
rtc_register_sync_wait(); //等待RTC寄存器同步
rtc_lwoff_wait(); //等待RTC寄存器上的最后一次写入操作完成
rtc_interrupt_enable(RTC_INT_SECOND); //使能 秒中断
rtc_lwoff_wait(); //等待RTC寄存器上的最后一次写入操作完成
rtc_prescaler_set(32767);
rtc_lwoff_wait();
}
void RTC_IRQHandler(void)
{
if(rtc_flag_get(RTC_FLAG_SECOND) != RESET)
{
Rtc_Time.s++;
SleepS_Rtc++;
rtc_flag_clear(RTC_FLAG_SECOND);
}
}
void Sleep_Wdog(long sleep_s)
{
float car_v=0;
SleepS_Rtc=0;
Rtc_Time.s=0;
while(SleepS_Rtc<sleep_s)
{
fwdgt_counter_reload(); //喂狗
pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD);
delay_ms(50);
}
}
您需要登录后才可以回复 登录 | 注册