GD32 低功耗下的唤醒问题(二)

接上一篇的问题

DeepSleep 状态下能否用RTC来唤醒呢?

先来看一个问题,

前面介绍说,DeepSleep模式下只能

EXTI的中断或者事件来唤醒

 

问题来了,为什么只能通过EXTI的中断或者事件来唤醒?

EXTI何方神圣?

就是个中断控制器,Cortex M内核 集成了这个东西,哦,不,Cortex M 集成了叫NVIC的东西 (嵌套式矢量型中断控制器)。

而EXTI主要是处理来自于IO管脚(0~15)的16个中断(PA0~PA15,PB0~PB15.....)

除此之外,好像EXTI有多余的脚,不用白不用(是否是因为有多余的脚才引出的下文是我YY的)

EXTI还接收来自LVD,RTC闹钟,USBFSFS的中断。

注意了,敲下黑板,是RTC闹钟,不是特么的RTC秒中断。

再敲下黑板,RTC闹钟接在EXTI中断线上,啥,想想我之前利用按键尝试可以在deep sleep模式下唤醒,而且spec也说了,可以通过EXTI来唤醒deep sleep。那这次就可以用RTC的闹钟中断来唤醒deep sleep喽?

 

搞一搞,搞一搞。

首先设能RTC闹钟中断

其次初始化RTC闹钟对应在EXTI上的中断

然后设置RTC闹钟

最后等待中断

OK,哇,可以了。终于产生中断了。。。。终于唤醒deep sleep了。。。。

呵呵呵,YY中

 

关于RTC的设置

还是官方的例子,里面有设置RTC闹钟中断使能的,自己找找,只要眼球和眼角膜还在,可以看得到的

void rtc_configuration(void)
{
    /* enable PMU and BKPI clocks */
    rcu_periph_clock_enable(RCU_BKPI);
    rcu_periph_clock_enable(RCU_PMU);
    /* allow access to BKP domain */
    pmu_backup_write_enable();

    /* reset backup domain */
    bkp_deinit();

    /* enable LXTAL */
    rcu_osci_on(RCU_LXTAL);
    /* wait till LXTAL is ready */
    rcu_osci_stab_wait(RCU_LXTAL);
    
    /* select RCU_LXTAL as RTC clock source */
    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);

    /* enable RTC Clock */
    rcu_periph_clock_enable(RCU_RTC);

    /* wait for RTC registers synchronization */
    rtc_register_sync_wait();

    /* wait until last write operation on RTC registers has finished */
    rtc_lwoff_wait();

    /* enable the RTC second and alarm interrupt*/
    rtc_interrupt_enable(RTC_INT_SECOND);
    rtc_interrupt_enable(RTC_INT_ALARM);
    /* wait until last write operation on RTC registers has finished */
    rtc_lwoff_wait();

    /* set RTC prescaler: set RTC period to 1s */
    rtc_prescaler_set(32767);

    /* wait until last write operation on RTC registers has finished */
    rtc_lwoff_wait();
}

初始化RTC闹钟对应在EXTI上的中断

/*
; 57:RTC Alarm
*/
void rtc_alarm_exti_init(void)
{

    /* enable and set EXTI interrupt to the lowest priority */
    nvic_irq_enable(RTC_ALARM_IRQn, 2U, 0U);
    /* configure EXTI line */
    exti_init(EXTI_17, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(EXTI_17);
	
	//exti_interrupt_enable(EXTI_17);
}

设置闹钟 10s "闹" 一下

#define DELAY_SECOND 10
void set_rtc_alarm(void)
{
		uint32_t current_counter = 0, max_counter = 0, alarm_counter = 0, year = 0;;

		current_counter = rtc_counter_get();
		year = (current_counter >> 25) + MIN_YEAR;
		max_counter = IS_LEAP_YEAR(year) ? (366 * 24 * 3600) : (365 * 24 * 3600);

		/* calculate the alarm_counter = current_counter + 10 second */
		if(((current_counter & 0x01FFFFFF) + DELAY_SECOND) < max_counter){
			alarm_counter = current_counter + DELAY_SECOND;
		}else{
			year++;
			if(year > MAX_YEAR){
				year = MIN_YEAR;
			}
			
			alarm_counter = ((year - MIN_YEAR) << 25) + (((current_counter & 0x01FFFFFF) + 10) - max_counter);
		}
		
		/* set the alarm_counter */
		rtc_lwoff_wait();
		rtc_alarm_config(alarm_counter);
		rtc_lwoff_wait();

}

简单的测试程序 

	while(1){
	

		set_rtc_alarm();

		dw_deep_sleep_mode();

		printf("next...\n");
	}

每次闹钟时间到了之后,需要重新设置一下alarm ----set_rtc_alarm()

 

OK 结束!

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
GD32串口中断唤醒低功耗是指通过串口中断来唤醒GD32芯片,并实现低功耗的一种方式。在使用GD32的串口中断唤醒低功耗功能时,需要进行以下几个步骤的设置: 1. 设置工作电压:GD32的工作电压(VDD)为2.0~3.6V,通过内置的电压调节器提供所需的1.8V电源。这是为了保证芯片正常工作和低功耗运行的基础。 2. 进入待机模式:在进入待机模式后,除了被使能了的用于唤醒的I/O,其余I/O都进入高阻态,相当于复位GD32芯片,程序重新从头开始执行。这样可以实现低功耗运行。 3. 设置串口中断唤醒:通过设置串口中断使能并配置相关参数,当有数据到达时,串口中断会触发唤醒操作,从而使芯片从待机模式中恢复运行。可以使用WK_UP来唤醒MCU。 通过以上几个步骤的设置,我们就可以实现GD32串口中断唤醒低功耗的功能。这样在待机模式下,当有数据到达时,串口中断会唤醒芯片并执行相应的操作,同时保持低功耗运行状态。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [《嵌入式 – GD32开发实战指南》第15章 低功耗(电源管理)](https://blog.csdn.net/u013162035/article/details/126170037)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值