標題:
STM32F1單片機待機狀態(tài),按鍵和RTC均喚醒不了?
[打印本頁]
作者:
Corser
時間:
2022-9-20 09:43
標題:
STM32F1單片機待機狀態(tài),按鍵和RTC均喚醒不了?
#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; //下降沿觸發(fā)
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時鐘分頻函數(shù),fTR_CLK = fRTCCLK / (PRL[19:0]+1),當前: 1HZ = 32768 / (32767+1)
RTC_WaitForLastTask();
RTC_SetCounter(0); //設置計數(shù)初始值
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測試過,均可以正常執(zhí)行,但是進入待機后,怎么都喚不醒
作者:
yzwzfyz
時間:
2022-9-21 16:39
無需看程序。
能說說你喚醒它的依據、道理、方法嗎?
說得出,你的問題也就解決了98%了。
作者:
Corser
時間:
2022-9-22 09:52
yzwzfyz 發(fā)表于 2022-9-21 16:39
無需看程序。
能說說你喚醒它的依據、道理、方法嗎?
說得出,你的問題也就解決了98%了。
WKUP的上升沿,RTC的鬧鐘事件上升沿均可喚醒。
WKUP外部實際電路接了上拉,按下即位下降沿,松開即為上升沿。外部中斷觸發(fā)配置嘗試使用過三種觸發(fā)方式,都不可以喚醒。
RTC是因為復位和仿真次數(shù)太多,導致工作不正常,重新初始化就可以正常喚醒了
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1