打印

GD32三种低功耗例程

[复制链接]
3820|62
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GD32F303ZET6三种低功耗例程

使用特权

评论回复
沙发
一点点0321|  楼主 | 2023-10-29 01:07 | 只看该作者
睡眠模式例程:MCU的UART3接收到数据 ,进入UART3接收中断  即唤醒睡眠模式。
int main(void)
{  
/********   本实验测试单片机睡眠模式         *********/
/* 功能:串口中断唤醒     唤醒后闪灯   闪烁5次  进入睡眠模式   */
    int FlashingCount =0;
    //init uart3
    Modbus2_Init(9600);
    //init led
    gd_eval_led_init(LED2);   //run light
    while(1){
        my_delay(1000);
        //取反
        gd_eval_led_toggle(LED2);
        FlashingCount ++;
        if(FlashingCount >= 10){
            FlashingCount = 0;
            gd_eval_led_off(LED2);
            //进入睡眠模式
            rcu_periph_clock_enable(RCU_PMU);
            pmu_to_sleepmode(WFI_CMD);
        }   
    }
}


void Modbus2_Init(unsigned int baud)  //UART3
{
    dma_parameter_struct dma_init_struct;
   
    //初始化串口
    /* enable GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOC);   //tx PC10    rx  PC11
    /* enable USART clock */
    rcu_periph_clock_enable(RCU_UART3);

    /* connect port to USARTx_Tx */
    gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

    /* connect port to USARTx_Rx */
    gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11);

    /* USART configure */
    usart_deinit(UART3);
    usart_baudrate_set(UART3, baud);
    usart_receive_config(UART3, USART_RECEIVE_ENABLE);
    usart_transmit_config(UART3, USART_TRANSMIT_ENABLE);

    //开启接收中断
    usart_interrupt_enable(UART3, USART_INT_RBNE);  
    //中断注册
    nvic_irq_enable(UART3_IRQn, 1U, 1U);
    usart_enable(UART3);  
   
//    DMA使能
//    /* enable DMA0 */
    rcu_periph_clock_enable(RCU_DMA1);
    /* deinitialize DMA channel4(UART3 tx) */
    dma_deinit(DMA1, DMA_CH4);                   //对应STM32  DMA2 - 通道5
    dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
    dma_init_struct.memory_addr = (uint32_t)(Modbus2_DataCtrl.SendData);
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
    dma_init_struct.number = Modbus2_DataLen;      //发送前 需要修改的数据
    dma_init_struct.periph_addr = ((uint32_t)0x40004C04);  //(unsigned int)USART_DATA(UART3);
    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
    dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
    dma_init(DMA1, DMA_CH4, &dma_init_struct);
    /* configure DMA mode */
    dma_circulation_disable(DMA1, DMA_CH4);
    dma_memory_to_memory_disable(DMA1, DMA_CH4);
   
   
   //没有设置DMA中断
        /* DMA0 通道3 中断优先级设置并使能 */
        nvic_irq_enable(DMA1_Channel3_Channel4_IRQn, 1, 1);
        /* 使能 DMA0 通道3 传输完成、传输错误中断 */
    dma_interrupt_enable(DMA1, DMA_CH4, DMA_INT_FTF|DMA_INT_ERR);
   
    /* enable USART0 DMA channel transmission and reception */
    dma_channel_enable(DMA1, DMA_CH4);
    /* USART DMA enable for transmission and reception */
    usart_dma_transmit_config(UART3, USART_DENT_ENABLE);    //发送
}

void UART3_IRQHandler(void)
{
    unsigned char ReceiveData = 0;
    if(usart_interrupt_flag_get(UART3, USART_INT_FLAG_RBNE) != RESET){
        ReceiveData = usart_data_receive(UART3);
        usart_interrupt_flag_clear(UART3, USART_INT_FLAG_RBNE);
    }
    //空闲中断  帧中断
    if(usart_interrupt_flag_get(UART3, USART_INT_FLAG_IDLE) != RESET) {
        ReceiveData = usart_data_receive(UART3);   //清除空闲中断
    }

}

void  gd_eval_led_init (led_typedef_enum lednum)
{
    /* enable the led clock */
    rcu_periph_clock_enable(GPIO_CLK[lednum]);
    /* configure led GPIO port */
    gpio_init(GPIO_PORT[lednum], GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN[lednum]);

    GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum];
}



使用特权

评论回复
板凳
一点点0321|  楼主 | 2023-10-29 01:07 | 只看该作者
深度睡眠模式例程:
int main(void)
{  
/********   本实验测试单片机深度睡眠模式         *********/
   
/* 功能:深度睡眠模式需要EXTI的任何中断来唤醒     唤醒后闪灯   闪烁5次  进入深度睡眠模式   
         本测试设置PE3外部中断   下降沿触发   唤醒MCU
   
    */
    int FlashingCount =0;
    //init uart3
    Modbus2_Init(9600);
    //init led
    gd_eval_led_init(LED2);   //run light
    //init PE3
    init_PE3();
    while(1){
        my_delay(1000);
        //取反
        gd_eval_led_toggle(LED2);
        FlashingCount ++;
        if(FlashingCount >= 10){
            FlashingCount = 0;
            gd_eval_led_off(LED2);
            //进入停止模式
            rcu_periph_clock_enable(RCU_PMU);
            pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD);  
               //notice:WFI need EXTI interrupt wakeup
            //恢复HSE时钟
            SYSCLKConfig_STOP();            
        }   
    }
}

