×
单片机 > 单片机程序设计 > 详情

RTC_WakeUp中断唤醒STM32F4停止模式

发布时间:2020-06-03 发布时间:
|

RTC_WakeUp唤醒STM32F4停止模式(借鉴的是原子哥写的代码): 

首先我们先初始化RTC配置:


//RTC初始化

u8 MyRTC_Init(void)

{

    RTC_InitTypeDef RTC_InitStructrue;

    u16 retry=0x1FFF;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR时钟

    PWR_BackupAccessCmd(ENABLE);//使能后备寄存器

    if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050)

    {

        RCC_LSEConfig(RCC_LSE_ON);//开启低速外部时钟

        if(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)//读取外部低速时钟是否准备就绪

        {

            retry++;

            delay_ms(10);

        }

        if(retry==0)

            return 1;//LSE开启失败

        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//选择LSE作为RTC时钟

        RCC_RTCCLKCmd(ENABLE);//使能RTC时钟


        RTC_InitStructrue.RTC_AsynchPrediv=0x7F;//RTC异步分频系数127

        RTC_InitStructrue.RTC_SynchPrediv=0xFF;//RTC同步分频系数255

        RTC_Init(&RTC_InitStructrue);//RTC初始化函数

        RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050);

    }

    return 0;

}



然后配置RTC_WakeUp:


void RTC_Set_WakeUp(u16 waketime)

{

    EXTI_InitTypeDef EXTI_InitStruct;

    NVIC_InitTypeDef NVIC_InitStruct;


    RTC_WakeUpCmd(DISABLE);//关闭Wake Up

    RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);//时钟选择1Hz

    RTC_SetWakeUpCounter(waketime);//设置WakeUp自动重装载值

    RTC_ClearITPendingBit(RTC_IT_WUT);//清除WakeUp中断标志

    EXTI_ClearITPendingBit(EXTI_Line22);//清除Line22中断标志

    RTC_ITConfig(RTC_IT_WUT,ENABLE);//开启WakeUp中断标志

    RTC_WakeUpCmd(ENABLE);//开启WakeUp


    EXTI_InitStruct.EXTI_Line=EXTI_Line22;//LINE22

    EXTI_InitStruct.EXTI_LineCmd=ENABLE;

    EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;

    EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//上升沿触发

    EXTI_Init(&EXTI_InitStruct);


    NVIC_InitStruct.NVIC_IRQChannel=RTC_WKUP_IRQn;//选择WakeUp中断

    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x01;

    NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x02;

    NVIC_Init(&NVIC_InitStruct);

}


编写RTC_WakeUp中断函数(记得初始化系统时钟):


void RTC_WKUP_IRQHandler()

{

    while(RTC_GetFlagStatus(RTC_FLAG_WUTF)!=RESET)

    {

        RTC_ClearFlag(RTC_FLAG_WUTF);

        SystemInit();

        LED1=!LED1;

    }

    EXTI_ClearITPendingBit(EXTI_Line22);

}


然后就是main函数了:


int main(void)

    u8 t=0;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2

    delay_init(168);      //初始化延时函数

    uart_init(9600);        //初始化串口波特率为9600


    LED_Init();                   //初始化LED         

    KEY_Init();

    MyRTC_Init();

    while(1)

   {

        LED0=!LED0;

        RTC_Set_WakeUp(5);//时钟频率选的1Hz,5S产生一次RTC_WakeUp中断

        printf("t=%dnr",t);

        PWR_EnterSTOPMode(PWR_LowPowerRegulator_ON,PWR_STOPEntry_WFI);

        t++;

        if(t>30)

         t=0;

    }



把USART1接串口调试助手上,变量t从0开始每5秒加1,同时LED每5秒反转一次状态. 

**注意哈: 

停止模式是烧录不进程序的,要烧录程序的话,要先按住RESET键,点download后,松手就能下进去了.**


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法