)
1. Unix时间戳1.1 Unix时间戳简介Unix时间戳Unix Timestamp定义为从UTC/GMT的1970年1月1日0时0分0秒开始共计经历的秒数不考虑闰秒。只使用秒计时不进位。时间戳存在于一个秒计数器为32位/64位的整型变量。根据计算32位有符号数变量会于2038年溢出。世界上所有地区的秒计数器相同不同时间通过添加偏移来得到当地时间如下图所示1.2 GMT和UTCGMT格林尼治平均时基于格林尼治天文台观测地球自转得到的平太阳时是旧的世界时间标准现多仅用于口语时区表达。UTC协调世界时以原子钟为基础的现代国际标准时间基准通过闰秒适配地球自转全球时区以此为参照。1.3 Time.h模块C语言的Time.h模块提供了时间获取和时间戳转换的函数。可以方便的进行秒计数器日期时间和字符串之间的转换。核心类型time_t一般是long类型用来保存时间戳从 1970-01-01 00:00:00 UTC 起算的秒数struct tm结构体保存年月日时分秒星期的分解日历时间structtm{inttm_sec;// 秒 0~59inttm_min;// 分 0~59inttm_hour;// 时 0~23inttm_mday;// 日 1~31inttm_mon;// 月 0~110代表1月考点坑inttm_year;// 年从1900开始算要1900才是真实年份inttm_wday;// 星期 0周日inttm_yday;// 年内第几天inttm_isdst;// 夏令时标记};高频函数函数功能time(time_t *t)获取当前时间戳UTC 基准localtime(const time_t *)时间戳 → 本地时间返回struct tm*gmtime(const time_t *)时间戳 → UTC 世界时返回struct tm*mktime(struct tm*)本地tm结构体 → 转回时间戳strftime()把tm结构体格式化成时间字符串difftime(t2,t1)计算两个time_t的时间差返回 double秒2. BKP寄存器2.1 简介BKPBackup Register备份寄存器BKP 是 STM32 备份域里的一组 16 位寄存器主电源 VDD 断电后只要 VBAT 备用电池有电BKP 里的数据就不会丢普通系统复位、上电复位、待机唤醒都不会清空 BKP功能用户数据存储掉电保存少量参数重启直接读取。TAMPER 侵入检测PC13 复用为 TAMPER 引脚可配置一旦检测到引脚电平变化拆开设备触发开关硬件自动清空全部 BKP 寄存器还能触发中断用于安全设备防篡改。用户数据存储容量小 / 中容量F103C8T610 个 16 位寄存器总共 20 字节BKP_DR1 ~ BKP_DR10大容量 / 互联型42 个 16 位寄存器总共 84 字节BKP_DR1 ~ BKP_DR42基本结构RTC时钟输出RTC 输出引脚 PC13 属于备份域可硬件输出 512Hz 校准时钟或闹钟脉冲主芯片断电、VBAT 有电时仍能输出信号。2.2 VDD和VBATVDD3.3V 主电源正常工作后备域由 VDD 供电VBAT 电池不耗电VDD 掉电芯片内部自动切换后备域由**VBAT1.8~3.6V**供电维持 RTC 计时和BKP 数据3. RTC3.1 RTC简介RTCReal Time Clock实时时钟RTC是一个独立的定时器可以为系统提供时钟和日历的功能RTC位于后备区域可通过VBAT供电RTC通过32位可编程计数器存储秒对应Unix时间戳的秒计数器20位的可编程预分频器适配不同频率的时钟时钟源HSE时钟除以128此时再经过20分频可以得到1Hz的时钟LSE振荡器时钟经过32768分频后刚好1秒LSI振荡器时钟经过40Khz的分频得到1Hz的时钟只有LSE才能通过VBAT供电3.2 RTC框图灰色部分为备用区域待机的时候会维持供电RTCCLK进入时首先经过预分频然后计数器进行计数。RTC_ALR可以设置一个闹钟当计数器的值和RTC_ALR的值相同会产生一个中断。RTC可以产生右边的三个中断RTC_Second开启此中断会每秒进入一次中断RTC_Overflow32位计数器溢出2106年才会溢出RTC_Alarm闹钟中断可以通过WKUP或者闹钟信号唤醒待机结构简图3.3 VBAT供电方案按照数据手册直接向VBAT引脚供电内部搭配供电开关可以实现电路的切换按照参考手册的推荐电路4. PWR4.1 简介PWR负责管理STM32内部的电源供电部分可以实现可编程电压监测器和低功耗模式的功能。PVD可编程电压监测器可以检测VDD电源电压当VDD下降到PVD的阈值以下或者上升到PVD阈值之上PVD会触发中断用于执行紧急关闭任务。低功耗模式包括睡眠模式Sleep停机模式Stop和待机模式Standby可在系统空闲时降低STM32的功耗延长设备使用时间。4.2 电源框图分为模拟供电VDDA数字供电VDD以及备用电源VBAT模拟供电部分正极为VDDA负极为VSSA以及AD转换器有VREF-和VREF数字供电部分CPU核心存储器和内部数字外设供电为1.8V低电压监测器就是用来检测是否有电从而切换VBAT供电当VDD有电此时由VDD供电当VDD没电此时由VBAT供电。4.3 PVD当电压过低或者过高可以触发中断进入中断进行对应的操作中断申请通过外部中断实现4.4 低功耗模式图中分别展示了三种低功耗模式且从上到下关闭的区域越多睡眠模式只是将CPU时钟关闭可以通过任意中断或者事件进行唤醒停机模式将1.8V区域时钟以及振荡器关闭待机模式三部分都关闭只能通过表格特定的事件唤醒中断和事件中断要 CPU 跑代码事件只是硬件信号可查询可触发别的外设。4.4 低功耗模式选择执行WFIWait For Interrupt或者WFEWait For Event指令后STM32进入低功耗模式PDDS Power Down DeepSleepLPDS Low-Power DeepSleep5. Flash闪存5.1 简介Flash包括程序存储器系统存储器和选项字节三个部分作用利用程序存储器保存掉电不丢失的用户数据在程序中编程In-Application Programming实现程序的自我更新在进行Flash的写操作过程只能对页进行操作。最小的修改单位为页。5.2 内部闪存模块闪存分为小容量中容量和大容量产品以中容量产品为例三部分Flash是上面的三部分通过闪存存储器接口寄存器来对Flash进行擦除和编写页的起始地址0000 0400 0800 0C00 10005.3 Flash基本结构简图闪存的基本结构如下图所示5.4 芯片的电子签名电子签名存储在系统存储器包含芯片识别信息在出厂时编写不可更改。闪存容量寄存器基地址0x1FFF F7E0大小 16位产品唯一身份标识寄存器基地址0x1FFF F7E8大小96位作用可以对程序进行加密操作如果想要程序只能在指定设备运行那么可以在程序多处加入ID号判断。