OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2920|回复: 1

请教:stm32f4 闹钟中断设置问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2016-4-12
在线时间
3 小时
发表于 2016-4-12 14:53:32 | 显示全部楼层 |阅读模式
6金钱
看了RTC实时时钟的教程,想设置一个闹钟,无奈最终无论是串口助手还是LED指示灯均没有响应,秒中断正常运行。请教大家帮忙看一下程序哪里有错??下面附上rtc.c程序,新手上路 请多关照 谢谢!!



#include "rtc.h"
#include "led.h"
#include "delay.h"
#include "usart.h"

NVIC_InitTypeDef   NVIC_InitStructure;
ErrorStatus RTC_Set_Time(u8 hour,u8 min,u8 sec,u8 ampm)
{
        RTC_TimeTypeDef RTC_TimeTypeInitStructure;
       
        RTC_TimeTypeInitStructure.RTC_Hours=hour;
        RTC_TimeTypeInitStructure.RTC_Minutes=min;
        RTC_TimeTypeInitStructure.RTC_Seconds=sec;
        RTC_TimeTypeInitStructure.RTC_H12=RTC_H12_AM;
       
        return RTC_SetTime(RTC_Format_BIN,&RTC_TimeTypeInitStructure);
       
}
ErrorStatus RTC_Set_Date(u8 year,u8 month,u8 date,u8 week)
{
       
        RTC_DateTypeDef RTC_DateTypeInitStructure;
        RTC_DateTypeInitStructure.RTC_Date=date;
        RTC_DateTypeInitStructure.RTC_Month=month;
        RTC_DateTypeInitStructure.RTC_WeekDay=week;
        RTC_DateTypeInitStructure.RTC_Year=year;
        return RTC_SetDate(RTC_Format_BIN,&RTC_DateTypeInitStructure);
}

u8 My_RTC_Init(void)
{
        RTC_InitTypeDef RTC_InitStructure;
        u16 retry=0X1FFF;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
        PWR_BackupAccessCmd(ENABLE);       
       
        if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5052)               
        {
                RCC_LSEConfig(RCC_LSE_ON);
                while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)       
                        {
                        retry++;
                        delay_ms(10);
                        }
                if(retry==0)return 1;               
                       
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);               
                RCC_RTCCLKCmd(ENABLE);       

    RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
    RTC_InitStructure.RTC_SynchPrediv  = 0xFF;
    RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
    RTC_Init(&RTC_InitStructure);

                RTC_Set_Time(13,59,56,RTC_H12_AM);
                RTC_Set_Date(14,5,5,1);               
         
                RTC_WriteBackupRegister(RTC_BKP_DR0,0x5052);
        }

        return 0;
}

void RTC_Set_AlarmA(u8 week,u8 hour,u8 min,u8 sec)
{
        EXTI_InitTypeDef   EXTI_InitStructure;
        RTC_AlarmTypeDef RTC_AlarmTypeInitStructure;
        RTC_TimeTypeDef RTC_TimeTypeInitStructure;
       
        RTC_AlarmCmd(RTC_Alarm_A,DISABLE);
       
  RTC_TimeTypeInitStructure.RTC_Hours=0x14;
        RTC_TimeTypeInitStructure.RTC_Minutes=0x00;
        RTC_TimeTypeInitStructure.RTC_Seconds=0x55;
        RTC_TimeTypeInitStructure.RTC_H12=RTC_H12_AM;

        RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDay=5;
        RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDaySel=RTC_AlarmDateWeekDaySel_Date;
        RTC_AlarmTypeInitStructure.RTC_AlarmMask=RTC_AlarmMask_DateWeekDay;
        RTC_AlarmTypeInitStructure.RTC_AlarmTime=RTC_TimeTypeInitStructure;
  RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,&RTC_AlarmTypeInitStructure);

       
        RTC_ClearITPendingBit(RTC_IT_ALRA);
  EXTI_ClearITPendingBit(EXTI_Line17);
        RTC_ITConfig(RTC_IT_ALRA,ENABLE);
        RTC_AlarmCmd(RTC_Alarm_A,ENABLE);
       
        EXTI_InitStructure.EXTI_Line = EXTI_Line17;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

        NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


/*wksel:  @ref RTC_Wakeup_Timer_Definitions
#define RTC_WakeUpClock_RTCCLK_Div16        ((uint32_t)0x00000000)
#define RTC_WakeUpClock_RTCCLK_Div8         ((uint32_t)0x00000001)
#define RTC_WakeUpClock_RTCCLK_Div4         ((uint32_t)0x00000002)
#define RTC_WakeUpClock_RTCCLK_Div2         ((uint32_t)0x00000003)
#define RTC_WakeUpClock_CK_SPRE_16bits      ((uint32_t)0x00000004)
#define RTC_WakeUpClock_CK_SPRE_17bits      ((uint32_t)0x00000006)
*/

void RTC_Set_WakeUp(u32 wksel,u16 cnt)
{
        EXTI_InitTypeDef   EXTI_InitStructure;
       
        RTC_WakeUpCmd(DISABLE);
       
        RTC_WakeUpClockConfig(wksel);
       
        RTC_SetWakeUpCounter(cnt);
       
       
        RTC_ClearITPendingBit(RTC_IT_WUT);
  EXTI_ClearITPendingBit(EXTI_Line22);
         
        RTC_ITConfig(RTC_IT_WUT,ENABLE);
        RTC_WakeUpCmd( ENABLE);
       
        EXTI_InitStructure.EXTI_Line = EXTI_Line22;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);


        NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void RTC_Alarm_IRQHandler(void)
{  
        if(RTC_GetFlagStatus(RTC_FLAG_ALRAF)==SET)
        {
               
                RTC_ClearFlag(RTC_FLAG_ALRAF);
                printf("ALARM A!\r\n");
                LED0=0;
          EXTI_ClearITPendingBit(EXTI_Line17);                                                                                         
}
}
void RTC_WKUP_IRQHandler(void)
{  
    u8 k=0;
    u8 wwww[6]={0xfd,0x04,0x41,0x00,0x01,0xdf};          
        if(RTC_GetFlagStatus(RTC_FLAG_WUTF)==SET)
        {
                printf("\r\n\r\n");
    for(k=0;k<6;k++)
    {
            USART_SendData(USART1, wwww[k]);      
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
        }
                        USART_RX_STA=0;
                RTC_ClearFlag(RTC_FLAG_WUTF);
                LED1=0;
        }   
        EXTI_ClearITPendingBit(EXTI_Line22);                                                       
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-4-13 22:26:43 | 显示全部楼层
参考我们的RTC例程,直接就可以做闹钟!!调用我们的函数即可。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 12:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表