stm32rtc实时时钟oled显示
时间: 2023-06-05 21:47:03 浏览: 1139
STM32RTC实时时钟可以通过OLED显示器显示时间和日期。可以使用STM32CubeMX配置RTC和OLED,并使用HAL库编写代码来读取RTC并将其显示在OLED上。在代码中,需要使用RTC和I2C库来控制RTC和OLED。可以使用RTC的时间和日期寄存器来读取当前时间和日期,并使用OLED库将其显示在OLED上。需要注意的是,OLED显示器需要初始化和配置才能正确显示。
相关问题
基于stm32f103系列驱动RTC实时时钟并使用OLED显示的示例代码
好的,以下是基于STM32F103系列驱动RTC实时时钟并使用OLED显示的示例代码:
```c
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_rtc.h"
#include "stm32f10x_i2c.h"
#include "oled.h"
void RTC_Configuration(void);
void I2C_Configuration(void);
void OLED_Configuration(void);
void OLED_UpdateTime(RTC_TimeTypeDef RTC_TimeStruct, RTC_DateTypeDef RTC_DateStruct);
int main(void)
{
RTC_Configuration(); //初始化RTC
I2C_Configuration(); //初始化I2C
OLED_Configuration(); //初始化OLED
while(1)
{
RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;
RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct); //获取当前时间
RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct); //获取当前日期
OLED_UpdateTime(RTC_TimeStruct, RTC_DateStruct); //更新OLED显示时间
}
}
void RTC_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
PWR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问
RCC_LSEConfig(RCC_LSE_ON); //打开LSE外部晶振
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); //等待LSE晶振稳定
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //将RTC时钟源改为LSE外部晶振
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForSynchro(); //等待RTC寄存器同步
RTC_InitTypeDef RTC_InitStructure;
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; //时间格式为24小时制
RTC_InitStructure.RTC_AsynchPrediv = 0x7F; //RTC异步分频系数为0x7F+1=128
RTC_InitStructure.RTC_SynchPrediv = 0xFF; //RTC同步分频系数为0xFF+1=256
RTC_Init(&RTC_InitStructure); //初始化RTC
RTC_TimeTypeDef RTC_TimeStruct;
RTC_TimeStruct.RTC_Hours = 0x00; //设置RTC小时数
RTC_TimeStruct.RTC_Minutes = 0x00; //设置RTC分钟数
RTC_TimeStruct.RTC_Seconds = 0x00; //设置RTC秒数
RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct); //设置RTC时间
RTC_DateTypeDef RTC_DateStruct;
RTC_DateStruct.RTC_Year = 0x20; //设置RTC年份
RTC_DateStruct.RTC_Month = RTC_Month_January; //设置RTC月份
RTC_DateStruct.RTC_Date = 0x01; //设置RTC日数
RTC_DateStruct.RTC_WeekDay = RTC_Weekday_Thursday; //设置RTC星期几
RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct); //设置RTC日期
}
void I2C_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //使能I2C1外设时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //PB6和PB7引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //开漏输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB
I2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; //I2C模式
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //占空比为2
I2C_InitStructure.I2C_OwnAddress1 = 0x00; //本地地址为0
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //使能应答
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //7位地址模式
I2C_InitStructure.I2C_ClockSpeed = 100000; //时钟速度为100kHz
I2C_Cmd(I2C1, ENABLE); //使能I2C1
I2C_Init(I2C1, &I2C_InitStructure); //初始化I2C1
}
void OLED_Configuration(void)
{
OLED_Init(); //初始化OLED
OLED_Clear(); //清屏
}
void OLED_UpdateTime(RTC_TimeTypeDef RTC_TimeStruct, RTC_DateTypeDef RTC_DateStruct)
{
char time_str[20];
sprintf(time_str, "%02d:%02d:%02d", RTC_TimeStruct.RTC_Hours, RTC_TimeStruct.RTC_Minutes, RTC_TimeStruct.RTC_Seconds);
char date_str[20];
sprintf(date_str, "%04d-%02d-%02d", RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month, RTC_DateStruct.RTC_Date);
OLED_ShowString(0, 0, "Time:");
OLED_ShowString(48, 0, time_str);
OLED_ShowString(0, 2, "Date:");
OLED_ShowString(48, 2, date_str);
}
```
这段代码中,我们在`main()`函数中调用`RTC_Configuration()`函数、`I2C_Configuration()`函数和`OLED_Configuration()`函数,分别初始化RTC、I2C和OLED。然后我们在一个无限循环中不断获取当前的时间和日期,并调用`OLED_UpdateTime()`函数来更新OLED上的时间和日期显示。`OLED_UpdateTime()`函数中,我们首先使用`sprintf()`函数将当前时间和日期转换为字符串。然后我们调用`OLED_ShowString()`函数来在OLED上显示时间和日期。
stm32f103c8t6实现实时时钟oled
在STM32F103C8T6主控板上实现实时时钟和OLED显示的步骤如下:
1. 首先,连接DS1302时钟模块和OLED显示屏到STM32F103C8T6主控板上。确保连接正确并且引脚配置正确。
2. 在STM32CubeIDE或者其他开发环境中创建一个新的工程,并配置好相关的引脚和时钟。
3. 导入相关的库文件,例如DS1302驱动库和OLED驱动库。
4. 在代码中初始化DS1302时钟模块,并设置时间。
5. 使用定时器或者RTC模块来实现实时时钟的功能。可以使用定时器中断来更新时间,并将时间显示在OLED屏幕上。
6. 使用OLED驱动库来初始化OLED显示屏,并将时间显示在屏幕上。
7. 编译并下载代码到STM32F103C8T6主控板上进行测试。
以下是一个示例代码,用于实现STM32F103C8T6主控板上的实时时钟和OLED显示:
```c
#include "stm32f1xx_hal.h"
#include "ds1302.h"
#include "oled.h"
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
DS1302_Init(); // 初始化DS1302时钟模块
DS1302_SetTime(20, 30, 0); // 设置时间为20:30:00
OLED_Init(); // 初始化OLED显示屏
while (1)
{
// 获取当前时间
uint8_t hour, minute, second;
DS1302_GetTime(&hour, &minute, &second);
// 在OLED屏幕上显示时间
char timeStr[9];
sprintf(timeStr, "%02d:%02d:%02d", hour, minute, second);
OLED_ShowString(0, 0, timeStr);
HAL_Delay(1000); // 延时1秒
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
```
阅读全文