当前位置: 首页 > news >正文

沈阳专业做网站开发公司奥特蛋的做网站

沈阳专业做网站开发公司,奥特蛋的做网站,外贸网站建设 福田,加快网站收录这一节我们要讲的主要内容是RTC实时时钟#xff0c;实时时钟本质上是一个定时器#xff0c;但是这个定时器是专门用来产生年月日时分秒#xff0c;这种日期和时间信息的。所以学会了STM32的RTC就可以在STM32内部拥有一个独立运行的钟表。想要记录或读取日期和时间#xff0…这一节我们要讲的主要内容是RTC实时时钟实时时钟本质上是一个定时器但是这个定时器是专门用来产生年月日时分秒这种日期和时间信息的。所以学会了STM32的RTC就可以在STM32内部拥有一个独立运行的钟表。想要记录或读取日期和时间就可以通过操作RTC来实现。RTC这个外设比较特殊它和备份寄存器(BKP)、电源控制(PWR)这两章关联性比较强因此在RTC这一章中就把BKP和RTC放在一起讲。我们首先就先介绍备份寄存器(BKP)其实备份寄存器(BKP)和SPI章节中学过的Flash存储器类似都是用来存储数据的只是Flash的数据是真正的掉电不丢失而BKP的数据是需要VBAT引脚接上备用电池来维持的只要VBAT有电池供电即使STM32主电源断电BKP的值也可以维持原状。首先我们来看一下时间戳的知识点。Unix 时间戳Unix Timestamp定义为从UTC/GMT的1970年1月1日0时0分0秒开始到现在所经过的秒数不考虑闰秒。在计算机的底层我们使用秒计数器来计时需要给人类观看时就转换为年月日时分秒这样的格式。时间戳存储在一个秒计数器中秒计数器为32位/64位的整型变量计算机为了存储这样一个永不进位的秒数这个数据变量类型还是要定义大一些这个变量类型在不同系统中定义是不一样的。我们本节STM32中的RTC其核心的计时部分是一个32位的可编程计数器说明我们这款STM32它的时间戳是32位的数据类型。世界上所有时区的秒计数器相同不同时区通过添加偏移来得到当地时间。GMTGreenwich Mean Time格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时以此确定计时标准。UTCUniversal Time Coordinated协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时UTC会执行闰秒来保证其计时与地球自转的协调一致接下来我们学习时间戳中秒计数器和日期时间如何进行相互转换这时候我们需要用到time.h模块C语言的time.h模块提供了时间获取和时间戳转换的相关函数可以方便地进行秒计数器、日期时间和字符串之间的转换在time.h里主要有表格内的这些主要函数时间戳转换关系如下图所示接下来我们学习BKP和RTC的外设部分我们首先学习BKP的相关知识点。BKP全称Backup Registers翻译过来就是备份寄存器BKP的用途就是可用于存储用户应用程序数据。其特性就是当VDD2.0~3.6V电源被切断他们仍然由VBAT1.8~3.6V维持供电。如果VDD断电VBAT也没电那BKP里的数据就会清零因为BKP本质上是RAM存储器没有掉电不丢失的能力。当系统在待机模式下被唤醒或系统复位或电源复位时他们也不会被复位TAMPER引脚产生的侵入事件将所有备份寄存器内容清除TEMPER是一个接到STM32外部的引脚其位置就是VBAT旁边的2号引脚其与PC13、RTC共用这个TAMPER引脚是一个安全保障设计比如如果做一个安全系数非常高的设备设备需要有防拆功能BKP里也存储了一些敏感数据那就可以使能这个TEMPER引脚的侵入检测功能设计者把下面两个RTC功能也放在了BKP中  1.引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲RTC的引脚也是在PC13这个位置     2.存储RTC时钟校准寄存器。最后看一下BKP中用户数据的存储容量在中容量和小容量设备里BKP是20个字节在大容量和互联型设备里BKP是84个字节。可以看出来BKP的容量其实非常小一般只能用来存储少量的参数。BKP的简介我们就介绍到这里。下面看一下BKP的基本结构图中橙色部分我们可以叫做后备区域BKP处于后备区域但后备区域不只有BKP还有RTC的相关电路。STM32后备区域的特性就是当VDD主电源掉电时后备区域仍然可以由VBAT的备用电池供电当VDD主电源上电时后备区域供电会由VBAT切换到VDD也就是主电源有电时VBAT不会用到这样可以节省电池电量。BKP是位于后备区域的BKP里主要有数据寄存器、控制寄存器、状态寄存器和RTC时钟校准寄存器。其中数据寄存器是主要部分用来存储数据每个数据寄存器都是16位的也就是一个数据寄存器可以存2个字节对于中容量和小容量的设备里面有DR1、DR2一直到DR10总共10个数据寄存器那一个寄存器两个字节所以容量是20个字节。对于大容量和互联型设备里面除了DR1到DR10还有DR11、DR12一直到DR42总共42个数据寄存器容量是84个字节。侵入检测可以从PC13位置的TAMPER引脚引入一个检测信号当TAMPER产生上升沿或者下降沿时清除BKP所有的内容以保证安全时钟输出可以把RTC的相关时钟从PC13位置的RTC引脚输出出去供外部使用。其中输出校准时钟时再配合校准寄存器可以对RTC的误差进行校准。以上就是BKP外设的结构和功能。接下来我们就继续学习以下RTC外设RTC英文全称  Real Time Clock  中文翻译为实时时钟在STM32中RTC是一个独立的定时器可为系统提供时钟和日历的功能RTC实时时钟一般就指提供年月日时分秒这种日期时间信息的计时装置RTC和时钟配置系统处于后备区域系统复位时数据不清零VDD2.0~3.6V断电后可借助VBAT1.8~3.6V供电继续走时其内部设有32位的可编程计数器可对应Unix时间戳的秒计数器。在读取时间时我们先得到这个计数器中的秒数然后使用time.h模块里的localtime函数就能立刻知道年月日时分秒的信息了在写入时间时我们先填充年月日时分秒信息到struct tm结构体然后用mktime函数得到秒数再写入到这个32位计数器即可。RTC外设中配有20位的可编程预分频器可适配不同频率的输入时钟由于32位的秒计数器显然1秒要自增一次所以驱动计数器的时钟需要是一个1Hz的信号但是实际提供给RTC模块的时钟也就是RTCCLK一般频率都比较高。所以显然我们需要在RTCCLK和计数器时钟输入之间加入一个分频器给RTCCLK降一降频率保证分频器输出给计数器的频率为1Hz。那为了适配各种频率的RTCCLK就在其中间加入了一个20位的分频器可以选择对输入时钟进行1-2^20这么大范围的分频这样就可以适配不同频率的输入时钟这就是这个可编程分频器的作用可选择三种RTC时钟源1.  HSE时钟除以128通常为8MHz/128 2.   LSE振荡器时钟通常为32.768KHz 3.  LSI振荡器时钟40KHz 这三个时钟可以选择其中一个介入到RTCCLK。在时钟树中高速时钟一般供内部程序运行和主要外设使用低速时钟一般供RTC、看门狗这些东西使用红色所圈出来的地方最右侧箭头通往RTC就是RTCCLKRTCCLK有三个来源第一个是OSC引脚接的HSE外部高速晶振这个晶振是主晶振一般用的8MHz8MHz进来通过128分频可以产生RTCCLK信号128分频的原因是8MHz的主晶振太快了如果不提前分频直接给RTCCLK后续即使再通过RTC的20位分频器也分不到1Hz这么低的频率。中间这一路的时钟来源是LSE外部低速晶振我们在OSC32这两个引脚接上外部低速晶振这个晶振产生的时钟可以直接提供给RTCCLK这个OSC32的晶振是内部RTC的专用时钟这个晶振的值也不是随便选的通常跟RTC有关的晶振都是统一的数值就是32.768KHz选择这个数值的原因是32KHz这个值附近的频率是这个晶振工艺比较合适的频率另一方面是32768是一个2的次方数2^15  32768 所以32.768KHz即32768Hz经过一个15位分频器的自然溢出就能很方便地得到1Hz的频率。自然溢出的意思就是设计一个15位的计数器这个计数器不用设置计数目标直接从0计到最大值就是计到32767计满后自然溢出这个溢出信号就是1Hz。所以目前在RTC电路中基本都是清一色的32.768KHz的晶振。最后第三路时钟源来自LSI内部低速RC振荡器LSI固定是40kHz如果选择LSI当作RTCCLK后续再经过40K的分频就能得到1Hz的计数时钟了。当然内部的RC振荡器一般精准度没有外部晶振高所以LSI给RTCCLK可以当作一个备选方案。另外LSI还可以提供给看门狗这个之后我们讲看门狗的时候再说。这三路时钟中我们最常用的就是中间这一路外部32.768KHz的晶振提供RTCCLK的时钟。不仅因为中间这一路32.768KHz的晶振本身就是专供RTC使用的其余的时钟其实各自都有各自的主要任务另外一个更重要的原因就是只有中间这一路的时钟可以通过VBAT备用电池供电上下两路时钟在主电源断电后是停止运行的。所以要想实现RTC主电源掉电继续走时的功能必须选择中间这一路的RTC专用时钟。接下来我们看一下RTC的框图看一下RTC外设具体是怎么设计的。先整体上划分一下左边的一块是核心的分频和计数计时部分右边这一块是中断输出使能和NVIC部分最上面一块是APB1总线读写部分最下面一块是和PWR关联的部分意思就是RTC的闹钟可以唤醒设备推出待机模式。在图中有灰色填充的部分都处于后备区域这些电路在主电源掉电后可以使用备用电池维持工作其他未被填充的部分就是待机时不供电有关睡眠、停机、待机这些低功耗相关的内容我们下节学PWR的时候再细讲。我们依次详细看一下。首先看分频和计数计时部分这一块的输入时钟是RTCCLKRTCCLK的来源需要在RCC里进行配置。因为可选的三路时钟频率各不相同而且都远大于我们所需要的1Hz的秒计数频率所以RTCCLK进来需要首先经过RTC预分频器进行分频这个分频器由两个寄存器组成上面这个是重装载寄存器RTC_PRL下面这个RTC_DIV手册里叫做余数寄存器但实际上这一块跟我们之前定时器时基单元里的计数器CNT和重装值ARR是一样的作用。分频器其实就是一个计数器计几个数溢出一次那就是几分频所以对于可编程的分频器来说需要有两个计数器RTC_DIV寄存器用来不断地计数另一个RTC_PRL寄存器我们写入一个计数目标值用来配置是几分频。那么PRL中就是计数目标我们写入6那就是7分频写入9那就是10分频下面这个DIV就是每来一个时钟计一个数的用途了当然这个DIV计数器是一个自减计数器每来一个输入时钟DIV的值自减一次自减到0时再来一个输入时钟DIV输出一个脉冲产生溢出信号同时DIV从PRL获取重装值回到重装值继续自减。分频输出后的时钟频率是1Hz提供给后续的秒计数器。然后看一下计数计时部分32位可编程计数器RTC_CNT就是计时最核心的部分我们可以把这个计数器看作是Unix时间戳的秒计数器这样借助time.h的函数就可以很方便地得到年月日时分秒了在其下面还设计有一个闹钟寄存器RTC_ALR这个ALR也是一个32位的寄存器和上面这个CNT是等宽的它的作用顾名思义就是设置闹钟我们可以在ALR写一个秒数设定闹钟当CNT的值跟ALR设定的闹钟值一样时这时就会产生RTC_Alarm闹钟信号通往右边的中断系统在中断函数里你可以执行相应的操作同时这个闹钟还兼具一个功能就是下面这里的闹钟信号可以让STM32退出待机模式。这个功能就可以对应一些用途比如你设计一个数据采集设备需要在环节非常恶劣的地方工作比如海底、高原、深井这些地方然后要求是每天中午12点采集一次环节数据其他时间为了节省电量避免频繁换电池芯片都必须处于待机模式这样的话我们就可以用这个RTC自带的闹钟功能。另外这个闹钟值是一个定值只能响一次所以你想实现周期性的闹钟那在每次闹钟响之后都需要再重新设置一下下一个闹钟时间。继续往右看就是中断部分了在左边这里有三个信号可以触发中断第一个是RTC_Second秒中断它的来源就是CNT的输入时钟如果开启这个中断那么程序就会每秒进一次RTC中断第二个是RTC_Overflow溢出中断它的来源是CNT的右边意思就是CNT的32位计数器计满溢出了会触发一次中断所以这个中断一般不会触发第三个RTC_Alarm闹钟中断刚才说过当计数器和闹钟值相等时触发中断同时闹钟信号可以把设备从待机模式唤醒。中断信号到右边这里就是中断标志位和中断输出控制F结尾的是对应的中断标志位IE结尾的是中断使能最后三个信号通过一个或门汇聚到NVIC中断控制器。最上面这部分APB1总线和APB1接口就是我们程序读写寄存器的地方了读写寄存器可以通过APB1总线来完成另外也可以看出RTC是APB1总线上的设备。最后最下面这一块推出待机模式还有一个WKUP引脚闹钟信号和WKUP引脚都可以唤醒设备。到这里这个RTC外设框图就已经全部了解清楚了。接下来看一下下面的基本结构图再总结一下以上内容最左边是RTCCLK时钟来源这一块需要在RCC里配置3个时钟选择一个当作RTCCLK之后RTCCLK先通过预分频器对时钟进行分频余数寄存器是一个自减寄存器存储当前的计数值重装寄存器是计数目标决定分频值。分频之后得到1Hz的秒计数信号通向32位计数器1s自增一次下面还有一个32位的闹钟值可以设定闹钟右边有三个信号可以触发中断分别是秒信号、计数器溢出信号和闹钟信号三个信号先通过中断输出控制进行中断使能使能的中断才能通向NVIC然后向CPU申请中断。在程序中我们配置这个数据选择器可以选择时钟来源配置重装寄存器可以选择分频系数配置32位计数器可以进行日期时间的读写需要闹钟的话配置32位闹钟值即可需要中断的话先允许中断再配置NVIC最后写对应的中断函数即可这就是RTC外设的主要内容。最后我们再看一些这个RTC的一些操作注意事项1.执行以下操作将使能对BKP和RTC的访问设置RCC_APB1ENR的PWREN和BKPEN使能PWR和BKP时钟设置PWR_CR的DBP使能对BKP和RTC的访问。正常的外设开启了时钟就能使用了但是BKP和RTC这两个外设开启稍微复杂些首先要设置RCC_APB1ENR这个实际上就是开启APB1外设的时钟要同时开启PWR和BKP的时钟对于RTC来说并没有单独开启时钟的选项。然后我们还要设置PWR_CR的DBP位来使能对BKP和RTC的访问2. 若在读取RTC寄存器时RTC的APB1接口曾经处于禁止状态则软件首先必须等待RTC_CRL寄存器中的RSF位寄存器同步标志被硬件置1。这一步对应代码里的一个库函数就是RTC等待同步一般在刚上电的时候调用一下这个函数就行了。3. 必须设置RTC_CRL寄存器中的CNF位使RTC进入配置模式后才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器。就是RTC会有一个进入配置模式的标志位把这一位置1才能设置时间其实这个操作在库函数中每个写寄存器的函数都会自动加上这个操作所以就不用再单独调用代码进入配置模式了。4. 对RTC任何寄存器的写操作都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时才可以写入RTC寄存器2和3的注意事项都是因为读写数据时使用的APB1总线是在PCLK1的时钟频率下运行的但是RTC外设内部的工作时钟是RTCCLKPCLK1的频率远大于RTCCLK因此任何读写操作都需要等待一会。下面我们进入到代码编写的部分。首先介绍一下备份寄存器BKP的库函数其中BKP_DeInit函数用于恢复缺省配置在BKP的外设中是有一个用途的就是手动清空BKP所有的数据寄存器因为如果有备用电池的话BKP的数据主电源掉电不清零、上电复位也不清零它就没清零的时候如果我们确实想要清零就可以使用这个函数这样所有BKP的数据都会变0BKP_TamperPinLevelConfig和BKP_TamperPinCmd用于配置TAMPER侵入检测功能前者可以配置TAMPER引脚的有效电平就是高电平触发还是低电平触发后者就是配置是否开启侵入检测功能如果需要侵入检测的话那就先配置TAMPER有效电平再使能侵入检测功能就行了BKP_ITConfig中断配置就是配置是否开启中断BKP_RTCOutputConfig这是配置时钟输出功能可以选择在RTC引脚上输出时钟信号输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲该配置需要通过 BKP 模块的寄存器来实现因此函数被归在了BKP的库文件之中BKP_SetRTCCalibrationValue用于设置RTC校准值其实就是写入RTC校准寄存器校准值的设置也需要写入 BKP 模块的相关寄存器因此也被归在了BKP的库文件之中。以上这些函数就是我们在上面说的BKP附加的小功能。之后的这几个函数才是经常使用的BKP_WriteBackupRegister写备份寄存器其第一个参数指定要写在哪个DR里第二个参数填你要写入的数据BKP_ReadBackupRegister读备份寄存器。参数指定要读哪个DR返回值就是DR里存的值。 此外我们还需要特别关注PWR库函数中的PWR_BackupAccessCmd函数即备份寄存器访问使能该函数中的内容就是设置PWR_CR寄存器里的DBP位我们来调用这个函数满足使用RTC和BKP外设时的注意事项1。下面对于RTC实时时钟编程我们总结其初始化步骤如下1.开启PWR时钟和BKP时钟使能BKP和RTC的访问2.启动RTC的时钟我们计划使用LES作为系统时钟所以使用RCC模块里的函数开启LSE的时钟3.配置RTCCLK这个数据选择器指定LSE为RTCCLK这一步的函数也是在RCC模块里的4.调用注意事项中提到的等待函数分别为等待同步和等待上一次操作完成5.配置预分频器给PRL重装寄存器一个合适的分频值以确保输出给计数器的频率是1Hz6.配置CNT的值给这个RTC一个初始时间如果需要闹钟的话可以配置闹钟值需要中断的话可以配置中断部分因为RTC比较简单所以库函数并没有使用结构体来配置RTC也没有RTC_Cmd这样的函数开启时钟就能自动运行了不需要最后再启动一下的。在RCC库函数中存在着一些和RTC时钟相关的函数。其中RCC_LSEConfig用于配置LSE外部低速时钟启动LSE时钟就调用这个函数RCC_LSICmd函数用于配置LSI内部低速时钟如果出现了外部时钟不起振的情况也可以使用这个内部时钟来进行实验RCC_RTCCLKConfigRTCCLK配置这个函数用来选择RTCCLK的时钟源实际上就是配置简化结构图中的数据选择器RCC_RTCCLKCmd启动RTCCLK在调用上一个函数选择时钟之后还需要调用一下这个Cmd函数使能一下另外还需要用到RCC_GetFlagStatus函数获取标志位因为LSE时钟不是你让它启动它就能立刻启动的调用启动时钟的函数之后我们还需要等待一下标志位等RCC的标志位LSERDY置1之后这个时钟才算启动完成工作稳定。有关RCC时钟部分的函数就这么多。接下来我们继续看RTC库函数中的函数RTC_ITConfig用于配置中断输出RTC_EnterConfigMode进入配置模式就是置CRL的CNF为1进入配置模式其对应注意事项中的第三条RTC_ExitConfigMode退出配置模式就是把CNF位清零RTC_GetCounter获取CNT计数器的值显然读取时钟就靠这个函数RTC_SetCounter写入CNT计数器的值显然设置时间就靠这个函数RTC_SetPrescaler写入预分频器这个值会写入到预分频器的PRL重装寄存器中用来配置预分频器的分频系数RTC_SetAlarm写入闹钟值RTC_GetDivider读取预分频器中的DIV余数寄存器余数寄存器是一个自减寄存器获取余数寄存器的值一般是为了得到更细致的时间因为CNT计数间隔最短就是1s如果需要更细致的时间比如分秒、厘秒、毫秒那就得靠这个DIV余数寄存器来实现RTC_WaitForLastTask等待上次操作完成对应注意事项中的第四条等待前一次写操作结束RTC_WaitForSynchro等待同步对应注意事项中的第二条。在RTC显示实时时钟代码中我如何保证在系统复位后保证时间信息仍然不被重置呢我可以借助BKP中存储内容在单片机供电断开时仍然能靠电池保存的特性在初始化代码中加入判断如果BKP中任一一个数据寄存器中内容不等于约定好的数字说明现在是单片机电源掉电、电池电源掉电之后重新启动因此需要进行初始化并且在BKP对应寄存器中写入该数据如果其中的内容等于数字了说明电池并未掉电则跳过初始化。
http://www.pierceye.com/news/478492/

