打印

GD32L233使用串口从从深度睡眠模式1唤醒

[复制链接]
648|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一点点0321|  楼主 | 2023-10-29 01:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
概要

GD32L233微控制器提供了10种省电模 式,分别为运行模式,运行模式1,运行模式2,睡眠模式,睡眠模式1,睡眠模式2,深度睡眠 模式,深度睡眠模式1,深度睡眠模式2和待机模式。L233除了支持我们常用的EXTI、RTC唤醒,也支持串口唤醒。

进入/退出睡眠模式
进入深度睡眠模式 1 :先将 Cortex®-M23 系统控 制寄存器的 SLEEPDEEP 位置 1,再将 PMU_CTL0 寄存器的 LPMOD 位域配置为“01”,然 后执行 WFI 或 WFE 指令即可进入深度睡眠模式 1(代码上直接调用库函数就行)。

1、执行 WFI 指令进入 的,任何来自 EXTI 的中断可以将系统从深度睡眠模式 1 中唤醒。
2、WFE 指令进入的,任何来自 EXTI 的事件可以将系统从深度睡眠模式 1 中唤醒
代码实现
硬件:USART1: Tx : PA2   Rx:PA3   LED:PA8

实现方法:代码按复位键运行,LED会闪烁5S后停止,然后进入深度睡眠模式。可通过串口工具发送数据唤醒,LED会恢复正常的闪烁。(LED 500ms闪烁使用SysTick_Handler实现)

使用特权

评论回复
沙发
一点点0321|  楼主 | 2023-10-29 01:10 | 只看该作者
主要代码:
int main(void)
{
    systick_config();

    rcu_periph_clock_enable(RCU_GPIOA);
    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8 );
    /* reset LED GPIO pin */
    gpio_bit_reset(GPIOA, GPIO_PIN_8);
       
    rcu_periph_clock_enable(RCU_SYSCFG);

    /* USART configuration the CK_IRC16M as USART clock */
    rcu_usart_clock_config(IDX_USART1, RCU_USARTSRC_IRC16MDIV);
    gd_eval_com_init(EVAL_COM);

    nvic_irq_enable(USART1_WKUP_IRQn, 0);
    /* USART1 Wakeup EXTI line configuretion */
    exti_init(EXTI_26, EXTI_INTERRUPT, EXTI_TRIG_RISING);//EXTI_26 USART1唤醒

    delay_1ms(5000);//5S后进入低功耗

    /* use start bit wakeup MCU */
    usart_wakeup_mode_config(EVAL_COM, USART_WUM_STARTB);

    /* enable USART */
    usart_enable(EVAL_COM);
    /* ensure USART is enabled */
    while(RESET == usart_flag_get(EVAL_COM, USART_FLAG_REA)) {
    }
    /* check USART is not transmitting */
    while(SET == usart_flag_get(EVAL_COM, USART_FLAG_BSY)) {
    }

    usart_wakeup_enable(EVAL_COM);
    /* enable the WUIE interrupt */
    usart_interrupt_enable(EVAL_COM, USART_INT_WU);

        printf(" enter deep-sleep mode");
    /* enable PWU APB clock */
    rcu_periph_clock_enable(RCU_PMU);
    /* enter deep-sleep mode */
    pmu_to_deepsleepmode(PMU_LDNPDSP_NORMALDRIVE, WFI_CMD, PMU_DEEPSLEEP);

    /* wait a WUIE interrupt event */
    while(0x00 == counter0);

    /* disable USART peripheral in deepsleep mode */
    usart_wakeup_disable(EVAL_COM);

    while(RESET == usart_flag_get(EVAL_COM, USART_FLAG_RBNE));
    usart_data_receive(EVAL_COM);

    usart_receive_config(EVAL_COM, USART_RECEIVE_ENABLE);

    while(RESET == usart_flag_get(EVAL_COM, USART_FLAG_TC));

    /* disable the USART */
   // usart_disable(EVAL_COM);

    /* reconfigure systemclock */
    system_clock_reconfig();

    systick_config();

    while(1) {
    }
}

使用特权

评论回复
板凳
一点点0321|  楼主 | 2023-10-29 01:10 | 只看该作者
小结
1、调试低功耗代码时不要配置上电就进入低功耗,防止芯片低功耗模式退出不了造成的代码无法烧录。

2、个人建议调试时使用按键进入低功耗模式或上电加延时后进入,这样能很好防止代码配置不对无法退出低功耗而造成的无法芯片烧录问题。

使用特权

评论回复
地板
AloneKaven| | 2023-10-31 22:53 | 只看该作者
低功耗都是在程序实现后配置的吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

396

帖子

0

粉丝