1.新建工程
2.选择外部晶振(LSE也选成外部晶振)
RCC->Crystal/Ceramic Resonator
3.选择烧录方式
SYS->Serial Wire
4.选择串口通信方式
USART1->Asynchronous
5.编辑实时时钟
6.编辑时钟树
7.命名工程、选择编译器并点击生成代码
8.先编写一个串口测试代码
在usart.c中输入如下代码,注意代码写的位置
#include "stdio.h" #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *f) #endif PUTCHAR_PROTOTYPE { while((USART1->SR & 0x40) == 0); USART1->DR = (uint8_t) ch; return ch; }
加入头文件
在main.c中写测试代码
运行结果如下
9.魔术棒调试(不知道你们的keil5是不是这样的,我的keil必须要如下设置才能烧入代码)
10.经过上面的串口过程,没问题的话就可以写实时时钟的代码了
RTC_TimeTypeDef RtcTime;//RTC的时间
HAL_RTC_GetTime(&hrtc,&RtcTime,RTC_FORMAT_BIN);//获取时间 printf("%2d:%2d:%2d\t",RtcTime.Hours,RtcTime.Minutes,RtcTime.Seconds); HAL_Delay(1000);
结果可以看到的确时间出来了,但并没有变化,接下来我们试试加入日期
11.加入日期
RTC_DateTypeDef RtcData;//RTC日期
HAL_RTC_GetDate(&hrtc,&RtcData,RTC_FORMAT_BIN);//获取日期
加入日期后,时间跑起来了
12. 修改一下代码
HAL_RTC_GetTime(&hrtc,&RtcTime,RTC_FORMAT_BIN);//获取时间 HAL_RTC_GetDate(&hrtc,&RtcData,RTC_FORMAT_BIN);//获取日期 printf("time:%2d:%2d:%2d\t",RtcTime.Hours,RtcTime.Minutes,RtcTime.Seconds); printf("data:%4d.%2d.%2d",2000+RtcData.Year,RtcData.Month,RtcData.Date); HAL_Delay(1000);
要想复位不影响实时时钟,把rtc.c里的这段代码注释掉就可以了