赞
踩
在低功耗模式下,stm32f103系列的实际功耗st官方芯片手册有给出,也可以看如下文章:
https://blog.csdn.net/yky189/article/details/89914928
进入代码模式:
不用初始化其它rtc时钟有个的其它配置:直接调用如下函数即可进入待机模式并设置RTC闹钟在15s后发生闹钟事件唤醒MCU,wake_up管脚唤醒MCU
/******************************************************************************* * 函数名 : Enter_Standby_Mode * 函数功能 : 进入待机模式 * 输入 : 无 *输出 : 无 *******************************************************************************/ void Enter_Standby_Mode(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); RTC_SetAlarm(RTC_GetCounter()+15); RTC_WaitForLastTask(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR外设时钟 PWR_ClearFlag(PWR_FLAG_WU);//清楚Wake—up标志 PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚 PWR_EnterSTANDBYMode();//进入待机模式 }
**进入停机模式:
**不用初始化rtc时钟和有个的配置,直接调用此函数进入停机模式,RTC15s后唤醒,外部中断0唤醒
u8 StRtc_Init(void) { RCC_LSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); RCC_RTCCLKCmd(ENABLE); RTC_WaitForLastTask(); RTC_WaitForSynchro(); RTC_WaitForLastTask(); RTC_EnterConfigMode(); RTC_SetPrescaler(40000); RTC_WaitForLastTask(); RTC_ExitConfigMode(); return 1; } /******************************************************************************* * 函数名 : Enter_Stop_Mode * 函数功能 :进入停机模式 * 输入 : 无 *输出 : 无 *******************************************************************************/ void Enter_Stop_Mode(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /**************************************1*********************************/ EXTI_ClearITPendingBit(EXTI_Line17); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /**************************************2*********************************/ NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /**************************************3*********************************/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); RTC_SetAlarm(RTC_GetCounter() + 15); RTC_WaitForLastTask(); RTC_ITConfig(RTC_IT_ALR, ENABLE); RTC_WaitForLastTask(); PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);//PWR_Regulator_ON /*停机模式回来后会回到刚才停止的地方,也就是这个位置,因为停机模式关闭了所有的时钟,在此处需要使能需要用到的时钟*/ SystemInit(); RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); } /******************************************************************************* * 函数名 : My_EXTI_Init * 函数功能 : Í外部中断初始化 * 输入 :无 * 输出 : 无 *******************************************************************************/ void My_EXTI_Init(void) { NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//选择GPIO管脚用作外部中断线路 //EXTI0 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //¸初始化VIC寄存器 EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); } /******************************************************************************* * 函数名 : My_EXTI_Init * 函数功能 : 外部中断0函数 * 输入 :无 * 输出 : 无 *******************************************************************************/ void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0)==1) { } EXTI_ClearITPendingBit(EXTI_Line0); } /******************************************************************************* * 函数名 : RTCAlarm_IRQHandler * 函数功能 : RTC闹钟中断函数 * 输入 :无 * 输出 : 无 *******************************************************************************/ void RTCAlarm_IRQHandler(void) { EXTI_ClearITPendingBit(EXTI_Line17); } /******************************************************************************* * 函数名 : RTC_IRQHandler * 函数功能 : RTC中断函数 * 输入 :无 * 输出 : 无 *******************************************************************************/ void RTC_IRQHandler(void) { if (RTC_GetITStatus(RTC_IT_SEC) != RESET) { // RTC_GetTime(&SystemTime); RTC_ClearITPendingBit(RTC_IT_SEC); RTC_WaitForLastTask(); } if(RTC_GetITStatus(RTC_IT_ALR) != RESET) { RTC_ClearITPendingBit(RTC_IT_ALR); RTC_WaitForLastTask(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。