ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:26.03KB ,
资源ID:15527097      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/15527097.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(超透彻的STM32讲解资料RTC时钟Word格式.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

超透彻的STM32讲解资料RTC时钟Word格式.docx

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