机关网站建设 方案建设部网站政策法规
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:51
当前位置: 首页 > news >正文
机关网站建设 方案,建设部网站政策法规,网站开发报价技巧,手机网站建设制作教程视频教程目录 一、RTC简介 二、主要特性 三、功能描述 3.1 读RTC寄存器 3.2 配置RTC寄存器 四、BKP简介 五、RTC_Init()
- 函数BKP_ReadBackupRegister 2.RCC_LSEConfig设置外部低速晶振#xff08;LSE#xff09; 3.RTC基本结构
5.RTC_Init()实现 6.time.h 一、R…目录 一、RTC简介 二、主要特性 三、功能描述 3.1 读RTC寄存器 3.2 配置RTC寄存器 四、BKP简介 五、RTC_Init() 1. 函数BKP_ReadBackupRegister 2.RCC_LSEConfig设置外部低速晶振LSE 3.RTC基本结构 5.RTC_Init()实现 6.time.h 一、RTC简介 RTC和时钟配置系统处于后备区域系统复位时数据不清零VDD2.0~3.6V断电后可借助VBAT1.8~3.6V供电继续走时 实时时钟是一个独立的定时器RTC模块拥有一组连续计数的计数器在相应软件的配置下可以实现提供时钟日历的功能。 系统复位后对后备寄存器和RTC的访问被禁止这是为了防止对后备区域(BKP)的意外写操作。 执行以下操作将使能对后备寄存器和RTC的访问 ● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位使能电源和后备接口时钟 APB1外设时钟使能寄存器(RCC_APB1ENR) ● 设置寄存器PWR_CR的DBP位使能对后备寄存器和RTC的访问。 /开启时钟/RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //开启PWR的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE); //开启BKP的时钟/备份寄存器访问使能/PWR_BackupAccessCmd(ENABLE); //使用PWR开启对备份寄存器的访问 二、主要特性 可编程的预分频系数分频系数最高为2^20。 32位的可编程计数器可用于较长时间段的测量。 2个分离的时钟用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟频率的四分之一以上)。 STM32——RTC实时时钟-CSDN博客https://blog.csdn.net/NRWHF/article/details/132377472 可以选择以下三种RTC的时钟源 HSE时钟除以128 LSE振荡器时钟LSI振荡器时钟。 可选择三种RTC时钟源PTCCLK HSE时钟除以128通常为8MHz/128 LSE振荡器时钟通常为32.768KHz【经过15位分频器自然溢出得到1hz频率】 LSI振荡器时钟40KHz RTC 复位和主电源掉电后数据不丢失是BKP来实现的 注意整个stm32有四个时钟源 HSE 高速外部时钟信号 HSI 高速内部时钟信号 LSl低速内部时钟信号【低速时钟供RTC和看门狗】 LSE 低速外部时钟信号【低速时钟供RTC和看门狗】 2个独立的复位类型APB1接口由系统复位 RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位。 3个专门的可屏蔽中断闹钟中断用来产生一个软件可编程的闹钟中断。秒中断用来产生一个可编程的周期性中断信号(最长可达1秒)。 溢出中断指示内部可编程计数器溢出并回转为0的状态。 三、功能描述 RTC由两个主要部分组成(参见下图)。第一部分(APB1接口)用来和APB1总线相连。此单元还包含一组16位寄存器可通过APB1总线对其进行读写操作。APB1接口由APB1总线时钟驱动用来与APB1总线接口。 另一部分(RTC核心)由一组可编程计数器组成分成两个主要模块。第一个模块是RTC的预分频模块它可编程产生最长为1秒的RTC时间基准TR_CLK。RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。第二个模块是一个32位的可编程计数器可被初始化为当前的系统时间。 3.1 读RTC寄存器 若在读取RTC寄存器时RTC的APB1接口曾经处于禁止状态则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置’1’。 RTC的功能由这个控制寄存器控制。当前一个写操作还未完成时(RTOFF0时)不能写RTC_CR寄存器。 3.2 配置RTC寄存器 必须设置RTC_CRL寄存器中的CNF位使RTC进入配置模式后才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器。 另外对RTC任何寄存器的写操作都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位判断RTC寄存器是否处于更新中。仅当RTOFF状态位是’1’时才可以写入RTC寄存器。 配置过程 1. 查询RTOFF位直到RTOFF的值变为’1’ ;2. 置CNF值为1进入配置模式;3. 对一个或多个RTC寄存器进行写操作; 4. 清除CNF标志位退出配置模式; 5. 查询RTOFF直至RTOFF位变为’1’以确认写操作已经完成。 仅当CNF标志位被清除时写操作才能进行这个过程至少需要3个RTCCLK周期。 四、BKP简介 备份寄存器是42个16位的寄存器可用来存储84个字节的用户应用程序数据。他们处在备份域里当VDD电源被切断他们仍然由VBAT维持供电。当系统在待机模式下被唤醒或系统复位或电源复位时他们也不会被复位。 BKP可用于存储用户应用程序数据。当VDD2.0~3.6V电源被切断他们仍然由VBAT1.8~3.6V维持供电。当系统在待机模式下被唤醒或系统复位或电源复位时他们也不会被复位。 复位后对备份寄存器和RTC的访问被禁止并且备份域被保护以防止可能存在的意外的写操作。执行以下操作可以使能对备份寄存器和RTC的访问。 ● 通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟 ● 电源控制寄存器(PWR_CR)的DBP位来使能对后备寄存器和RTC的访问。配置代码上文已经给出 五、RTC_Init() 1. 函数BKP_ReadBackupRegister 2.RCC_LSEConfig设置外部低速晶振LSE 3.RTC基本结构 RTC和时钟配置系统处于后备区域系统复位时数据不清零VDD2.0~3.6V断电后可借助VBAT1.8~3.6V供电继续走时 执行以下操作将使能对BKP和RTC的访问 设置RCC_APB1ENR的PWREN和BKPEN使能PWR和BKP时钟 设置PWR_CR的DBP使能对BKP和RTC的访问 若在读取RTC寄存器时RTC的APB1接口曾经处于禁止状态则软件首先必须等待RTC_CRL寄存器中的RSF位寄存器同步标志被硬件置1 必须设置RTC_CRL寄存器中的CNF位使RTC进入配置模式后才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器 对RTC任何寄存器的写操作都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时才可以写入RTC寄存器 RTC_WaitForSynchro() //等待RTC寄存器(RTC_CNT, RTC_ALR and RTC_PRL)与RTC的APB时钟同步 RTC_WaitForLastTask() //等待最近一次对RTC寄存器的写操作完成 查阅固件函数库用户手册可知对于RTC的配置基本需要在调用函数前先调用RTC_WaitForLastTask()等待标志位RTOFF被设置。如下RTC_SetPrescaler函数 4.RCC_GetFlagStatus函数 RCC_LSEConfig(RCC_LSE_ON); //开启LSE时钟 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) ! SET); //等待LSE准备就绪 RCCFLAGTable 383. 给出了所有可以被函数RCC GetFlagStatus检查的标志位列表 5.RTC_Init()实现 注意 如果不加if判断会导致每次复位时间都会重置因为每次复位后都会调用初始化函数我们在初始化函数中有写入MyRTC_SetTime函数所以每次都会调用该函数进行复位变成uint16_t MyRTC_Time[] {2023, 1, 1, 23, 59, 55}; //定义全局的时间数组数组内容分别为年、月、日、时、分、秒 这样我们需要加入判断当系统主电源断电备用电池没有断电的时候不进行初始化。通过对BKP的判断实现该代码 0xA5A5全凭借个人喜好你可以设置任意值 if (BKP_ReadBackupRegister(BKP_DR1) ! 0xA5A5) //通过写入备份寄存器的标志位判断RTC是否是第一次配置 当第一次上电时或者系统完全断电的时候BKP_DR1默认为0只要不完全断电这玩意就不会被复位if判断语句成立进行初始化。最后再写入A5A5这就说明我们已经进行了初始化即已经上电了避免重复初始化这样就不会进入if语句不进行初始化就不会每次时间都回到你设置的值。 如果已经初始化了我们就不用初始化了在else中仅仅写上两行等待代码即可。 void MyRTC_Init(void) {/开启时钟/RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //开启PWR的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE); //开启BKP的时钟/备份寄存器访问使能/PWR_BackupAccessCmd(ENABLE); //使用PWR开启对备份寄存器的访问if (BKP_ReadBackupRegister(BKP_DR1) ! 0xA5A5) //通过写入备份寄存器的标志位判断RTC是否是第一次配置//if成立则执行第一次的RTC配置{RCC_LSEConfig(RCC_LSE_ON); //开启LSE时钟while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) ! SET); //等待LSE准备就绪RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择RTCCLK来源为LSERCC_RTCCLKCmd(ENABLE); //RTCCLK使能RTC_WaitForSynchro(); //等待同步RTC_WaitForLastTask(); //等待上一次操作完成RTC_SetPrescaler(32768 - 1); //设置RTC预分频器预分频后的计数频率为1HzRTC_WaitForLastTask(); //等待上一次操作完成MyRTC_SetTime(); //设置时间调用此函数全局数组里时间值刷新到RTC硬件电路BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); //在备份寄存器写入自己规定的标志位用于判断RTC是不是第一次执行配置}else //RTC不是第一次配置{RTC_WaitForSynchro(); //等待同步RTC_WaitForLastTask(); //等待上一次操作完成} } 如果LSE无法起振导致程序卡死在初始化函数中可将初始化函数替换为下述代码使用LSI当作RTCCLK但是LSI无法由备用电源供电故主电源掉电时RTC走时会暂停。 void MyRTC_Init(void) {RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);if (BKP_ReadBackupRegister(BKP_DR1) ! 0xA5A5){RCC_LSICmd(ENABLE);while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) ! SET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();RTC_WaitForLastTask();RTC_SetPrescaler(40000 - 1);//保证1Hz的频率1s计次RTC_WaitForLastTask();MyRTC_SetTime();BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);}else{RCC_LSICmd(ENABLE); //即使不是第一次配置也需要再次开启LSI时钟while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) ! SET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();RTC_WaitForLastTask();} } /** * 函 数RTC设置时间 * 参 数无 * 返 回 值无 * 说 明调用此函数后全局数组里时间值将刷新到RTC硬件电路 */ uint16_t MyRTC_Time[] {2023, 1, 1, 23, 59, 55};//定义全局的时间数组数组内容分别为年、月、日、时、分、秒void MyRTC_SetTime(void) {time_t time_cnt; //定义秒计数器数据类型struct tm time_date; //定义日期时间数据类型time_date.tm_year MyRTC_Time[0] - 1900; //将数组的时间赋值给日期时间结构体time_date.tm_mon MyRTC_Time[1] - 1;time_date.tm_mday MyRTC_Time[2];time_date.tm_hour MyRTC_Time[3];time_date.tm_min MyRTC_Time[4];time_date.tm_sec MyRTC_Time[5]; //从1900年1月1日0点到2023年1月1日0点一共经过了多少秒//通过mktime1转换为s //C 库函数 time_t mktime(struct tm *timeptr) 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数time_cnt mktime(time_date) - 8 * 60 * 60; //调用mktime函数将日期时间转换为秒计数器格式//- 8 * 60 * 60为东八区的时区调整RTC_SetCounter(time_cnt); //将秒计数器写入到RTC的CNT中RTC_WaitForLastTask(); //等待上一次操作完成 }/** * 函 数RTC读取时间 * 参 数无 * 返 回 值无 * 说 明调用此函数后RTC硬件电路里时间值将刷新到全局数组 */ void MyRTC_ReadTime(void) {time_t time_cnt; //定义秒计数器数据类型struct tm time_date; //定义日期时间数据类型time_cnt RTC_GetCounter() 8 * 60 * 60; //读取RTC的CNT获取当前的秒计数器// 8 * 60 * 60为东八区的时区调整time_date *localtime(time_cnt); //使用localtime函数将秒计数器转换为日期时间格式MyRTC_Time[0] time_date.tm_year 1900; //将日期时间结构体赋值给数组的时间MyRTC_Time[1] time_date.tm_mon 1;MyRTC_Time[2] time_date.tm_mday;MyRTC_Time[3] time_date.tm_hour;MyRTC_Time[4] time_date.tm_min;MyRTC_Time[5] time_date.tm_sec; }6.time.h C 标准库 – | 菜鸟教程 (runoob.com)https://www.runoob.com/cprogramming/c-standard-library-time-h.html struct tm *localtime(const time_t *timer) timer 的值被分解为 tm 结构并用本地时区表示。这里默认为0时区 time_t mktime(struct tm *timeptr) 把 timeptr 所指向的结构转换为一个依据本地时区的 time_t 值。这里同样默认为0时区 注意 为什么结构tm中的tm_year成员相对于1900年而不是1970年的macosx上的C - VoidCChttp://cn.voidcc.com/question/p-brsuhefn-va.html #define _CRT_SECURE_NO_WARNINGS 1 #includestdio.h #includetime.h int main() {struct tm Timer;Timer.tm_hour 13;Timer.tm_mon 11;Timer.tm_wday 4;Timer.tm_mday 23;Timer.tm_year 2023;Timer.tm_min 24;Timer.tm_sec 50;printf(%d:%d:%d\n, Timer.tm_hour, Timer.tm_min, Timer.tm_sec);time_t TIME time(NULL);printf(%lld\n%lld\n, TIME, time(TIME));const time_t Time_CNT 1047861430;Timer localtime(Time_CNT);printf(%d-%d-%d %d:%d:%d\n, Timer.tm_year1900,Timer.tm_mon1,Timer.tm_mday,Timer.tm_hour, Timer.tm_min, Timer.tm_sec);char Timer_ENG;Timer_ENG ctime(Time_CNT);printf(%s\n, Timer_ENG);time_t Time_COUNT;Time_COUNT mktime(Timer);printf(%lld\n, Time_COUNT);return 0; }
- 上一篇: 机关单位网站建设管理制度建设局主要管什么
- 下一篇: 机票旅游网站开发做笔记的网站源码
相关文章
-
机关单位网站建设管理制度建设局主要管什么
机关单位网站建设管理制度建设局主要管什么
- 技术栈
- 2026年03月21日
-
机构组织网站建设杭州高端响应式网站
机构组织网站建设杭州高端响应式网站
- 技术栈
- 2026年03月21日
-
机房建设网站自己做的网站容易被黑吗
机房建设网站自己做的网站容易被黑吗
- 技术栈
- 2026年03月21日
-
机票旅游网站开发做笔记的网站源码
机票旅游网站开发做笔记的网站源码
- 技术栈
- 2026年03月21日
-
机票网站建设方总1340812wordpress添加模版
机票网站建设方总1340812wordpress添加模版
- 技术栈
- 2026年03月21日
-
机票网站建设公司好用广州seo推广获精准访问量
机票网站建设公司好用广州seo推广获精准访问量
- 技术栈
- 2026年03月21日
