久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1047|回復: 2
收起左側

STM32F1單片機待機狀態,按鍵和RTC均喚醒不了?

[復制鏈接]
ID:1021617 發表于 2022-9-20 09:43 | 顯示全部樓層 |閱讀模式
#include "wkup.h"

static u8 t = 0 ;
void WKUP_Init(void) {
   
    GPIO_InitTypeDef    GPIO_InitStructure;
    EXTI_InitTypeDef    EXTI_InitStructure;
    NVIC_InitTypeDef    NVIC_InitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
   
    //POWER_KEY
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);        //配置外部中斷與GPIOA連接
   
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
   
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        //中斷模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;        //下降沿觸發
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
   
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
   

}

void EXTI0_IRQHandler(void){
        
    EXTI_ClearITPendingBit(EXTI_Line0);        //清除外部中斷線0上的中斷標志位
   
    if(POWER_CHECK()) {
        
        LED3_9 =! LED3_9;
        RCC_APB2PeriphResetCmd(0X01FC,DISABLE);    //復位所有IO口
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
        PWR_WakeUpPinCmd(ENABLE);        //使能WKUP喚醒引腳
        PWR_EnterSTANDBYMode();        //進入待機模式
    }
}



u8 POWER_CHECK(void) {
   
    while(1) {
        
        if(power_check) {
            
            return 0;
        }
        else {
            
            t++;

            delay_ms(30);
            
            if(t >= 100) {
               
                t = 0;
                return 1;
            }               
        }
    }
}




#include "rtc.h"

u8 RTC_Init(void) {
   
    u8 temp = 0;
   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,ENABLE);
   
    PWR_BackupAccessCmd(ENABLE);    //使能對備份寄存器的操作
    //第一次初始化
    if(BKP_ReadBackupRegister(BKP_DR1) != 0x2020) {
        
        BKP_DeInit();        //復位備份寄存器
        
        RCC_LSEConfig(RCC_LSE_ON);        //打開外部低速晶振
        
        while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {
            
            temp++;
            
            delay_ms(10);            
        }
        //配置超時,RTC時鐘初始化失敗
        if(temp > 250) {
            
            return 1;
        }
        
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);        //使用外部低速晶振,32.768khz
        
        RCC_RTCCLKCmd(ENABLE);
        
        RTC_WaitForLastTask();        //等待上一次配置
            
        RTC_WaitForSynchro();        //等待同步
            
        RTC_ITConfig(RTC_IT_SEC | RTC_IT_ALR,ENABLE);        //配置使能秒,鬧鐘中斷
        
        RTC_WaitForLastTask();
        
        RTC_EnterConfigMode();        //進入配置模式
        
        RTC_SetPrescaler(32767);    //RTC時鐘分頻函數,fTR_CLK = fRTCCLK / (PRL[19:0]+1),當前: 1HZ = 32768 / (32767+1)
        
        RTC_WaitForLastTask();
   
        RTC_SetCounter(0);        //設置計數初始值
        
        RTC_WaitForLastTask();
        
        RTC_SetAlarm(5);        //設置鬧鐘閾值
        
        RTC_WaitForLastTask();
        
        RTC_ExitConfigMode();    //退出配置模式
        
        BKP_WriteBackupRegister(BKP_DR1,0x2020);        //往備份寄存器寫入4040,用來記錄判斷是否已經初始化
        
        //PWR_BackupAccessCmd(DISABLE);        //失能對備份寄存器的寫操作
    }
    //第二次初始化
    else {
        
        RTC_WaitForSynchro();
        
        RTC_ITConfig(RTC_IT_SEC | RTC_IT_ALR,ENABLE);
        
        RTC_WaitForLastTask();
        
        //PWR_BackupAccessCmd(DISABLE);    //失能對備份寄存器的寫操作
    }
   
    RTC_IT_NVIC();
   
    return 0;
}

void RTC_IT_NVIC(void) {
        
    NVIC_InitTypeDef    NVIC_InitStructre;
   
    NVIC_InitStructre.NVIC_IRQChannel = RTC_IRQn;
    NVIC_InitStructre.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructre.NVIC_IRQChannelSubPriority = 0x02;
    NVIC_InitStructre.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructre);   
}

void RTC_IRQHandler(void) {
   
    if(RTC_GetITStatus(RTC_FLAG_SEC) != RESET) {
        
        //LED2_5 =! LED2_5;
    }
   
    if(RTC_GetITStatus(RTC_IT_ALR) != RESET) {
        
        RTC_ClearITPendingBit(RTC_IT_ALR);
        
        RTC_SetAlarm(RTC_GetCounter()+5);
        
        LED2_5 =! LED2_5;
        
        IWDG_Feed();
    }
   
    RTC_ClearITPendingBit(RTC_IT_SEC | RTC_IT_OW);        //清除秒,溢出中斷的中斷標志位
        
    RTC_WaitForLastTask();
}


按鍵的外部中斷和RTC中斷均用LED測試過,均可以正常執行,但是進入待機后,怎么都喚不醒
回復

使用道具 舉報

ID:123289 發表于 2022-9-21 16:39 | 顯示全部樓層
無需看程序。
能說說你喚醒它的依據、道理、方法嗎?
說得出,你的問題也就解決了98%了。
回復

使用道具 舉報

ID:1021617 發表于 2022-9-22 09:52 | 顯示全部樓層
yzwzfyz 發表于 2022-9-21 16:39
無需看程序。
能說說你喚醒它的依據、道理、方法嗎?
說得出,你的問題也就解決了98%了。

WKUP的上升沿,RTC的鬧鐘事件上升沿均可喚醒。
WKUP外部實際電路接了上拉,按下即位下降沿,松開即為上升沿。外部中斷觸發配置嘗試使用過三種觸發方式,都不可以喚醒。
RTC是因為復位和仿真次數太多,導致工作不正常,重新初始化就可以正常喚醒了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄久久久| 久久亚洲欧美日韩精品专区 | 黄片毛片| 日韩在线小视频 | 亚洲精品女人久久久 | 精品国产一区二区三区久久久四川 | 亚洲电影一区 | 成人在线视频免费看 | 国产精品久久久久久久久久免费看 | 中文字幕亚洲一区二区三区 | 久久久久久久一区 | 三级黄色片在线 | 欧美成人精品一区二区男人看 | 99亚洲精品 | 亚洲视频在线免费观看 | 老妇激情毛片免费 | av入口 | 亚洲成人一区二区 | 欧美在线观看一区 | 国产综合在线视频 | 久久久久久国产精品免费免费狐狸 | 午夜在线 | 成人免费看片 | 在线观看视频福利 | 在线观看免费av网站 | 国产精品欧美一区喷水 | 亚洲视频一区在线观看 | 国内久久| 欧美高清视频 | 亚洲精品中文字幕在线 | 久久久久99 | 久久91精品久久久久久9鸭 | 中文字幕一区二区三区在线观看 | 欧美综合视频在线 | 亚洲欧美一区二区三区在线 | 日本在线免费看最新的电影 | av中文字幕在线播放 | 国产日韩欧美中文 | 羞羞色视频 | 国产精品久久影院 | 一区二区久久电影 |