相关文章:

  • 做网站要求高吗中国建设教育网
  • 支付宝 手机网站开发seo优化在哪里学
  • 建筑工人找活的平台郑州网站优化托管
  • 微网站 下载网站建设找刘贺稳营销专家
  • 网站建设的需求文档视频直播网站开发
  • 高州网站设计鄂尔多斯建设招投标网站
  • 建立网站看病的经济问题菜单设计制作图片
  • 网站推广优化招聘seo整站优化托管
  • 企业网站建设方案百度文库北京正邦品牌设计公司
  • 新乡个人网站建设国际婚恋网站排名
  • 昆明网站建设哪家seo内部优化具体做什么
  • 网站架构设计师浙江省建设厅网站证件
  • 服务器和网站维护安康网站建设公司报价
  • 网站搭建课程标准asp.net做购物网站
  • 网站代码怎么放seo怎么做
  • 网站建设需求说明书怎么写新手php网站建设
  • 织梦做招聘网站中山那些网站公司
  • 网站开发工程师公司购物网站推广
  • 做的网站打不开产品网站建设必要性
  • 网站建设模板免费下载制作网站公司图片
  • 网站建设是一次性给钱还是什么pr模板免费下载网站
  • 大气物流公司网站源码建设家装网站
  • 网站后台关键词交流建设网站
  • 学院网站建设总结华北理工大学学科建设处网站
  • 简单的网站php开发教程用cms做的网站 的步骤
  • seo杭州seo快速排名利器
  • 谷歌不收录网站一个完整的短视频策划方案
  • 网页制作培训网站关于营销的最新的新闻
  • 免费查找资料的网站wordpress中文4.8
  • 凡科建设的网站如何中式建筑公司网站