在低功耗模式下,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();
}
}