开发工具:STM32Cubemx,keil5
固件包:STM32Cube_FW_F1_V1.8.0
1.打开STM32Cubemx,点击New Project,在Commercial Part Number处选择STM32F103C8T6打开。
2.点击左侧的SYS,将No Debug改为Serial Wire。(No Debug模式下会导致烧录一次后调试口关闭无法进行二次烧录)
3.点击RCC,照图中圈中的地方设置
4.点击RTC,勾选Activate Clock Source(激活时钟源)和Activate Calendar(激活日历)
5.在下方的Calendar Date处设置起始日期,在Calendar Time设置起始时间。RTC将会从这个时间开始计时,year表示起始年份,month表示起始月,date为起始日期,weekday为起始工作日。Hours为起始小时数,minutes为起始分钟数,seconds为起始秒数。
6.在左侧Connectivity中点击USART1(Universal Synchronous Asynchronous Receiver),在Mode中选择Asynchronous(异步通信),下方Parameter Settings中如图设置,在NVIC Settings中勾选USART1 global interrupt.
7.在Project Manager中给项目命名并选择安装路径。在Toolchain中选择MDK-ARM,Min Version中选择V5,在下方Firmware Package Name and Version一行中取消Use latest available version的勾选,选择STM32Cube_FW_F1_V1.8.0。(最下方的Use Default Firmware Location打勾是使用默认的固件包安装路径。如果安装固件包时手动选择了安装路径就取消打勾,点击Browse选择安装时的路径)
8.在Code Generator如图配置。
9.点击右上角GENERATE CODE生成代码并点击Open Project。
9.在main.c中做如下修改:
添加头文件
#include "stdio.h"
#include "string.h"
10.我将RTC结构体的成员重新声明在了一个数组MyRTC_ReadTime下
uint16_t MyRTC_Time[6];
void MyRTC_ReadTime(void)
{
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
MyRTC_Time[0] = sDate.Year;
MyRTC_Time[1] = sDate.Month;
MyRTC_Time[2] = sDate.Date;
MyRTC_Time[3] = sTime.Hours;
MyRTC_Time[4] = sTime.Minutes;
MyRTC_Time[5] = sTime.Seconds;
}
11.重要的一步,printf函数无法通过串口输出打印数据在调试助手上,需要重定义printf函数使其指向串口输出。
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return ch;
}
12.在主循环while(1)中使用第10步定义的包含结构体成员的数组。然后打印出年月日时分秒等数据并设置1000ms的延时即每秒打印一次。(注意需要在上方扳手处先将Editor选项卡中的Encoding改成UTF-8编码模式,不然串口数据会乱码)
while (1)
{
/* USER CODE END WHILE */
MyRTC_ReadTime();
printf("%dnian%dyue%dri\r\n", 2000 + MyRTC_Time[0], MyRTC_Time[1], MyRTC_Time[2]);
printf("%dshi%dfen%dmiao\r\n", MyRTC_Time[3], MyRTC_Time[4], MyRTC_Time[5]);
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
13.编译程序,连接单片机,boot0置1,boot1置0,打开串口调试助手,找到相应的hex文件,开始下载。
14.下载完成,boot0和boot1置回0,点击复位键,串口输出RTC时间。