【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示
- 📌相关篇《【WCH】CH32F203基于内部RTC时钟+I2C SSD1306 OLED显示》
- 📺显示效果:
- ✨主要是在其基础 上增加温度显示,温度数据来源于DS18B20,更换了OLED驱动显示字体相关内容。
- 🔰仅作为功能演示,内部RTC精度不高,长时间运行需要依赖第三方数据校准才行。
- 🔖代码是从STM32工程基础上修改来的,修改相关内容后完全可以适配CH32F203上运行。
⛳相关驱动注意事项
- 软件I2C驱动SSD1306需要注意,驱动引脚需要配置为推挽输出模式,而不是像硬件I2C那样引脚配置使用开漏输出。
- 采用内部RTC时钟源,其时钟频率为40KHz,作为时钟源分频系数:
39999
📑引脚定义说明
- 🎉引脚可以根据个人使用需求切换到任意其他可用引脚上。
CH32F203 ------ I2C SSD1306 OLED
PA5 ------- SCL
PA7 ------- SDA
CH32F203 ------ DS18B20
PA15 ------ DATA
📓驱动代码部分
- 🌿内部RTC初始化代码
u8 RTC_Init(void)
{
u8 temp = 0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
// if (BKP_ReadBackupRegister(BKP_DR1) != 0XA1A1) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
// {
BKP_DeInit(); //复位备份区域
RCC_LSICmd(ENABLE);
// RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
// while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
// while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET && temp < 250)
{
temp++;
delay_ms(10);
}
if(temp >= 250)return 1; //初始化时钟失败,晶振有问题
// RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步
// RTC_ITConfig(RTC_IT_ALR, ENABLE);
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_EnterConfigMode();/// 允许配置
RTC_SetPrescaler(40000-1);
// RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_Set(2023, 4, 25, 18, 0, 35); //设置时间
RTC_ExitConfigMode(); //退出配置模式
BKP_WriteBackupRegister(BKP_DR1, 0XA1A1); //向指定的后备寄存器中写入用户程序数据
RTC_NVIC_Config();//RCT中断分组设置
RTC_Get();//更新时间
return 0; //ok
}
- 🌿main主程序代码
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "rtc.h"
#include "ds18b20.h"
u8 year_buf[4];
u8 month_buf[2];
u8 day_buf[2];
u8 temp_buf[4];
int main(void)
{
u16 temp;
delay_init(); //延时初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
OLED_Init();
RTC_Init(); //RTC初始化
DS18B20_Init();
delay_ms(200);
OLED_CLS();
OLED_P16x16Ch(40, 0, 36); //第一行第三列显示年
OLED_P16x16Ch(72, 0, 37); //显示月
OLED_P16x16Ch(106, 0, 38); //显示日
OLED_P16x16Ch(0, 6, 39); //星
OLED_P16x16Ch(16, 6, 41); //期
OLED_P16x16Ch(32, 2, 34);
OLED_P16x16Ch(32, 4, 35); //:
OLED_P16x16Ch(80, 2, 34);
OLED_P16x16Ch(80, 4, 35); //:
while(1)
{
sprintf((char*)year_buf, "%04d", calendar.w_year);
OLED_P8x16Str(8, 0, year_buf);
sprintf((char*)month_buf, "%02d", calendar.w_month);
OLED_P8x16Str(58, 0, month_buf);
sprintf((char*)day_buf, "%02d", calendar.w_date);
OLED_P8x16Str(90, 0, day_buf);
OLED_P16x16Ch(0, 2, calendar.hour / 10 * 2);
OLED_P16x16Ch(0, 4, calendar.hour / 10 * 2 + 1); //
OLED_P16x16Ch(16, 2, calendar.hour % 10 * 2);
OLED_P16x16Ch(16, 4, calendar.hour % 10 * 2 + 1); //
OLED_P16x16Ch(48, 2, calendar.min / 10 * 2);
OLED_P16x16Ch(48, 4, calendar.min / 10 * 2 + 1); //
OLED_P16x16Ch(64, 2, calendar.min % 10 * 2);
OLED_P16x16Ch(64, 4, calendar.min % 10 * 2 + 1); //
OLED_P16x16Ch(95, 2, calendar.sec / 10 * 2);
OLED_P16x16Ch(95, 4, calendar.sec / 10 * 2 + 1); //
OLED_P16x16Ch(111, 2, calendar.sec % 10 * 2);
OLED_P16x16Ch(111, 4, calendar.sec % 10 * 2 + 1); //
OLED_P16x16Ch(32, 6, calendar.week + 20); //
temp = DS18B20_Get_Temp();
OLED_P16x16str(64, 6, 11);
OLED_P16x16str(80, 6, 12);
OLED_P16x16str(96, 6, temp % 1000 / 100);
OLED_P16x16str(112, 6, temp % 100 / 10);
}
}
📚工程源码
- ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取。
- 🍁对于文中所提供的相关资源链接将作不定期更换。
链接: https://pan.baidu.com/s/1Xxkau67AxeHwqFFvrP095Q
提取码: 1adv
文章来源地址https://www.toymoban.com/news/detail-426053.html
文章来源:https://www.toymoban.com/news/detail-426053.html
到了这里,关于【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!