u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
u16 t;
u32 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+=(u32)mon_table[t]*86400;//月份秒钟数相加
if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//闰年2月份增加一天的秒钟数
}
seccount+=(u32)(sday-1)*86400;//把前面日期的秒钟数相加
seccount+=(u32)hour*3600;//小时秒钟数
seccount+=(u32)min*60; //分钟秒钟数
seccount+=sec;//最后的秒钟加上去
//设置时钟
//RCC->APB1ENR|=1<<28;//使能电源时钟
//RCC->APB1ENR|=1<<27;//使能备份时钟
//PWR->CR|=1<<8; //取消备份区写保护
//上面三步是必须的!
//RTC->CRL|=1<<4; //允许配置
//RTC->CNTL=seccount&0xffff;
//RTC->CNTH=seccount>>16;
//RTC->CRL&=~(1<<4);//配置更新
//while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
/* Enable PWR and BKP clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问
// RTC_EnterConfigMode();//进入配置模式
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
/* Change the current time */
RTC_SetCounter(seccount); //设置RTC计数器的值
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
// RTC_ExitConfigMode();//退出配置模式
return 0;
}
需要添加红色这几句才能修改时间。(红色代码对应原来的绿色代码)
但是,现在有一个小疑问:
为什么不需要置位CNF配置标志就能进入配置模式(l蓝色代码)。
请教大家了~~刚开始学STM32
|