新手入门
- 积分
- 48
- 金钱
- 48
- 注册时间
- 2015-10-7
- 在线时间
- 8 小时
|
1金钱
捣鼓了好久,闹钟中断一直进不去,拜托大家帮我看看哪里出问题了,本人小白一个谢谢哈
下面是主要代码来着
void RTC_Config(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE);//配置BKP备份时钟和电源管理时钟都要打开
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_AFIO,ENABLE);
PWR_BackupAccessCmd(ENABLE); //使能RTC备份寄存器访问
BKP_DeInit(); //复位BKP
RCC_LSEConfig(RCC_LSE_ON); //打开LSE时钟
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET); //等待LSE就绪
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //RTC时钟源为LSE
RCC_RTCCLKCmd(ENABLE); //RTC时钟开启
RTC_WaitForSynchro(); //RTC等待同步
RTC_WaitForLastTask(); //等待就绪
RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR,ENABLE); //RTC秒中断开
RTC_WaitForLastTask(); //等待就绪
RTC_SetPrescaler(32767); //RTC预分频器
RTC_WaitForLastTask(); //等待就绪
}
优先级和中断线设置:
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //使能按键USER1所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级1,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组
NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; //使能按键USER1所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
void RTCAlarm_EXIT(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_ClearITPendingBit(EXTI_Line17); //清除中断标志
EXTI_InitStructure.EXTI_Line=EXTI_Line17; //选择中断线8
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置为中断请求
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能中断线
EXTI_Init(&EXTI_InitStructure);
}
中断服务程序:
void RTC_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
RTC_ClearITPendingBit(RTC_IT_SEC);
RTC_WaitForLastTask();
if (RTC_GetCounter() == 0x00015180)
{
RTC_SetCounter(0x0);
RTC_WaitForLastTask();
}
}
}
void RTCAlarm_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_6);
}
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_WaitForLastTask();
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
}
谢谢大家
|
|