OpenEdv-开源电子网

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

stm32F030C6使用RTC中断不工作

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-10-24
在线时间
7 小时
发表于 2019-6-12 17:36:35 | 显示全部楼层 |阅读模式
1金钱
RTC初始化程序如下,试了LSE、LSI都没有效果,请行家指导一下。

u8 user_RTC_Init(void)
{
        u8 temp=0;
  //RTC_Init(RTC_InitTypeDef * RTC_InitStruct);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);                //pwr   
        PWR_BackupAccessCmd(ENABLE);                            //enable rtc access
        if (RTC_ReadBackupRegister(RTC_BKP_DR1) != 0x5050)
        {       
                RCC_LSICmd(ENABLE);
          //RCC_LSEConfig(RCC_LSE_ON);                                                        //LSE
          //while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)        //wait for LSE
                while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
                {
                        temp++;
                }
          //if(temp>=250)return 1;                                                                //fail
          //RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);                    //LSE as rtc clk
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
                RCC_RTCCLKCmd(ENABLE);                                    //enable rtc
               
                RTC_WaitForSynchro();                                        //等待RTC寄存器同步  
                RTC_ITConfig(RTC_IT_TS, ENABLE);                    //使能RTC秒中断
                RTC_ITConfig(RTC_IT_ALRA, ENABLE);
                RTC_EnterInitMode();
          //RTC_SetPrescaler(32767);                            //设置RTC预分频的值
                RTC_Set(2009,12,2,10,0,55);                         //设置时间       
                RTC_ExitInitMode();                                 //退出配置模式  
        }
        else                                                    //系统继续计时
        {

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

}                                                     

中断程序如下
void RTC_IRQHandler(void)
{
    u8 res;
    if (RTC_GetITStatus(RTC_IT_TS) != RESET)
        {                                                       
                RTC_Get();
        }
        if(RTC_GetITStatus(RTC_IT_ALRA)!= RESET)
        {
                RTC_ClearITPendingBit(RTC_IT_ALRA);            
          }                                                                                                    
        RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_ALRA);
}



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

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164866
金钱
164866
注册时间
2010-12-1
在线时间
2099 小时
发表于 2019-6-13 02:34:39 | 显示全部楼层
回复

使用道具 举报

31

主题

2176

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14054
金钱
14054
注册时间
2018-8-3
在线时间
1143 小时
发表于 2019-6-13 11:52:31 | 显示全部楼层
  if (RTC_ReadBackupRegister(RTC_BKP_DR1) != 0x5050)  这句改成  if (RTC_ReadBackupRegister(RTC_BKP_DR1) != 0x5051)  试下
回复

使用道具 举报

31

主题

2176

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14054
金钱
14054
注册时间
2018-8-3
在线时间
1143 小时
发表于 2019-6-13 11:54:11 | 显示全部楼层
这个判断 如果还是之前的5050  是不会进行if语句里边的初始化的   还有建议你把内部时钟的使能 拉到这个if语句前面 这样每次重启的时候 才会开启内部时钟
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-10-24
在线时间
7 小时
 楼主| 发表于 2019-6-13 14:38:37 | 显示全部楼层
翼行园子 发表于 2019-6-13 11:54
这个判断 如果还是之前的5050  是不会进行if语句里边的初始化的   还有建议你把内部时钟的使能 拉到这个if ...

谢谢!
1、改成
RCC_LSICmd(ENABLE);
        if (RTC_ReadBackupRegister(RTC_BKP_DR1) != 0x5051)
        {       
          //RCC_LSICmd(ENABLE);
          //RCC_LSEConfig(RCC_LSE_ON);                                                        //LSE
          //while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)        //wait for LSE
                while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
                {
                        temp++;
                }

用jlink仿真,RCC_FLAG_LSIRDY不能置位,程序一直在while循环里面

2、RTC_ReadBackupRegister(RTC_BKP_DR1)这个函数里面的back register 到底是什么东西?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-4-24 23:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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