PSoc62™开发板之rtc时间获取

news/2024/12/14 12:01:06/

实验目的

1.使用PSoc62™芯片读取内部rtc时间

2.OLED屏幕显示当前时间戳

实验准备

  • PSoc62™开发板
  • SSD1306 OLED模块
  • 公母头杜邦线

芯片资源

PSoC 6系列MCU时钟系统由以下几部分组成,PSoc62™开发板没有接外部时钟源,所以只能从IMO、ILO、PILO里边配置

  • 三个内部的时钟源
    • 8-MHz internal main oscillator (IMO)
    • 32-kHz internal low-speed oscillator (ILO)
    • Precision 32-kHz internal low-speed oscillator (PILO)
  • 三个外部的时钟源
    • External clock (EXTCLK) generated using a signal from an I/O pin
    • External 16–35 MHz crystal oscillator (ECO)
    • External 32-kHz watch crystal oscillator (WCO)

组件配置

rtc配置,这里的RTC_USING_LSI指的是ILO

在这里插入图片描述

使能u8g2软件包,这里使用软件的方式模拟i2c时序

在这里插入图片描述

注意要在代码里边绑定i2c引脚,pin number和GPIO的对应关系:P8.0 : 8 x 8 = 64,P8.1 : 8 x 8 + 1 = 65

#define OLED_I2C_PIN_SCL                    64  // P8.0
#define OLED_I2C_PIN_SDA                    65  // P8.1

模块电路

GPIO引脚

MCU_ARD_SCL -> P8.0

MCU_ARD_SDA -> P8.1

在这里插入图片描述
模块连接图

右侧排母从上往下第1、2引脚分别对应SCL、SDA

在这里插入图片描述

实物连接

依次连接OLED模块的VCC、GND、SDL、SDA引脚

在这里插入图片描述

程序设计

Infineon PSoc™62时钟源设置代码

#ifdef   BSP_RTC_USING_LSECy_RTC_SelectClockSource(CY_RTC_CLK_SELECT_WCO);
#elseCy_RTC_SelectClockSource(CY_RTC_CLK_SELECT_ILO);
#endif

由于RT-Thread HAL_Drivers不太完善,这里需要修改RTC HAL层的代码,把上面的代码添加到rt_hw_rtc_init里边去

static int rt_hw_rtc_init(void)
{rt_err_t result = RT_EOK;ifx32_rtc_dev.ops = &_rtc_ops;if (rt_hw_rtc_register(&ifx32_rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR, RT_NULL) != RT_EOK){LOG_E("rtc init failed");result = -RT_ERROR;}else{LOG_D("rtc init success");}#ifdef   BSP_RTC_USING_LSECy_RTC_SelectClockSource(CY_RTC_CLK_SELECT_WCO);
#elseCy_RTC_SelectClockSource(CY_RTC_CLK_SELECT_ILO);
#endifif (cyhal_rtc_init(&rtc_obj) != RT_EOK){LOG_E("rtc init failed.");return -RT_ERROR;}return RT_EOK;return result;
}

OLED驱动,读取当前系统时间戳并显示到屏幕

void oled_display()
{time_t now;struct tm *p_tm;u8g2_t u8g2;char buffer[50];// Initializationu8g2_Setup_ssd1306_i2c_128x64_noname_f( &u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay_rtthread);u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_I2C_CLOCK, OLED_I2C_PIN_SCL);u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_I2C_DATA, OLED_I2C_PIN_SDA);u8g2_InitDisplay(&u8g2);u8g2_SetPowerSave(&u8g2, 0);// Draw Graphics/* full buffer example, setup procedure ends in _f */u8g2_ClearBuffer(&u8g2);u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);u8g2_DrawStr(&u8g2, 1, 18, "U8g2 on RT-Thread");u8g2_SendBuffer(&u8g2);u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols);u8g2_DrawGlyph(&u8g2, 112, 56, 0x2603 );u8g2_SendBuffer(&u8g2);for (;;){u8g2_ClearBuffer(&u8g2);u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);now = time(RT_NULL);p_tm = localtime(&now);memset(buffer, 0, 50);snprintf(buffer, 50, "%d-%d-%d %d:%d:%d\n", p_tm->tm_year+ 1900, p_tm->tm_mon + 1, p_tm->tm_mday, p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);u8g2_DrawStr(&u8g2, 1, 18, buffer);u8g2_SendBuffer(&u8g2);rt_thread_mdelay(1000);}
}

整合代码

