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 rxPC11
/* 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); //对应STM32DMA2 - 通道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); //清除空闲中断
}
}
voidgd_eval_led_init (led_typedef_enum lednum)
{
/* enable the led clock */
rcu_periph_clock_enable(GPIO_CLK);
/* configure led GPIO port */
gpio_init(GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN);
GPIO_BC(GPIO_PORT) = GPIO_PIN;
}
深度睡眠模式例程:
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
}
}
} 低功耗模式下, GD32的时钟、外设和中断系统等都会受到限制,并且会消耗较少的电量。 如果有多个外部事件可以唤醒微控制器,那么睡眠模式可能是最好的选择,因为它可以响应中断来唤醒微控制器 在退出低功耗模式时,需要确保系统能够恢复正常工作状态,并能够继续执行原有的任务。因此,在配置低功耗模式时,需要注意相关的配置和调试工作 较低的时钟频率可以节省功率,但是可能会延长响应时间。 在配置低功耗模式时,需要注意合理配置各种参数,例如时钟频率、外设驱动能力、中断优先级等。 所有的时钟都已停止,因此需要谨慎处理可能会被影响的功能,如实时时钟(RTC)等。 在使用低功耗模式时,需要了解低功耗模式的特点,以便在满足功能需求的前提下,尽可能减少功耗。 可以通过中断、事件触发器等模块来唤醒单片机 在使用低功耗模式时,需要遵循GD32单片机的硬件和软件规范 睡眠模式下,Cortex-M3内核会停止运行,但所有的外设,包括Cortex-M3核心的外设,如NVIC、系统时钟 (SysTick)等仍在运行。这种模式适用于需要短时间休眠的场景。 如果需要快速启动微控制器,那么睡眠模式可能是最好的选择,因为它只需要重新启用时钟就可以恢复运行。 低功耗模式下,单片机的性能受限,因此需要对代码和算法进行优化,以提高执行效率 不同的低功耗模式具有不同的功耗和功能特点。开发者需要了解各种低功耗模式的工作原理和功能 低功耗模式下,单片机的性能受限,可能会影响系统的响应速度 如果不需要使用CPU,但需要保持其他外设的运行,可以选择使用睡眠模式。 Cortex-M3内核停止,但所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行。