Unix时间戳
GMT/UTC
时间戳转换
#include<stdio.h>
#include<time.h>
time_t time_cnt;
struct tm time_data;
char* time_str;
int main()
{
time(&time_cnt);
printf("%d\n", time_cnt);
time_data = *gmtime(&time_cnt);
printf("%d年%d月%d日 %d时%d分%d秒\n", 1900+time_data.tm_year, 1+time_data.tm_mon,
time_data.tm_mday, time_data.tm_hour,
time_data.tm_min, time_data.tm_sec);
time_data = *localtime(&time_cnt);
printf("%d年%d月%d日 %d时%d分%d秒\n", 1900 + time_data.tm_year, 1 + time_data.tm_mon,
time_data.tm_mday, time_data.tm_hour,
time_data.tm_min, time_data.tm_sec);
time_cnt = mktime(&time_data);
printf("%d\n", time_cnt);
time_str = ctime(&time_cnt);
printf(time_str);
time_str = asctime(&time_data);
printf(time_str);
char t[50];
strftime(t,50,"%Y-%m-%d %H:%M:%S",&time_data);
printf(t);
return 0;
}
BKP(RAM)
备用电源来保持掉电不丢失
BKP基本结构
橙色:后备区域-当VDD(主电源)掉电时,后备区域仍可由VBAT(备用电源)供电,主电源恢 复时切回。
RTC(Real Time Clock实时时钟)
32768 = 2^15 LSE时钟(RTC专用)
HSE和LSI在电源断电后停止运行
框图
灰色部分处于后备区域
RTC_PRL设重装值,每进入一个时钟RTC_DIV减一(自减计数器,可保持为0,即首个时钟到来后溢出,转为重装值继续计数)
RTC基本结构
硬件电路(备用电源电路设计)
注意事项
PWR电源控制
电源框图
电压调节器给1.8V区域供电
低功耗模式
唤醒事件:
在外设控制寄存器中使能一个中断,而不是在NVIC(嵌套向量中断控制器)中使能,并且在
Cortex-M3系统控制寄存器中使能SEVONPEND位。当MCU从WFE中唤醒后,外设的中断
挂起位和外设的NVIC中断通道挂起位(在NVIC中断清除挂起寄存器中)必须被清除。
配置一个外部或内部的EXIT线为事件模式。当MCU从WFE中唤醒后,因为与事件线对应的
挂起位未被设置,不必清除外设的中断挂起位或外设的NVIC中断通道挂起位。
该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。
PDDS = 0 -> 停机模式 PDDS = 1 -> 待机模式
LPDS = 0 -> 电压调节器开启 LPDS = 1 -> 电压调节器进入低功耗
退出停止模式后HSI被选为系统时钟-SystemInit
程序会从头开始
WDG看门狗(自动复位电路)
独立看门狗的时钟为LSI内部低速时钟、窗口看门狗为APB1
IWDG
框图
看门狗的重装计数器->自动重装计数器->喂狗
如果独立看门狗由硬件选项火软件启动,LSI振荡器将强制在打开状态,并且不能被关闭
键寄存器(防止误操作)
IWDG超时时间
FLSI = 40K
窗口看门狗
框图
T6位一旦为0即复位 写入WWDG_CR->喂狗
WWDG超时时间
IWDG/WWDG差别
FLSAH闪存
基本结构图
FLSH解锁(防止误操作)
访问存储器(读写)
读->可直接读 写->需要先解锁
volatile 防止编译器优化
程序寄存器擦除/写入(先擦除->写入)
字->32位 半字->16位 字节->8位
选项字节
选项字节擦除/写入
器件电子签名
程序代码范围限定