2019 3/17日 RTC时钟

RTC时钟

什么是RTC

RTC 是Real Time Clock 的简称,意为实时时钟。STM32提供了一个秒中断源和一个闹钟中断源,修改计数器的指可以重新设置系统当前的时间和日期。
RTC实际上就是 一个定时器而已,掉电之后会丢失所有信息,因此我们需要找一个地方来存储这些信息,于是找到了备份寄存器。掉电之后仍然可以通过纽扣电池供电,所以能时刻保存这些数据。

RTC配置相关

BKP
RTC模块和时钟配置系统的寄存器是在后备区域的,通过BKP后背区域来存储RTC配置的数据可以让其在系统复位或待机模式下唤醒后,RTC里面配置的数据维持不变。
PWR
PWR为电源的寄存器,我们需要用到的是电源控制寄存器,通过使能PWR_CR的DBP位来取消后被区域BKP的写保护

具体步骤

1.打开PWR和BKP时钟
RCC_APB1PeriphClockCmd (RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,ENABLE );
2.使能BKP和RTC的访问
PWR_BackupAccessCmd(ENABLE );
3.初始化复位BKP寄存器
BKP_DeInit ();
4.设置RTCCLK
RCC_LSEConfig (RCC_LSE_ON);
While(!RCC_GetFlagStatus (RCC_FLAG_HSERDY));//设置后需要等待启动
5.将RTC输入时钟 选择为LSE时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C语言实现一个万年历的示例代码: ```c #include <stdio.h> // 判断是否是闰年 int isLeapYear(int year) { return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0); } int main() { int year, month, day; int daysOfMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 每月的天数 // 获取用户输入的年、月、 printf("请输入年份:"); scanf("%d", &year); printf("请输入月份:"); scanf("%d", &month); printf("请输入期:"); scanf("%d", &day); // 判断输入的年份是否正确 if (year < 1900 || year > 2099) { printf("年份输入有误!\n"); return 1; } // 判断输入的月份是否正确 if (month < 1 || month > 12) { printf("月份输入有误!\n"); return 1; } // 判断输入的期是否正确 if (day < 1 || day > daysOfMonth[month - 1] || (month == 2 && isLeapYear(year) && day > 29)) { printf("期输入有误!\n"); return 1; } // 计算输入期是星期几 int totalDays = 0; for (int i = 1900; i < year; ++i) { totalDays += isLeapYear(i) ? 366 : 365; } for (int i = 0; i < month - 1; ++i) { totalDays += daysOfMonth[i]; if (i == 1 && isLeapYear(year)) { totalDays += 1; } } totalDays += day; int dayOfWeek = totalDays % 7; // 输出万年历 printf("\n\t\t%d年%d月\n", year, month); printf("------------------------------------------------\n"); printf("\t一\t二\t三\t四\t五\t六\n"); printf("------------------------------------------------\n"); int firstDayOfWeek = (dayOfWeek - (day - 1) % 7 + 7) % 7; // 计算本月第一天是星期几 int days = daysOfMonth[month - 1]; if (month == 2 && isLeapYear(year)) { days += 1; } for (int i = 0; i < firstDayOfWeek; ++i) { printf("\t"); // 输出空格 } for (int i = 1; i <= days; ++i) { printf("%d\t", i); if ((firstDayOfWeek + i) % 7 == 0) { printf("\n"); // 每周换行 } } printf("\n"); return 0; } ``` 运行程序后,用户可以输入年、月、(如2021年5月8),程序会输出该月的万年历: ``` 请输入年份:2021 请输入月份:5 请输入期:8 2021年5月 ------------------------------------------------ 一 二 三 四 五 六 ------------------------------------------------ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ``` 可以看到,输出的万年历中,每月的第一行会根据本月的第一天是星期几来输出对应数量的空格,以此对齐星期。每周的第七天会自动换行,以便于观察。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值