一、实验目标
阅读资料了解 STM32F103的RTC(实时时钟)原理,使用带SPI或IIC接口的OLED屏显模块实现以下功能: 1) 读取STM32F103C8T6 内部的时钟(年月日时分秒),日历(星期x),1秒周期,通过串口输出到PC上位机,;2) 读取AHT20的温度和湿度,通过OLED,把年月份时分秒、日历和实时温度、湿度显示出来,2秒周期。
二、RTC介绍
RTC实图
RTC,全称Real-Time Clock,即实时时钟。它是一个计算机内部或外部的硬件设备,用于提供计算机系统的当前时间和日期。RTC不仅提供了秒、分、时、日、月、年的信息,还可以用来生成周期性的中断,如每秒一次或每分钟一次,以便操作系统调度任务。
RTC的核心是一个32位的可编程计数器,它可以对应到Unix时间戳的秒计数器。此外,还有一个20位的可编程预分频器,可以适配不同频率的输入时钟。
在嵌入式中,RTC扮演着重要的角色。它不仅为系统提供了准确的时间,还为系统的操作提供了可靠的依据。例如,在分布式系统中,RTC可以确保不同节点之间的时间同步,从而确保系统的一致性。此外,RTC还可以用于安全系统,如加密和身份验证,以及事件记录和审计。
然而,虽然RTC非常重要,但它并不是万无一失的。例如,如果电池供电不足,或者设备出现故障,RTC可能会停止工作或提供错误的时间。因此,在关键应用中,需要对RTC进行定期的维护和检查,以确保其正常工作。
RTC硬件电路如下:
三、基于HAL库利用RTC读取日期时间并输出到串口
3.1 配置CubeMX
3.2 RCC配置
3.3 RTC配置
3.4 设置时间
3.5 打开USART1,设置串口通信,设置为异步通信,同时开启中断
3.6 打开时钟,配置LSI低速内部时钟
3.7 生成工程
3.2 代码撰写
1.定义重定向printf函数,使其能够打印文字和数据到串口。同时定义年月日结构体以及时分秒结构体
#include "stdio.h"
int fputc(int ch,FILE *f){
uint8_t temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,2);
return ch;
}
RTC_DateTypeDef GetData; //获取日期结构体
RTC_TimeTypeDef GetTime; //获取时间结构体
2.编写while函数
while (1)
{
/* Get the RTC current Time */
HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
/* Get the RTC current Date */
HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
/* Display date Format : yy/mm/dd */
printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
/* Display time Format : hh:mm:ss */
/* Display date Format : weekday */
if(GetData.WeekDay==1){
printf("星期一\r\n");
}else if(GetData.WeekDay==2){
printf("星期二\r\n");
}else if(GetData.WeekDay==3){
printf("星期三\r\n");
}else if(GetData.WeekDay==4){
printf("星期四\r\n");
}else if(GetData.WeekDay==5){
printf("星期五\r\n");
}else if(GetData.WeekDay==6){
printf("星期六\r\n");
}else if(GetData.WeekDay==7){
printf("星期日\r\n");
}
printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
printf("\r\n");
HAL_Delay(1000);
}
3.3 实现结果
四、读取日期温湿度并在oled显示
1.编写bsp_i2c.c中的read_AHT20函数
void read_AHT20(void)
{
uint8_t i;
for(i=0; i<6; i++)
{
readByte[i]=0;
}
//-------------
I2C_Start();
I2C_WriteByte(0x71);
ack_status = Receive_ACK();
readByte[0]= I2C_ReadByte();
Send_ACK();
readByte[1]= I2C_ReadByte();
Send_ACK();
readByte[2]= I2C_ReadByte();
Send_ACK();
readByte[3]= I2C_ReadByte();
Send_ACK();
readByte[4]= I2C_ReadByte();
Send_ACK();
readByte[5]= I2C_ReadByte();
SendNot_Ack();
//Send_ACK();
I2C_Stop();
//--------------
if( (readByte[0] & 0x68) == 0x08 )
{
H1 = readByte[1];
H1 = (H1<<8) | readByte[2];
H1 = (H1<<8) | readByte[3];
H1 = H1>>4;
H1 = (H1*1000)/1024/1024;
T1 = readByte[3];
T1 = T1 & 0x0000000F;
T1 = (T1<<8) | readByte[4];
T1 = (T1<<8) | readByte[5];
T1 = (T1*2000)/1024/1024 - 500;
AHT20_OutData[0] = (H1>>8) & 0x000000FF;
AHT20_OutData[1] = H1 & 0x000000FF;
AHT20_OutData[2] = (T1>>8) & 0x000000FF;
AHT20_OutData[3] = T1 & 0x000000FF;
}
else
{
AHT20_OutData[0] = 0xFF;
AHT20_OutData[1] = 0xFF;
AHT20_OutData[2] = 0xFF;
AHT20_OutData[3] = 0xFF;
printf("lyy");
}
t=T1/10;
t1=T1%10;
a=(float)(t+t1*0.1);
h=H1/10;
h1=H1%10;
b=(float)(h+h1*0.1);
sprintf(strTemp,"%.1f",a);
sprintf(strHumi,"%.1f",b);
GUI_ShowCHinese(16,00,16,"温湿度",1);
GUI_ShowCHinese(16,20,16,"温度",1);
GUI_ShowString(53,20,strTemp,16,1);
GUI_ShowCHinese(16,38,16,"湿度",1);
GUI_ShowString(53,38,strHumi,16,1);
delay_ms(1500);
delay_ms(1500);
}
2.编写main.c文件
int main(void)
{
delay_init();
uart_init(115200);
IIC_Init();
NVIC_Configuration();
OLED_Init();
OLED_Clear(0);
while(1)
{
read_AHT20_once();
OLED_Clear(0);
delay_ms(1500);
}
}
3.编写oledfont.h文件
"温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"ÎÂ",0*/
"度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"¶È",0*/
4.实现效果
五、总结
本次实验主要目的是读取STM32F103C8T6微控制器内部的时钟和日历信息,以及AHT20传感器的温度和湿度数据,并通过串口输出到PC上位机,和通过OLED显示屏实时显示时间、日历和温度、湿度信息。
实验过程中,首先需要配置STM32F103C8T6的时钟系统,以便正确读取年月日时分秒信息。然后,使用AHT20传感器读取温度和湿度数据,并将其通过I2C接口传输给STM32F103C8T6。在每秒钟的固定时刻,STM32F103C8T6会通过串口将时间、日历和温度、湿度数据发送到PC上位机。同时,在OLED显示屏上实时显示这些信息。
实验结果表明,该系统能够正确读取STM32F103C8T6的时钟和日历信息,以及成功在oled上AHT20传感器的温度和湿度数据。在实验过程中遇到了一些问题通过csdn和查阅有关资料都得到了有效的解决。本实验总结了实验过程中遇到的问题及解决方法,为今后的实验提供了参考。