新手入门
- 积分
- 19
- 金钱
- 19
- 注册时间
- 2019-9-27
- 在线时间
- 2 小时
|
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;
打印消息能看出寄存器值是写入了的。
|
|