GD32三种低功耗例程

GD32F303ZET6三种低功耗例程

睡眠模式例程: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];
}




深度睡眠模式例程:

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);
}

待机模式例程:

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        
        }   
    } 
}

版权声明:本文为CSDN博主「静水长安」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lubianshiyi/article/details/122395378

GD32F303ZET6三种低功耗例程

睡眠模式例程: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];
}




深度睡眠模式例程:

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);
}

待机模式例程:

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        
        }   
    } 
}

版权声明:本文为CSDN博主「静水长安」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lubianshiyi/article/details/122395378

生成海报
点赞 0

静水长安

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

GD32的Keil环境搭建简述

以GD32F30x为例 从GD官网下载开发文件: GD32F30x_AddOn_V2.1.0.rar包含Keil所需的gd32相关芯片的pack: GD32F30x_Demo_Suites_V2.3.0.rar包

GD32F103基础教程—教程简介(一)

随着ST公司芯片的价格越来越高,许多公司开始寻求国产芯片进行替换,但是大部分人用习惯了ST的单片机,突然更换国产芯片,很多产品的性能需要重新测试,对于资历比较深的嵌入式工程师

GD32精确延时和时间戳

目前网上很多都是利用systick频繁产生中断进行计数,然后实现延时。我写的这写接口,systick产生中断的频率很低,cpu效率很高。而且同时实现了毫秒延时,微秒延时,以及

GD32串口通信注意事项

GD32串口通信 虽说GD32与stm32采用同样的ARM® Cortex®-M3内核,而且GD32很大程度上可兼容stm32的程序,但是也存在着一些差异;所以为了使用上减少出错,使用G