在学习stm32F103C8T6过程中使用RTC闹钟中断的时候一直不能成功进入到中断函数,请大shen来指点!!
#include "stm32f10x.h" // Device header
#include "time.h"
#include "Buzzer.h"
#include "Delay.h"
uint16_t RTCTime[] = {2025,7,28,1,13,20};
uint16_t RTCALMTime[] = {2025,7,28,1,13,30};
void MyRTC_SetTime(void);
void SetRTC_ALM(void);
typedef struct
{
uint16_t year;
uint8_t mon;
uint8_t day;
uint8_t hour;
uint8_t min;
uint8_t sec;
}time_date;
void MyRTC_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
PWR_BackupAccessCmd(ENABLE);
// if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
// {
RCC_LSEConfig(RCC_LSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro(); //等待时钟同步
RTC_WaitForLastTask(); //等待上一次写入操作完成
RTC_SetPrescaler(32768-1);
RTC_WaitForLastTask();
MyRTC_SetTime();
RTC_WaitForLastTask();
SetRTC_ALM();
RTC_WaitForLastTask();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
// BKP_WriteBackupRegister(BKP_DR1,0xA5A5);
// }
// else
// {
// RTC_WaitForSynchro(); //等待时钟同步
// RTC_WaitForLastTask(); //等待上一次写入操作完成
// }
//
}
void MyRTC_SetTime(void)
{
time_t time_cnt;
struct tm time_date;
time_date.tm_year = RTCTime[0] - 1900;
time_date.tm_mon = RTCTime[1] - 1;
time_date.tm_mday = RTCTime[2];
time_date.tm_hour = RTCTime[3];
time_date.tm_min = RTCTime[4];
time_date.tm_sec = RTCTime[5];
time_cnt = mktime(&time_date) - 8*60*60;
RTC_SetCounter(time_cnt);
RTC_WaitForLastTask();
}
void MyRTC_ReadTime(void)
{
time_t time_cnt;
struct tm time_date;
time_cnt = RTC_GetCounter() + 8*60*60;
time_date = *localtime(&time_cnt);
RTCTime[0] = time_date.tm_year + 1900;
RTCTime[1] = time_date.tm_mon + 1;
RTCTime[2] = time_date.tm_mday;
RTCTime[3] = time_date.tm_hour;
RTCTime[4] = time_date.tm_min;
RTCTime[5] = time_date.tm_sec;
}
void SetRTC_ALM(void)
{
time_t time_alm;
struct tm time_almdate;
time_almdate.tm_year = RTCALMTime[0] - 1900;
time_almdate.tm_mon = RTCALMTime[1] - 1;
time_almdate.tm_mday = RTCALMTime[2];
time_almdate.tm_hour = RTCALMTime[3];
time_almdate.tm_min = RTCALMTime[4];
time_almdate.tm_sec = RTCALMTime[5];
time_alm = mktime(&time_almdate) - 8*60*60; // 减去8小时时区差
RTC_SetAlarm(time_alm);
RTC_WaitForLastTask();
RTC_ClearFlag(RTC_FLAG_ALR);
RTC_ITConfig(RTC_IT_ALR,ENABLE);
}
void RTC_IRQHandler (void)
{
if(RTC_GetITStatus(RTC_IT_ALR) == SET)
{
Buzzer_ON();
Delay_s(10);
Buzzer_OFF();
RTC_ClearITPendingBit(RTC_IT_ALR);
}
}

调试的时候中断配置使能和NVIC都配置没问题,但是就是进不去中断函数,RTC_SetAlarm给的值也测试过是没问题的。这个问题已经困扰了我许久了,但一直找不到原因。