stm32rtc实时时钟oled显示
时间: 2023-06-05 18:47:03 浏览: 1501
STM32RTC实时时钟可以通过OLED显示器显示时间和日期。可以使用STM32CubeMX配置RTC和OLED,并使用HAL库编写代码来读取RTC并将其显示在OLED上。在代码中,需要使用RTC和I2C库来控制RTC和OLED。可以使用RTC的时间和日期寄存器来读取当前时间和日期,并使用OLED库将其显示在OLED上。需要注意的是,OLED显示器需要初始化和配置才能正确显示。
相关问题
stm32rtc实时时钟oled显示江科大
### STM32 RTC 实时时钟 OLED 显示教程
为了在STM32平台上实现RTC(实时时钟),并将其显示到OLED屏幕上,以下是详细的说明以及示例代码。
#### 1. 硬件配置
通常情况下,在STM32F1系列中会使用外部低速晶体振荡器 (LSE),频率为 **32.768kHz**[^1]。该晶振通过分频产生精确的1Hz时钟信号用于RTC功能。硬件连接如下:
- 将32.768kHz晶振接到STM32的 LSE_IN 和 LSE_OUT 引脚上。
- 配置I2C接口以驱动OLED屏幕。
#### 2. 软件初始化
##### 初始化RTC模块
启用RTC外设之前,需先使能LSE,并设置RTC预分频寄存器来生成所需的时基。以下是一个简单的初始化过程:
```c
void RTC_Init(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
// 启用LSE作为RTC时钟源
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWR_EnableBkUpAccess();
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){
Error_Handler();
}
// 设置RTC时钟源为LSE
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){
Error_Handler();
}
// 复位RTC域
__HAL_RCC_BACKUPRESET_FORCE();
__HAL_RCC_BACKUPRESET_RELEASE();
// 初始化RTC结构体
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
// 配置当前时间为初始值
sTime.Hours = 0;
sTime.Minutes = 0;
sTime.Seconds = 0;
// 配置当前日期为初始值
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 1;
sDate.Year = 0;
if(HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK){
Error_Handler();
}
if(HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK){
Error_Handler();
}
}
```
上述代码完成了以下几个操作:
- 启用了LSE作为RTC时钟源。
- 对RTC进行了基本的时间和日期设定。
##### I2C与OLED初始化
假设使用的是一款基于SSD1306控制器的OLED屏,则可以通过I2C协议对其进行控制。这里提供一个基础的I2C初始化函数:
```c
void MX_I2C1_Init(void) {
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
Error_Handler();
}
}
// SSD1306库中的初始化函数调用
SSD1306_Init();
```
#### 3. 时间读取与显示逻辑
利用 `HAL_RTC_GetTime` 函数可以从RTC获取当前时间,并更新至OLED显示屏上。下面是一段定时刷新时间的例子:
```c
void Display_Time() {
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
char buffer[50];
sprintf(buffer, "TIME:%02d:%02d:%02d", sTime.Hours, sTime.Minutes, sTime.Seconds);
SSD1306_GotoXY(0, 0);
SSD1306_Puts(buffer, &Font_11x18, 1);
sprintf(buffer, "DATE:%02d/%02d/20%02d", sDate.Date, sDate.Month, sDate.Year);
SSD1306_GotoXY(0, 20);
SSD1306_Puts(buffer, &Font_7x10, 1);
SSD1306_UpdateScreen();
}
```
此部分实现了从RTC读取时间和日期的功能,并将它们格式化成字符串形式输出到OLED屏幕上。
#### 4. 主循环设计
最后,在主程序中不断调用 `Display_Time()` 来保持实时更新效果:
```c
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
RTC_Init();
SSD1306_Init();
while (1) {
Display_Time();
HAL_Delay(1000); // 每隔一秒刷新一次
}
}
```
以上即为完整的解决方案框架。
---
stm32rtc实时时钟oled如何修改时间
### STM32 RTC与OLED结合应用
在STM32项目中,通过OLED显示并修改RTC(实时时钟)的时间涉及多个部分的协同工作。这不仅需要配置好RTC模块来获取当前时间和设置新时间,还需要利用OLED显示屏展示这些信息给用户,并提供一种交互方式让用户输入新的时间数据。
#### 配置RTC模块
为了使STM32能够读取和更新实时时间,在初始化阶段应该正确配置RTC外设。通常情况下,RTC依赖于低功耗振荡器LSE作为时基源[^1]。下面是一段用于开启RTC功能的基础代码:
```c
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
// 开启LSE时钟
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
```
#### 初始化OLED屏幕
接着是对OLED屏的初始化操作。这里假设采用的是基于SPI接口连接的SSD1306驱动IC控制的小尺寸图形液晶显示器。其初始化流程如下所示[^2]:
```c
#include "ssd1306.h"
void OLED_Init(void){
SSD1306_Init();
}
```
#### 显示当前时间
为了让用户看到当前设定好的时间,可以通过调用`HAL_RTC_GetTime()`函数获得小时、分钟等信息,并将其转换成字符串形式以便打印到屏幕上:
```c
char buffer[20];
RTC_TimeTypeDef sTime;
HAL_RTC_GetTime(&hrtc, &sTime, FORMAT_BIN);
sprintf(buffer,"%02d:%02d",sTime.Hours,sTime.Minutes);
SSD1306_GotoXY(0, 0);
SSD1306_Puts(buffer,&Font_7x10,1);
SSD1306_UpdateScreen();
```
#### 用户界面设计——调整时间
考虑到实际应用场景下可能存在的按键或其他类型的物理按钮,程序应当监听外部中断事件触发后的回调处理逻辑,允许用户增加或减少特定字段内的数值直到满意为止。例如,当按下某个键时执行以下动作以改变时间为下午三点整[^3]:
```c
if (/*检测到按键被按下的条件*/){
RTC_DateTypeDef sDate;
HAL_RTC_SetTime(&hrtc, &(RTC_TimeTypeDef){.Hours=15,.Minutes=0},FORMAT_BIN);
HAL_Delay(100); //防止抖动误触
// 更新显示...
}
```
上述代码片段展示了如何在一个简单的场景内完成对STM32上运行的RTC模块所保存的时间进行更改的过程,同时也介绍了怎样借助OLED设备直观呈现这一变动的结果。
阅读全文
相关推荐













