RT Thread Studio创建软件和硬件RTC工程

MCU型号:STM32F103RET6

一.配置软件模拟RTC

1.生成一个带串口输出的工程文件,新建RT-Thread项目工程文件。
在这里插入图片描述
2.查看电路图中的串口输出管脚,根据STMCubeMx软件可知此串口为USART1,选择芯片型号为STM32F103RET6,控制台串口选择UART1,发送脚:PB6,接收脚:PB7
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
3.设置下载bin文件的下载地址为:0x08000000。
在这里插入图片描述
4.代码编译后下载到电路板,连上串口调试助手可看到调试信息。
在这里插入图片描述
5.打开RT-Thread Settings设置设备驱动中的软件模拟RTC,RTC设置如图所示,设置完成之后,记得保存,否则设置无效。
在这里插入图片描述
实际上是将soft_rtc.c文件添加到工程中编译,并将宏定义RT_USING_SOFT_RTC打开。
在这里插入图片描述
6.增加rtc的初始化代码rtc_app.h和rtc_app_c,以及修改main函数中的代码。

rtc_app.h

#ifndef APPLICATIONS_RTC_APP_H_
#define APPLICATIONS_RTC_APP_H_

int rtc_init(void);

#endif /* APPLICATIONS_RTC_APP_H_ */

rtc_app.c

#include <rtthread.h>
#include <rtdevice.h>

#define RTC_NAME       "rtc"

#define DBG_TAG "rtc"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

int rtc_init(void)
{
    rt_err_t ret = RT_EOK;
    rt_device_t device = RT_NULL;

    /*寻找设备*/
    device = rt_device_find(RTC_NAME);
    if (!device)
    {
        LOG_E("find %s failed!", RTC_NAME);
        return RT_ERROR;
    }

    /*初始化RTC设备*/
    if(rt_device_open(device, 0) != RT_EOK)
    {
        LOG_E("open %s failed!", RTC_NAME);
        return RT_ERROR;
    }
    ret = set_date(2025, 5, 6);
    if (ret != RT_EOK)
    {
        rt_kprintf("set RTC date failed\n");
        return ret;
    }

    /* 设置时间 */
    ret = set_time(9, 15, 50);
    if (ret != RT_EOK)
    {
        rt_kprintf("set RTC time failed\n");
        return ret;
    }
    return ret;
}

main.c

#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
 
#include <rtdevice.h>
extern int rtc_init(void);
 
int main(void)
{
    int count = 1;
    time_t now;
    rtc_init();
 
    while (count++)
    {
        /* 延时3秒 */
        rt_thread_mdelay(3000);
 
        /* 获取时间 */
        now = time(RT_NULL);
        rt_kprintf("%s\n", ctime(&now));
//        LOG_D("Hello RT-Thread!");
//        rt_thread_mdelay(1000);
    }
 
    return RT_EOK;
}

7.由于RT Thread stdio创建工程的时候使用的是内部晶振,所以需要将其修改为外部晶振,查看原理图的外部晶振大小。

在这里插入图片描述
8.打开CubeMx_Settings配置外部晶振,配置sys。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
生成工程后查看drv_clk.c文件可查看到clk_init函数内容已做修改。
在这里插入图片描述
9.将stmf1xx_hal_conf.h中的HAL_UART_MODULE_ENABLED,HAL_USART_MODULE_ENABLED宏定义打开。
在这里插入图片描述
10.编译程序,烧录到芯片中,查看串口日志,可查看到间隔3秒变化一次rtc时间。
在这里插入图片描述
二.配置硬件RTC

1.接上面的工程例子,取消勾选软件模拟RTC选项
在这里插入图片描述
2.在board.h中开启BSP_USING_ONCHIP_RTC宏定义,由于电路图中没有LSE晶振,故这里使用LSI内部晶振,开启BSP_RTC_USING_LSI宏定义。
在这里插入图片描述
3.由于drv_rtc.c文件中的rt_hw_rtc_register()函数和rtc.c中的rt_hw_rtc_register()函数存在冲突,所以需要删除掉rtc.h和rtc.c文件中的rt_hw_rtc_register()函数。
在这里插入图片描述
在这里插入图片描述
4.配置硬件RTC,打开CubeMX_Settings配置RTC
在这里插入图片描述
在这里插入图片描述
5.由于重新配置了CubeMx,所以需要重新打开宏定义HAL_UART_MODULE_ENABLED和HAL_USART_MODULE_ENABLED
在这里插入图片描述
6.编译后烧录到电路板中,会出现"RTC hasn’t been configured, please use command to config.",是因为未设置时间,可以调用set_rtc_time_stamp(time_t time_stamp)函数设置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### RT-ThreadRTC 模块的使用教程配置方法 #### 1. 硬件 RTC 的初始化与配置 对于 STM32 单片机,在使用 RT-Thread 实现硬件 RTC 功能时,需先确保已正确配置硬件环境。具体来说,应通过 CubeMX 工具使能 RTC 并完成必要的时钟设置[^2]。 当硬件部分准备就绪后,进入 RT-Thread 的 ENV (Embedded NuttX Visual Studio Code Extension) 进行软件层面的配置: - 开启 `RTC` 组件; - 不要选择软件模拟 RTC; - 使能 RTC 片上外设; - 如果采用内部时钟作为时间基准,则相应地选择合适的时钟源。 #### 2. 软件开发环境构建 利用 SCons 构建工具生成项目工程文件之后,还需将由 CubeMX 自动生成的相关时钟配置代码移植至 RT-Thread 工程内,以保证底层驱动能够正常工作并支持 RTC 功能。 #### 3. 应用程序接口调用实例 下面给出一段简单的 C 语言代码片段来展示如何操作 RTC 设备: ```c #include "rtdevice.h" #include "drv_rtc.h" static struct rt_device *rtc_dev; int main(void) { /* 获取 rtc 设备 */ rtc_dev = rt_device_find("rtc"); if (!rtc_dev) return -RT_ERROR; /* 设置当前时间为指定日期时间启动定时器 */ { struct tm timeinfo = { .tm_year = 2023 - 1900, .tm_mon = 5, .tm_mday = 1, .tm_hour = 8, .tm_min = 30, .tm_sec = 0 }; rt_device_control(rtc_dev, RT_DEVICE_CTRL_RTC_SET_TIME, &timeinfo); } while(1){ struct tm timeinfo; char buffer[64]; /* 查询当前的时间 */ rt_device_read(rtc_dev, 0, &timeinfo, sizeof(timeinfo)); strftime(buffer,sizeof(buffer),"%Y-%m-%d %H:%M:%S",&timeinfo); printf("Current Time is :%s\n",buffer); rt_thread_delay(RT_TICK_PER_SECOND*5); } } ``` 此段代码展示了获取 RTC 设备句柄、设定初始时间周期性读取当前时间的方法[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值