OpenEdv-开源电子网

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

求助求助。。。STM32F1系列HAL库RTC不能唤醒STOP模式

[复制链接]

3

主题

7

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-27
在线时间
2 小时
发表于 2022-5-7 09:52:51 | 显示全部楼层 |阅读模式
1金钱
STM32F103VGT6,用的HAL库。用的原子哥例程的RTC时钟,在正常工作时RTC设置的闹钟正常起闹进中断,进休眠,STOP停止模式后,闹钟不能唤醒。按键外部中断可以唤醒。
RTC初始化配置如下:

        hrtc.Instance=RTC;
        hrtc.Init.AsynchPrediv=32767;         //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767       
//        hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
        if(HAL_RTC_Init(&hrtc)!=HAL_OK)
        {
                Error_Handler();
        }
       
        if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!=0X5050)//是否第一次配置
        {
                RTC_Set(2022,4,22,17,40,0); //设置日期和时间,2019年11月27日,18点08分0秒                                                                                           
                HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0X5050);//标记已经初始化过了
                 printf("FIRST TIME\n");
        }

//        __HAL_RTC_ALARM_ENABLE_IT(&hrtc,RTC_IT_SEC);         //允许秒中断
        __HAL_RTC_ALARM_ENABLE_IT(&hrtc,RTC_IT_ALRA);         //允许闹钟中断
        HAL_NVIC_SetPriority(RTC_IRQn,0,1);                                 //抢占优先级1,子优先级2
        HAL_NVIC_EnableIRQ(RTC_IRQn);



RTC设置闹钟如下:
        uint16_t t;
        uint32_t seccount=0;
        if(syear<1970||syear>2099)return 1;          
        for(t=1970;t<syear;t++)        //把所有年份的秒钟相加
        {
                if(Is_Leap_Year(t))seccount+=31622400;//闰年的秒钟数
                else seccount+=31536000;                          //平年的秒钟数
        }
        smon-=1;
        for(t=0;t<smon;t++)           //把前面月份的秒钟数相加
        {
                seccount+=(uint32_t)mon_table[t]*86400;//月份秒钟数相加
                if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//闰年2月份增加一天的秒钟数          
        }
        seccount+=(uint32_t)(sday-1)*86400;//把前面日期的秒钟数相加
        seccount+=(uint32_t)hour*3600;//小时秒钟数
  seccount+=(uint32_t)min*60;         //分钟秒钟数
        seccount+=sec;//最后的秒钟加上去                             
        //设置时钟
  RCC->APB1ENR|=1<<28;//使能电源时钟
  RCC->APB1ENR|=1<<27;//使能备份时钟
        PWR->CR|=1<<8;    //取消备份区写保护
        //上面三步是必须的!
        RTC->CRL|=1<<4;   //允许配置
        RTC->ALRL=seccount&0xffff;
        RTC->ALRH=seccount>>16;
        RTC->CRL&=~(1<<4);//配置更新
        while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成  
       
        printf("RTC->CNT=%d--%d", RTC->CNTH,RTC->CNTL);
        printf("RTC->ALR=%d--%d", RTC->ALRH,RTC->ALRL);
        return 0;            

打印消息能看出寄存器值是写入了的。

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

使用道具 举报

3

主题

7

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-27
在线时间
2 小时
 楼主| 发表于 2022-5-7 13:10:04 | 显示全部楼层
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-27
在线时间
2 小时
 楼主| 发表于 2022-5-7 13:10:38 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2022-5-7 22:54:51 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 07:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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