void init_PE3(void)
{
    //enable clock
    rcu_periph_clock_enable(RCU_GPIOE);
    rcu_periph_clock_enable(RCU_AF);
  
    //init pe3 io
    gpio_init(GPIOE, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
   
    //set interrut
    /* enable and set key EXTI interrupt to the lowest priority */
    nvic_irq_enable(EXTI3_IRQn, 2U, 0U);

    /* connect key EXTI line to key GPIO pin */
    gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOE, GPIO_PIN_SOURCE_3);

    /* configure key EXTI line */
    exti_init(EXTI_3, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(EXTI_3);
}

void EXTI3_IRQHandler(void)
{
    if(RESET != exti_interrupt_flag_get(EXTI_3)){
        gd_eval_led_toggle(LED2);
    }
   
    exti_interrupt_flag_clear(EXTI_3);
}

使用特权

评论回复
地板
一点点0321|  楼主 | 2023-10-29 01:07 | 只看该作者
待机模式例程:
int main(void)
{  
/********   本实验测试单片机待机模式         *********/
   
/* 功能:待机模式唤醒方式:WKUP引脚上升沿(接3.3V 即可 已测试)  
                           复位引脚(已测试)   
                           独立看门狗中断   
                           RTC闹钟     
    唤醒后程序重新执行。LED灯 闪烁5次 进入待机模式               
    */
    int FlashingCount =0;
    //init uart3
    Modbus2_Init(9600);
    //init led
    gd_eval_led_init(LED2);   //run light

    while(1){
        my_delay(1000);
        //取反
        gd_eval_led_toggle(LED2);
        FlashingCount ++;
        if(FlashingCount >= 10){
            FlashingCount = 0;
            gd_eval_led_off(LED2);
            //进入停止模式
            rcu_periph_clock_enable(RCU_PMU);
            pmu_wakeup_pin_enable();
            pmu_to_standbymode(WFI_CMD);   //notice:WFI need EXTI interrupt wakeup        
        }   
    }
}

使用特权

评论回复
5
kkzz| | 2023-11-11 13:24 | 只看该作者
低功耗模式下, GD32的时钟、外设和中断系统等都会受到限制,并且会消耗较少的电量。

使用特权

评论回复
6
pixhw| | 2023-11-11 13:41 | 只看该作者
如果有多个外部事件可以唤醒微控制器,那么睡眠模式可能是最好的选择,因为它可以响应中断来唤醒微控制器

使用特权

评论回复
7
louliana| | 2023-11-11 13:58 | 只看该作者
在退出低功耗模式时,需要确保系统能够恢复正常工作状态,并能够继续执行原有的任务。因此,在配置低功耗模式时,需要注意相关的配置和调试工作

使用特权

评论回复
8
ingramward| | 2023-11-11 14:13 | 只看该作者
较低的时钟频率可以节省功率,但是可能会延长响应时间。

使用特权

评论回复
9
sanfuzi| | 2023-11-11 14:30 | 只看该作者
在配置低功耗模式时,需要注意合理配置各种参数,例如时钟频率、外设驱动能力、中断优先级等。

使用特权

评论回复
10
biechedan| | 2023-11-11 14:41 | 只看该作者
所有的时钟都已停止,因此需要谨慎处理可能会被影响的功能,如实时时钟(RTC)等。

使用特权

评论回复
11
cashrwood| | 2023-11-11 16:06 | 只看该作者
在使用低功耗模式时,需要了解低功耗模式的特点,以便在满足功能需求的前提下,尽可能减少功耗。

使用特权

评论回复
12
hudi008| | 2023-11-11 16:44 | 只看该作者
可以通过中断、事件触发器等模块来唤醒单片机

使用特权

评论回复
13
phoenixwhite| | 2023-11-11 17:08 | 只看该作者
在使用低功耗模式时,需要遵循GD32单片机的硬件和软件规范

使用特权

评论回复
14
kkzz| | 2023-11-11 17:31 | 只看该作者
睡眠模式下,Cortex-M3内核会停止运行,但所有的外设,包括Cortex-M3核心的外设,如NVIC、系统时钟 (SysTick)等仍在运行。这种模式适用于需要短时间休眠的场景。

使用特权

评论回复
15
jtracy3| | 2023-11-12 09:19 | 只看该作者
如果需要快速启动微控制器,那么睡眠模式可能是最好的选择,因为它只需要重新启用时钟就可以恢复运行。

使用特权

评论回复
16
fengm| | 2023-11-12 09:44 | 只看该作者
低功耗模式下,单片机的性能受限,因此需要对代码和算法进行优化,以提高执行效率

使用特权

评论回复
17
jonas222| | 2023-11-12 09:54 | 只看该作者
不同的低功耗模式具有不同的功耗和功能特点。开发者需要了解各种低功耗模式的工作原理和功能

使用特权

评论回复
18
geraldbetty| | 2023-11-12 10:21 | 只看该作者
低功耗模式下,单片机的性能受限,可能会影响系统的响应速度

使用特权

评论回复
19
elsaflower| | 2023-11-12 10:32 | 只看该作者
如果不需要使用CPU,但需要保持其他外设的运行,可以选择使用睡眠模式。

使用特权

评论回复
20
wengh2016| | 2023-11-12 10:52 | 只看该作者
Cortex-M3内核停止,但所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行。

使用特权

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

本版积分规则

55

主题

396

帖子

0

粉丝