STM32
直播中

靓仔峰

9年用户 1153经验值
擅长:可编程逻辑
私信 关注

GD32F4xx_Demo_Suites里的PMU_Sleep_Wakeup如何从串口从deepsleep状态唤醒?

GD32F4xx_Demo_Suites里的PMU_Sleep_Wakeup示例没有展示如何从串口从deepsleep状态唤醒
官方应用笔记中的sleep相关的串口唤醒也是有uart WAKEUP功能的串口器件,没有GD32F103或GD32F4XX系列的串口deepsleep唤醒示例
我尝试了几次,deepsleep后从串口输入字符,灯没有闪,都没有成功,请问GD32官方论坛的研发人员如何解决该问题

下面是大概的代码框架, 串口RX是PA10(EVAL_COM0)
void prepare_sleep()
{
    usart_disable(EVAL_COM0);
    usart_interrupt_disable(EVAL_COM0, USART_INT_RBNE);
    usart_deinit(EVAL_COM0);

    gpio_mode_set(EVAL_COM0_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP,EVAL_COM0_RX_PIN);
    gpio_output_options_set(EVAL_COM0_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,EVAL_COM0_RX_PIN);

    nvic_irq_enable(EXTI10_15_IRQn, 2U, 0U);
    syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN10);
    exti_init(EXTI_10, EXTI_INTERRUPT, EXTI_TRIG_RISING);
    exti_interrupt_flag_clear(EXTI_10);
    exti_interrupt_enable(EXTI_10);
}

void do_sleep()
{
    rcu_periph_clock_enable(RCU_PMU);
    pmu_to_deepsleepmode(PMU_LDO_NORMAL, PMU_LOWDRIVER_DISABLE, WFI_CMD);
    while (1) {
      toggle_alarmled();        //灯没有闪
      delay_ms(500);
    }
}

void EXTI15_10_IRQHandler()
{
    if(exti_interrupt_flag_get(EXTI_10) != RESET){
        do_wakeup_irq();
        exti_interrupt_flag_clear(EXTI_10);
    }
}

void do_wakeup_irq()
{
    SystemInit();
    SystemCoreClockUpdate();
    systick_config();
}

int main()
{
    //闪灯初始化,略
    //串口初始化,略
    prepare_sleep();
    do_sleep();
}

回帖(1)

杨平

2024-9-29 16:31:21
要实现从串口唤醒GD32F4xx系列微控制器,您需要按照以下步骤操作:

1. 配置串口中断:在进入深度睡眠模式之前,确保串口接收中断已启用。

2. 配置唤醒事件:在进入深度睡眠模式之前,将串口接收中断配置为唤醒事件。

3. 进入深度睡眠模式:调用`pmu_to_deepsleep_mode()`函数进入深度睡眠模式。

4. 唤醒处理:在深度睡眠模式下,当串口接收到数据时,微控制器将从深度睡眠模式唤醒。在唤醒后,需要重新配置串口。

以下是实现从串口唤醒的示例代码:

```c
#include "gd32f4xx.h"

void prepare_sleep(void) {
    // 禁用串口
    usart_disable(EVAL_COM0);
    // 禁用串口接收中断
    usart_interrupt_disable(EVAL_COM0, USART_INT_RBNE);
    // 配置唤醒事件
    pmu_sleepmode_config(PMU_SLEEP_ENTRY_DEEP_SLEEP);
    pmu_wakeup_event_enable(PMU_WAKEUP_SOURCE_USART0);
}

void main(void) {
    // 初始化串口
    usart_deinit(EVAL_COM0);
    usart_baudrate_set(EVAL_COM0, 115200U);
    usart_word_length_set(EVAL_COM0, USART_WL_8BIT);
    usart_stop_bit_set(EVAL_COM0, USART_STB_1BIT);
    usart_parity_config(EVAL_COM0, USART_PM_NONE);
    usart_hardware_flow_rts_config(EVAL_COM0, USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(EVAL_COM0, USART_CTS_DISABLE);
    usart_receive_config(EVAL_COM0, USART_RECEIVE_ENABLE);
    usart_interrupt_enable(EVAL_COM0, USART_INT_RBNE);
    usart_enable(EVAL_COM0);

    // 进入深度睡眠模式
    while (1) {
        prepare_sleep();
        pmu_to_deepsleep_mode();

        // 唤醒后重新配置串口
        usart_deinit(EVAL_COM0);
        usart_baudrate_set(EVAL_COM0, 115200U);
        usart_word_length_set(EVAL_COM0, USART_WL_8BIT);
        usart_stop_bit_set(EVAL_COM0, USART_STB_1BIT);
        usart_parity_config(EVAL_COM0, USART_PM_NONE);
        usart_hardware_flow_rts_config(EVAL_COM0, USART_RTS_DISABLE);
        usart_hardware_flow_cts_config(EVAL_COM0, USART_CTS_DISABLE);
        usart_receive_config(EVAL_COM0, USART_RECEIVE_ENABLE);
        usart_interrupt_enable(EVAL_COM0, USART_INT_RBNE);
        usart_enable(EVAL_COM0);

        // 读取接收到的数据
        uint8_t data = usart_data_receive(EVAL_COM0);
        // 处理接收到的数据
        // ...
    }
}
```

请注意,这个示例代码仅用于演示如何从串口唤醒GD32F4xx系列微控制器。您可能需要根据您的具体需求进行调整。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分