首页 > 其他分享 >PSoc62™开发板之rtc时间获取

PSoc62™开发板之rtc时间获取

时间:2024-01-21 14:32:19浏览次数:41  
标签:u8g2 RT RTC rtc rt 开发板 tm PSoc62

实验目的

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

使能rtc.png

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

使能u8g2软件包.png

注意要在代码里边绑定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

i2c引脚图.png 模块连接图

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

i2c模块图.png

实物连接

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

oled连接图00.jpg

程序设计

Infineon PSoc™62时钟源设置代码

#ifdef   BSP_RTC_USING_LSE
    Cy_RTC_SelectClockSource(CY_RTC_CLK_SELECT_WCO);
#else
    Cy_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_LSE
    Cy_RTC_SelectClockSource(CY_RTC_CLK_SELECT_WCO);
#else
    Cy_RTC_SelectClockSource(CY_RTC_CLK_SELECT_ILO);
#endif
    if (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];

    // Initialization
    u8g2_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];

    // Initialization
    u8g2_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时间

date命令.png

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

oled连接图.jpg

标签:u8g2,RT,RTC,rtc,rt,开发板,tm,PSoc62
From: https://blog.51cto.com/hywing/9355449

相关文章

  • TBK-RD8T3x 开发板 与1.77' 160(RGB)×128 代码
    TBK-RD8T3x开发板是一款基于增强型的高速1T8051内核的工业级集成触控按键功能的Flash微控制器。它支持多种通信接口,如GPIO、I2C、SPI等。以下是使用GPIO接口控制1.77'160(RGB)×128的代码:#include"tbkrd8t3x.h"voidmain(){//初始化TBK-RD8T3x开发板tbk_rd8t3x_in......
  • TBK-RD8T3x 开发板 未来的发展瞭望
    TBK-RD8T3x开发板是一款基于增强型的高速1T8051内核的工业级集成触控按键功能的Flash微控制器。它支持多种通信接口,如GPIO、I2C、SPI等。未来,TBK-RD8T3x开发板有望在以下方面得到进一步的发展:更强大的处理能力:随着技术的不断进步,TBK-RD8T3x开发板的处理器性能将得到进一步提升,以满......
  • 全志R128 Devkit开发板原理图模块介绍及使用说明
    针对R128模组,百问科技推出了R128DevKit开发板作为快速开发评估工具。板载R128-S2-N16R16模组板载2.4GRF陶瓷天线板载USBTypeCOTG板载UART转USB芯片板载RESET,FEL下载按键板载4颗WS2812RGBLED板载PMU,支持对外供电3.3V1A提供GPIO37个,引出3路MIC,2路......
  • 传输文件到imx6ul开发板上
    使用tftp、nfs、scp传输文件到开发板上的前提是开发板、ubuntu虚拟机的网络能够ping通。配置网络以及tftp、nfs等部分参考正点原子团队的开发手册和韦东山老师的开发手册。一、tftp传输文件将需要传输的文件放入/home/ly/linux/tftp目录下,在开发板中使用命令:tftp-g-r192.168......
  • GEC6818开发板Linux环境中telnet的搭载
    一、首先打开开发板的Linux①通过232串口通信线连接开发板打开②打开网络配置文件(/etc/init.d/rcS)[root@GEC6818/]#vi/etc/init.d/rcS③用vi打开文件,在文件里面添加如下命令:#启动eth0网卡,并设置IP为192.168.1.124/sb......
  • 迅为RK3568开发板编译Android12源码包-修改编译线程数
    在编译 Android 系统时,可以通过调整线程数来控制并行编译的任务数量,使用多线程可以加快构建速度。要注意根据 Ubuntu 的处理器内核总数以及内存大小来设置合适的线程数。过高的线程数可能导致系统资源的竞争,过低的线程数则不能充分利用系统的并行处理能力。找到合适的线程数可......
  • Fpga开发笔记(一):高云FPGA芯片介绍,入手开发板套件、核心板和底板介绍
    前言  FPGA作为一种逻辑芯片,硬件架构独特,具有并行性、低延时性和灵活性等特性,应用领域广泛。  FPGA市场主要玩家是英特尔、AMD、莱迪思、Microchip、Achronix等;国内厂商包括复旦微电、紫光国微、安路科技、东土科技、高云半导体、京微齐力、京微雅格、智多晶、遨格芯等。 ......
  • 全志V853开发板硬件开发用户入门指南
    本章节将介绍V853开发板上各模块的基础使用方法。V853开发板集成了LED、WiFi、蓝牙、以太网、音频、屏幕、USB、TF卡等模块。本章节将对这些模块进行简单的操作介绍,方便开发者快速上手了解开发板。*注:本文中 root@TinaLinux:~# 开头的命令是在开发板上通过ADB、串口在TinaLin......
  • 全志V853开发板原理图
    V853开发板由全志合作伙伴 索智科技 根据全志提供的参考设计修改设计。本章节将对开发板几个主要的部件的原理图进行说明,方便快速上手开发板的硬件资料。开发板硬件框图如下:模块介绍GPIO分配此表格为V853部分重要的GPIO的分配表,> 表示对IO的另外一个复用,完整的GPIO分配......
  • 迅为RK3588开发板编译 Buildroot单独编译图形化界面三
    第三步:编译 Recovery首先在 linux 源码目录下输入以下命令进入编译的 UI 界面,进入之后如下所示:./build.sh然后将光标移动到第四个 recovery,点击回车即可开始 recovery 的编译,编译过程如下所示:编译完成如下图所示:第四步:编译 buildroot关注下一章节,迅为RK3588开发板......