1、 */void NVIC_Configuration(void)NVIC_InitTypeDef NVIC_InitStructure;/*设置先占优先级1位,从占优先级3位*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/*选择RTC的IRQ通道*/NVIC_InitStructure.NVIC_IRQChannel =RTC_IRQn;/*设置中断先占优先级为1*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;/*设置中断从占优先级为1*/NVIC_InitStructure
2、.NVIC_IRQChannelSubPriority =0;/*使能RTC的IRQ通道*/NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;NVIC_Init(&NVIC_InitStructure);第三:对于RTC的使用,首先我们要判断是否是第一次使用RTC,如果是第一次使用那么肯定要设置时间的初始值以及对RTC进行相应的配置,而如果不是第一次使用,那么我们就无需再设置时间的初始值以及对RTC进行相应的配置,只需让RTC计数器继续计数就可以了。那么我们如何才能判断RTC是否为第一次使用呢?STM32中有一个后备寄存器,寄存器中的值不会因为掉电而改
3、变,既然如此那我们肯定会这样想,当我第一次使用RTC时,往后备寄存器中写入一个值,下次再使用RTC时,我只要判断后备寄存器中的值是否为我第一次用RTC时写入的值,如果相等,说明我以前已经用过RTC了,现在我无需再对RTC进行配置了,因为第一次都配置好了(RTC和后备寄存器一样,RTC寄存器中设置的值不会因为掉电而改变),但要注意的是RTC的允许中断这一位在每次复位后会回到默认值,所以每次复位后我们都要再次设置允许RTC中断。下面我们就看看RTC的配置程序: /*RTC_Configuration配置RTCvoid RTC_Configuration(void) /* 使能PWR和BKP时钟 *
4、/RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /*取消后备区域的写保护,因为后备寄存器中放的是重要的数据,默认是不允许往里面写入值的 */PWR_BackupAccessCmd(ENABLE);/* 将后背寄存器的寄存器值设为默认值 */BKP_DeInit();/* 打开外部低速晶振,RTC可以选择的时钟源是外部和内部低速晶振及外部高速晶振,这里我们选择外部低速晶振32768HZ */RCC_LSEConfig(RCC_LSE_ON);/*等待外部低速晶振准备就序*/while(RCC_Ge
5、tFlagStatus(RCC_FLAG_LSERDY) = RESET)/*选择外部低速晶振为RTC的时钟源*/RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);/* Enable RTC Clock */RCC_RTCCLKCmd(ENABLE);/* 等待RTC寄存器与RTC的APB时钟同步 */RTC_WaitForSynchro();/* 等待上次对RTC寄存器配置完成 */RTC_WaitForLastTask();/* 使能RTC中断 */RTC_ITConfig(RTC_IT_SEC, ENABLE); /* 等待上次对RTC寄存器配置完成 */ /
6、* 设置RTC的预分频值,因为外部低速晶振是32768,所以选择 */ /* RTC计数器计数频率= RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */RTC_SetPrescaler(32767); 下面再来看看在RTC中断中写了哪些程序:RTC_IRQHandler(void)RTC中断服务函数void RTC_IRQHandler(void) /*判断中断标志位是否被置位*/if (RTC_GetITStatus(RTC_IT_SEC) != RESET)/* 清除中断标志位 */RTC_ClearITPendingBit(RTC_IT_SEC);/* T
7、imeDisplay是一个标志位,只有等于1时才让串口发送时间数据,即让串口一秒发一次时间值 */TimeDisplay = 1;/* Wait until last write operation on RTC registers has finished */RTC_WaitForLastTask();/* 当时间走到23:59:59秒时RTC计数器中的值清零,0x00015180=23*3600+56*60+59*/if (RTC_GetCounter() = 0x00015180)RTC_SetCounter(0x0);/* Wait until last write operatio
8、n on RTC registers has finished */RTC_WaitForLastTask();第四:RTC配置好后肯定要对初始时间的设置进行相应的配置了,首先是如何从串口中接受设置的时间初始值:USART_Scanf串口从超级终端中获取数值- value 用户在超级终端中输入的数值被Time_Regulate(void)调用 */ uint8_t USART_Scanf(uint32_t value)uint32_t index = 0;uint32_t tmp2 = 0, 0;while (index 2)/* 等待数据接受完成 */while (USART_GetFlag
9、Status(USART1, USART_FLAG_RXNE) = RESET)/*将数据给数组tmp, 从串口终端里面输进去的数是ASCII码值*/tmpindex+ = (USART_ReceiveData(USART1); /*判断接受到的数据是否在0到9之间*/if (tmpindex - 1 0x39)printf(nrPlease enter valid number between 0 and 9);index-;/*将接受的两个数据组成一个两位数 */index = (tmp1 - 0x30) + (tmp0 - 0x30) * 10);/* 判断组成后的值是否有无,比如组成的
10、小时不能超过23,分秒不能超过59,value 即为23,或59*/if (index value)printf(nrPlease enter valid number between 0 and %d, value);return 0xFF;return index;上面的函数是被下面的Time_Regulate(void)函数调用的。 /*Time_Regulate返回用户在超级终端中输入的时间值,并将值储存在 * RTC 计数寄存器中。用户在超级终端中输入的时间值,单位为 s被Time_Adjust调用,调用USART_Scanfuint32_t Time_Regulate(void)u
11、int32_t Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF;printf(rn=Time Settings=rn Please Set Hourswhile (Tmp_HH = 0xFF) /*将串口接受的数据给Tmp_HH ,23便是传递给USART_Scanf(value)中的形参value的*/Tmp_HH = USART_Scanf(23);: %d, Tmp_HH);rn Please Set Minuteswhile (Tmp_MM = 0xFF)Tmp_MM = USART_Scanf(59);, Tmp_MM);rn Please S
12、et Secondswhile (Tmp_SS = 0xFF)Tmp_SS = USART_Scanf(59);, Tmp_SS);/* 将时分秒转换成秒放入RTC计数器中*/return(Tmp_HH*3600 + Tmp_MM*60 + Tmp_SS);Time_Adjust时间调节主函数调用void Time_Adjust(void)/* Wait until last write operation on RTC registers has finished */* 将设置的初始时间值装入RTC计数器,RTC开始运行时,计数器里面的值会在初始值的基础上自动一秒加1次*/RTC_SetCounter(Time_Regulate();RTC_WaitForLast
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1