#include <rtthread.h>
#include <rtdevice.h>
#include <time.h>
#include "drv_gpio.h"
#include "drivers/alarm.h"
#include <rtdbg.h>
#include <u8g2_port.h>#define OLED_I2C_PIN_SCL                    64  // P8.0
#define OLED_I2C_PIN_SDA                    65  // P8.1#define RTC_NAME "rtc"static rt_device_t device = RT_NULL;static int uesr_rtc_init(void)
{rt_err_t ret = RT_EOK;time_t now;device = rt_device_find(RTC_NAME);if (!device){rt_kprintf("find %s failed!", RTC_NAME);return RT_ERROR;}if(rt_device_open(device, 0) != RT_EOK){rt_kprintf("open %s failed!", RTC_NAME);return RT_ERROR;}ret = set_date(2024, 1, 20);if (ret != RT_EOK){rt_kprintf("set RTC date failed\n");return ret;}ret = set_time(16, 55, 50);if (ret != RT_EOK){rt_kprintf("set RTC time failed\n");return ret;}now = time(RT_NULL);rt_kprintf("RTC device init success,now time is %s\n", ctime(&now));return ret;
}INIT_APP_EXPORT(uesr_rtc_init);void oled_display()
{time_t now;struct tm *p_tm;u8g2_t u8g2;char buffer[50];// Initializationu8g2_Setup_ssd1306_i2c_128x64_noname_f( &u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay_rtthread);u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_I2C_CLOCK, OLED_I2C_PIN_SCL);u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_I2C_DATA, OLED_I2C_PIN_SDA);u8g2_InitDisplay(&u8g2);u8g2_SetPowerSave(&u8g2, 0);// Draw Graphics/* full buffer example, setup procedure ends in _f */u8g2_ClearBuffer(&u8g2);u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);u8g2_DrawStr(&u8g2, 1, 18, "U8g2 on RT-Thread");u8g2_SendBuffer(&u8g2);u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols);u8g2_DrawGlyph(&u8g2, 112, 56, 0x2603 );u8g2_SendBuffer(&u8g2);for (;;){u8g2_ClearBuffer(&u8g2);u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);now = time(RT_NULL);p_tm = localtime(&now);memset(buffer, 0, 50);snprintf(buffer, 50, "%d-%d-%d %d:%d:%d\n", p_tm->tm_year+ 1900, p_tm->tm_mon + 1, p_tm->tm_mday, p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);u8g2_DrawStr(&u8g2, 1, 18, buffer);u8g2_SendBuffer(&u8g2);rt_thread_mdelay(1000);}
}int main(void)
{oled_display();return 0;
}

实验效果

在msh终端敲命令date,即可查看开发板rtc时间

在这里插入图片描述

同时OLED模块实时显示当前时间

在这里插入图片描述


http://www.ppmy.cn/news/1328255.html

相关文章

代码随想录 Leetcode150. 逆波兰表达式求值

题目&#xff1a; 代码(首刷看解析 2024年1月21日&#xff09;&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {stack<long long> st; for (int i 0; i < tokens.size(); i) {if (tokens[i] "" || tokens[i] &qu…

当 OpenTelemetry 遇上阿里云 Prometheus

作者&#xff1a;逸陵 背景 在云原生可观测蓬勃发展的当下&#xff0c;想必大家对 OpenTelemetry & Prometheus 并不是太陌生。OpenTelemetry 是 CNCF&#xff08;Cloud Native Computing Foundation&#xff09;旗下的开源项目&#xff0c;它的目标是在云原生时代成为应…

Java开发分析工具 JProfiler的详细使用方法解析(附 JProfiler for Mac许可证秘钥)

JProfiler 是一款功能强大的Java代码分析工具&#xff0c;JProfiler的直观UI可帮助您解决性能瓶颈&#xff0c;确定内存泄漏并了解线程问题且JProfiler Mac破解版配置会话非常简单&#xff0c;第三方集成使得入门变得轻而易举&#xff0c;并且以自然的方式呈现数据分析。 解…

第一篇【传奇开心果系列】beeware的toga开发移动应用:轮盘抽奖移动应用

系列博文目录 beeware的toga开发移动应用示例系列博文目录一、项目目标二、开发传奇开心果轮盘抽奖安卓应用编程思路三、传奇开心果轮盘抽奖安卓应用示例代码四、补充抽奖逻辑实现五、开发传奇开心果轮盘抽奖苹果手机应用编程思路六、开发传奇开心果轮盘抽奖苹果手机应用示例代…

【H3C】配置AAA认证和Telnet远程登陆,S5130 Series交换机

AAA配置步骤为&#xff1a; 1.开启telent远程登陆服务 2.创建用户&#xff0c;设置用户名、密码、用户的服务类型 3.配置终端登录的数量 4.配置vlan-if的ip地址&#xff0c;用来远程登陆 5.允许对应的vlan通过 1.开启telent远程登陆服务 sys …

基于JavaWeb+SSM+Vue基于微信小程序生鲜云订单零售系统的设计和实现

基于JavaWebSSMVue基于微信小程序生鲜云订单零售系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计…

【MySQL】MySQL 8.0 状态变量(Server Status Variables)以及SHOW STATUS命令

文章目录 【MySQL】MySQL 8.0 状态变量&#xff08;Server Status Variables&#xff09;以及SHOW STATUS命令SHOW STATUS命令查看所有的状态变量查看特定状态变量 参考 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(I…

使用Element中的input组件如何实现文字和输入框在一行显示

利用 <el-form-item label"商品名称&#xff1a;">标签包裹即可&#xff0c;label写提示文字 <el-form ref"form" label-width"100px"><el-form-item label"商品名称&#xff1a;"><el-input v-model"na…