通过hal库实现RTC实时时钟功能
使用野火stm32f103zet6,通过杨桃电子hal库教学视频编写
存在的问题
无法设置日期和时间
代码
if(USART1_RX_STA&0xC000) //如果标志位是0xC000表示收到的数据串完成。可以处理。
{
if((USART1_RX_STA&0x3FFF)==0) //单独的回车键再显示一次欢迎词
{
HAL_RTC_GetTime(&hrtc,&RtcTime,RTC_FORMAT_BIN); //读出时间值
HAL_RTC_GetDate(&hrtc,&RtcData,RTC_FORMAT_BIN); //先读时间后读日期
printf(" RTC实时时钟测试 \r\n");
printf(" 实时时间:%04d-%02d-%02d %02d:%02d:%02d \r\n",2000+RtcData.Year,
RtcData.Month,RtcData.Date,RtcTime.Hours,RtcTime.Minutes,RtcTime.Seconds); //显示日期时间
printf(" 单按回车键更新时间,输入字母C初始化时钟 \r\n");
printf(" 请输入设置时间,格式20170806120000,按回车键确定! \r\n");
}
else if((USART1_RX_STA&0x3FFF)==1) //判断数据是不是1个
{
if(USART1_RX_BUF[0]=='c'||USART1_RX_BUF[0]=='C')
{
MX_RTC_Init(); //键盘输入c或C,初始化时钟
printf(" 初始化成功! \r\n");
}
else
{
printf("指令错误! \r\n");
}
}
else if((USART1_RX_STA&0x3FFF)==14) //判断数据是不是14个
{
//将超级终端发过来的数据换算并写入RTC
RtcData.Year = (USART1_RX_BUF[2]-0x30)*10+USART1_RX_BUF[3]-0x30; //减0x30后才能得到十进制数据
RtcData.Month = (USART1_RX_BUF[4]-0x30)*10+USART1_RX_BUF[5]-0x30;
RtcData.Date = (USART1_RX_BUF[6]-0x30)*10+USART1_RX_BUF[7]-0x30;
RtcTime.Hours = (USART1_RX_BUF[8]-0x30)*10+USART1_RX_BUF[9]-0x30;
RtcTime.Minutes = (USART1_RX_BUF[10]-0x30)*10+USART1_RX_BUF[11]-0x30;
RtcTime.Seconds = (USART1_RX_BUF[12]-0x30)*10+USART1_RX_BUF[13]-0x30;
if (HAL_RTC_SetTime(&hrtc,&RtcTime,RTC_FORMAT_BIN) != HAL_OK) //将数据写入RTC
{
printf("写入时间失败! \r\n"); //显示写入失败
}
else if(HAL_RTC_SetDate(&hrtc,&RtcData,RTC_FORMAT_BIN) != HAL_OK) //将数据写入RTC程序
{
printf("写入日期失败! \r\n");
}
else printf("写入成功! \r\n");
}
else
{
printf("指令错误! \r\n"); //如果不是以上正确操作,显示指令错误
}
USART1_RX_STA=0; //将串口数据标志位清零
}
}
结果