OpenEdv-开源电子网

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

RTC闹钟中断无法实现

[复制链接]

11

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2016-10-11
在线时间
61 小时
发表于 2016-11-16 16:46:27 | 显示全部楼层 |阅读模式
1金钱
闹钟中断里想让led0亮5s,结果没反应,以下是程序:u8 RTC_Init(void)
{
        //检查是不是第一次配置时钟
        u8 temp=0;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);        //使能PWR和BKP外设时钟   
        PWR_BackupAccessCmd(ENABLE);        //使能后备寄存器访问  
        if (BKP_ReadBackupRegister(BKP_DR1) != 0x5051)                //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
                {                                
                BKP_DeInit();        //复位备份区域        
                RCC_LSEConfig(RCC_LSE_ON);        //设置外部低速晶振(LSE),使用外设低速晶振
                while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250)        //检查指定的RCC标志位设置与否,等待低速晶振就绪
                        {
                        temp++;
                        delay_ms(10);
                        }
                if(temp>=250)return 1;//初始化时钟失败,晶振有问题            
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);                //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟   
                RCC_RTCCLKCmd(ENABLE);        //使能RTC时钟  
                RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成
                RTC_WaitForSynchro();                //等待RTC寄存器同步  
                RTC_ITConfig(RTC_IT_SEC, ENABLE);                //使能RTC秒中断
                RTC_ITConfig(RTC_IT_ALR,ENABLE);
                RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成
                RTC_EnterConfigMode();/// 允许配置       
                RTC_SetPrescaler(32767); //设置RTC预分频的值
                RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成
                RTC_Set(2016,11,16,15,57,00);  //设置时间       
                RTC_WaitForLastTask();
                RTC_Alarm_Set(2016,11,16,15,58,0);
                RTC_ExitConfigMode(); //退出配置模式  
                BKP_WriteBackupRegister(BKP_DR1, 0X5051);        //向指定的后备寄存器中写入用户程序数据
                }
        else//系统继续计时
                {

                RTC_WaitForSynchro();        //等待最近一次对RTC寄存器的写操作完成
                RTC_ITConfig(RTC_IT_SEC, ENABLE);        //使能RTC秒中断
                RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成
                }
        RTC_NVIC_Config();//RCT中断分组设置                                                         
        RTC_Get();//更新时间       
        return 0; //ok

}               
void RTC_IRQHandler(void)
{                 
        if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒钟中断
        {                                                       
                RTC_Get();//更新时间   
        }
        if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断
        {
                RTC_ClearITPendingBit(RTC_IT_ALR);                //清闹钟中断                 
          RTC_Get();                                //更新时间   
          printf("Alarm Time:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//输出闹铃时间       
                            LED1=0;
                delay_ms(5000);
          }                                                                                                    
        RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);                //清闹钟中断
        RTC_WaitForLastTask();                                                                                           
}       
少设置什么东西了吗?                            

最佳答案

查看完整内容[请看2#楼]

不知道你少了啥东西,给你一个我的程序你自己看,另外以前在网上看到,中断时不要搞那么多东西占时间,中断就用来清各种标志。具体原因我忘了,你搜搜看,不过加个延时也没出来大问题。 我是使用RTC闹钟来唤醒待机模式,会正常触发的。使用的是RT_thread框架,其实里面配置我全都没动过。下面是我的一个帖子,4楼有4行代码你看一下,不管是RT_thread的还是裸机跑的,我都试过,不用额外配置,拿来直接用就行,一般的代码中秒中断 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-11-16 16:46:28 | 显示全部楼层
不知道你少了啥东西,给你一个我的程序你自己看,另外以前在网上看到,中断时不要搞那么多东西占时间,中断就用来清各种标志。具体原因我忘了,你搜搜看,不过加个延时也没出来大问题。
我是使用RTC闹钟来唤醒待机模式,会正常触发的。使用的是RT_thread框架,其实里面配置我全都没动过。下面是我的一个帖子,4楼有4行代码你看一下,不管是RT_thread的还是裸机跑的,我都试过,不用额外配置,拿来直接用就行,一般的代码中秒中断就是开启的。http://www.openedv.com/thread-80529-1-1.html
[mw_shl_code=applescript,true]        //rtc 初始化
        rt_hw_rtc_init();[/mw_shl_code][mw_shl_code=applescript,true]int RTC_Configuration(void)
{
    u32 count=0x200000;

    /* Enable PWR and BKP clocks */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    /* Allow access to BKP Domain */
    PWR_BackupAccessCmd(ENABLE);

    /* Reset Backup Domain */
    BKP_DeInit();

    /* Enable LSE */
    RCC_LSEConfig(RCC_LSE_ON);
    /* Wait till LSE is ready */
    while ( (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) && (--count) );
    if ( count == 0 )
    {
        return -1;
    }

    /* Select LSE as RTC Clock Source */
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    /* Enable RTC Clock */
    RCC_RTCCLKCmd(ENABLE);

    /* Wait for RTC registers synchronization */
    RTC_WaitForSynchro();

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    /* Set RTC prescaler: set RTC period to 1sec */
    RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    return 0;
}[/mw_shl_code][mw_shl_code=applescript,true]void rt_hw_rtc_init(void)
{
    rtc.type        = RT_Device_Class_RTC;

    if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
    {
        rt_kprintf("rtc is not configured\n");
        rt_kprintf("please configure with set_date and set_time\n");
        if ( RTC_Configuration() != 0)
        {
            rt_kprintf("rtc configure fail...\r\n");
            return ;
        }
    }
    else
    {
        /* Wait for RTC registers synchronization */
        RTC_WaitForSynchro();
    }

    /* register rtc device */
    rtc.init         = RT_NULL;
    rtc.open         = rt_rtc_open;
    rtc.close        = RT_NULL;
    rtc.read         = rt_rtc_read;
    rtc.write        = RT_NULL;
    rtc.control = rt_rtc_control;

    /* no private */
    rtc.user_data = RT_NULL;

    rt_device_register(&rtc, "rtc", RT_DEVICE_FLAG_RDWR);

    return;
}[/mw_shl_code][mw_shl_code=applescript,true]void RTC_WaitForSynchro(void)
{
  /* Clear RSF flag */
  RTC->CRL &= (uint16_t)~RTC_FLAG_RSF;
  /* Loop until RSF flag is set */
  while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET)
  {
  }
}[/mw_shl_code]




自在随心
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2020-6-2
在线时间
11 小时
发表于 2020-6-2 18:14:28 | 显示全部楼层
你else哪里再写一个闹钟中断使能。因为你第一次配置后,其他时间配置走的是else里面的那个配置
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-1-8
在线时间
6 小时
发表于 2020-10-24 20:16:45 | 显示全部楼层
alone233333 发表于 2020-6-2 18:14
你else哪里再写一个闹钟中断使能。因为你第一次配置后,其他时间配置走的是else里面的那个配置

感谢,问题解决了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 07:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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