RT-Thread RTC設備學習筆記

2021-02-14 嵌入式雲IOT技術圈

RT-Thread 的 RTC設備為作業系統的時間系統提供了基礎服務。面對越來越多的 IoT 場景,RTC 已經成為產品的標配,甚至在諸如 SSL 的安全傳輸過程中,RTC 已經成為不可或缺的部分。

2、RTC設備操作接口

RT-Thread為RTC設備提供了三個用戶層次的應用操作接口,分別是設置日期、設置時間和獲取當前時間。在RT-Thread的設備中,有且僅有一個RTC設備,設備名稱為"rtc"。

2.1 設置日期(set_date)

rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)

參數描述year待設置生效的年份month待設置生效的月份day待設置生效的日返回——RT_EOK設置成功-RT_ERROR失敗,沒有找到 rtc 設備其他錯誤碼失敗

如何使用呢?

/* 設置日期為2020年5月1號 */
set_date(2020,5,1);

2.2 設置時間(set_time)

rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)

參數描述hour待設置生效的時minute待設置生效的分second待設置生效的秒返回——RT_EOK設置成功-RT_ERROR失敗,沒有找到 rtc 設備其他錯誤碼失敗

如何使用呢?

/* 設置時間為21點48分15秒 */
set_time(21, 48, 15);

2.3 獲取時間(time)

time_t time(time_t *t)

參數描述t時間數據指針返回——當前時間值time_t

如何使用呢?

/* 保存獲取的當前時間值 */
time_t now;
/* 獲取時間 */
now = time(RT_NULL);
/* 列印輸出時間信息 */
rt_kprintf("%s\n", ctime(&now));

3、RTC設備的使用

本次實驗基於小熊派開發板:

配置finsh命令、libc以及軟體模擬rtc選項。

打開RTC模塊使能

在終端處輸入date相關的命令,可讀取和設置RTC。

溫馨提示: 由於我們沒設置RTC硬體備份,所以這個時間設置僅僅是當前有效,當重新斷電重啟的時候,又會恢復為原來最開始的時間(如下圖所示)。

以下是date命令在RT-Thread中的實現,源碼位於rtc.c

#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH)
static void date(uint8_t argc, char **argv)
{
if (argc == 1)
{
time_t now;
/* output current time */
now = time(RT_NULL);
rt_kprintf("%s", ctime(&now));
}
else if (argc >= 7)
{
/* set time and date */
uint16_t year;
uint8_t month, day, hour, min, sec;
year = atoi(argv[1]);
month = atoi(argv[2]);
day = atoi(argv[3]);
hour = atoi(argv[4]);
min = atoi(argv[5]);
sec = atoi(argv[6]);
if (year > 2099 || year < 2000)
{
rt_kprintf("year is out of range [2000-2099]\n");
return;
}
if (month == 0 || month > 12)
{
rt_kprintf("month is out of range [1-12]\n");
return;
}
if (day == 0 || day > 31)
{
rt_kprintf("day is out of range [1-31]\n");
return;
}
if (hour > 23)
{
rt_kprintf("hour is out of range [0-23]\n");
return;
}
if (min > 59)
{
rt_kprintf("minute is out of range [0-59]\n");
return;
}
if (sec > 59)
{
rt_kprintf("second is out of range [0-59]\n");
return;
}
set_time(hour, min, sec);
set_date(year, month, day);
}
else
{
rt_kprintf("please input: date [year month day hour min sec] or date\n");
rt_kprintf("e.g: date 2018 01 01 23 59 59 or date\n");
}
}
MSH_CMD_EXPORT(date, get date and time or set [year month day hour min sec]);
#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */

根據RTC設備API說明文檔,以及結合官方例程很容易可以實現以下demo:

/*
* Copyright (c) 2006-2019, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2019-09-09 RT-Thread first version
*/

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

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

/* PLEASE DEFINE the LED0 pin for your board, such as: PA5 */
#define LED0_PIN GET_PIN(C, 13)

/*
* 程序清單:這是一個 RTC 設備使用例程
* 例程導出了 rtc_sample 命令到控制終端
* 命令調用格式:rtc_sample
* 程序功能:設置RTC設備的日期和時間,延時一段時間後獲取當前時間並列印顯示。
*/

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

static int rtc_sample(int argc, char *argv[])
{
rt_err_t ret = RT_EOK;
time_t now;

/* 設置日期 */
ret = set_date(2020, 5, 2);
if (ret != RT_EOK)
{
rt_kprintf("set RTC date failed\n");
return ret;
}

/* 設置時間 */
ret = set_time(0, 21, 14);
if (ret != RT_EOK)
{
rt_kprintf("set RTC time failed\n");
return ret;
}

/* 延時3秒 */
rt_thread_mdelay(3000);

/* 獲取時間 */
now = time(RT_NULL);
rt_kprintf("%s\n", ctime(&now));

return ret;
}
/* 導出到 msh 命令列表中 */
MSH_CMD_EXPORT(rtc_sample, rtc sample);

int main(void)
{
int count = 1;
/* set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
time_t now;
/* 獲取時間 */
now = time(RT_NULL);
rt_kprintf("%s\n", ctime(&now));
while (count++)
{
/* set LED0 pin level to high or low */
rt_pin_write(LED0_PIN, count % 2);
//LOG_D("Hello RT-Thread!");
rt_thread_mdelay(1000);
}

return RT_EOK;
}

導出rtc_sample命令後,就可以在終端上使用了。

如果我們要使用硬體RTC,那怎麼辦呢?看board.h的RTC配置項相關說明:

/** if you want to use rtc(hardware) you can use the following instructions.
*
* STEP 1, open rtc driver framework(hardware) support in the RT-Thread Settings file
*
* STEP 2, define macro related to the rtc
* such as BSP_USING_ONCHIP_RTC
*
* STEP 3, modify your stm32xxxx_hal_config.h file to support rtc peripherals. define macro related to the peripherals
* such as #define HAL_RTC_MODULE_ENABLED
*
*/

根據說明提示:

2 #define BSP_USING_ONCHIP_RTC

3 #define HAL_RTC_MODULE_ENABLED

配置完編譯工程下載後,看到串口的錯誤提示:

我一直以為是我哪裡寫錯了還是哪裡配置錯了,不知道問題出在哪裡,最後跟蹤調試了下代碼以及查看以前的調試筆記終於找到了問題點:

調試筆記:

STM32 使用HAL庫調試內部RTC經驗總結

跳轉到定義,最後發現它是跳轉到這裡了:

很明顯,這個地方有BUG,不應該是一個值,果斷將這個部分注釋掉!(drv_rtc.c)

這樣的話跳轉過去的就是HAL庫的函數了嘛,這不就對了嘛:

發現論壇上也有大佬討論這個問題: https://www.rt-thread.org/qa/search.php?mod=forum&searchid=191&orderby=lastpost&ascdesc=desc&searchsubmit=yes&kw=RTC

將代碼下載到板子以後,這次終於正常了:

溫馨提示:由於小熊派上沒有帶RTC備用電池,所以軟體復位後時間是可以正常跑的,但是斷電還是會恢復到原來的初始值噢!後來我拿了野火的STM32F103ZET6(帶RTC備用電池)驗證了一下是沒問題的,可以拿帶RTC備用電池的開發板嘗試一下!

大功告成!解決了問題,安心睡覺!祝各位朋友五一快樂!

相關焦點

  • RT-Thread ADC設備學習筆記
    RT-Thread PIN設備學習筆記今天我們來學習RT-Thread ADC設備!2.1 硬體原理圖參考這篇文章:基於小熊派氣體傳感器MQ-2綜合實踐2.2 軟體功能實現根據官方給出的文檔可以分為這麼幾步操作:查找設備 rt_device_t rt_device_find(const char* name);參數描述nameADC 設備名稱返回--設備句柄查找到對應設備將返回相應的設備句柄RT_NULL沒有找到設備使能設備rt_err_t rt_adc_enable
  • 【應用筆記】小白也能玩轉RT-Thread之串口設備【官方出品】
    本應用筆記描述了如何使用RT-Thread的串口設備,包括串口配置、設備操作接口的應用。
  • RT-Thread 入門學習筆記 - 查看線程棧的地址
    _t stack_size; 仿照list_thread編寫測試代碼void dump_thread_ex(void){ rt_uint8_t index = 0; rt_uint8_t obj_size = 0; int thread_cnt = rt_object_get_length
  • 【學習筆記】RT-Thread 多線程學習總結
    作者:helloworld多線程是實時作業系統裡面最重要的知識點之一
  • RT-Thread Nano如何適配pin設備API,並在RT-Thread Nano使用軟體包
    基礎工程創建可參考:在 RT-Thread Studio 上使用 RT-Thread NanoPIN 設備接口在 RT-Thread 標準版中,PIN設備設備提供了一套設備管理接口來訪問 GPIO,用戶程序可以直接使用該 API 操作 GPIO 的功能,設備管理接口如下:「函數」「描述」rt_pin_get()獲取引腳編號rt_pin_mode
  • RT-Thread Nano如何適配Pin設備API,並在RT-Thread Nano使用軟體包
    基礎工程創建可參考:在 RT-Thread Studio 上使用 RT-Thread NanoPIN 設備接口在 RT-Thread 標準版中,PIN設備設備提供了一套設備管理接口來訪問 GPIO,用戶程序可以直接使用該 API 操作 GPIO 的功能,設備管理接口如下:「函數」「描述」rt_pin_get()獲取引腳編號rt_pin_mode
  • RT-Thread實戰筆記|MPU6050使用詳解及DMP姿態解算
    小夥伴們大家好,好久不更新RT-Thread實戰筆記啦,今天來搞一搞MPU6050,話不多說,淦!本章源碼獲取 歡迎文末留言區或者公眾號後臺回復「MPU6050」即可獲取本教程源碼MPU6050簡介 某寶買的,吃灰許久了...
  • 5月份RT-Thread社區簡報
    圖片來源pixabay代碼更新情況:set Systick interrupt priority to the lowest #3637添加static前綴,防止與用戶自定函數衝突 #3634 by jch12138[bsp/at32] 1.add support for AT-START-F407 board, 2.add eth and rtc
  • RT-Thread 網絡工具集 (NetUtils) 應用筆記
    本文的結構NetUtils 組件介紹Ping 工具的配置和使用NTP 時間同步工具的配置和使用TFTP 文件傳輸工具的使用Iperf 網絡帶寬測試工具的配置和使用其他網絡調試工具的配置和使用問題闡述本應用筆記將圍繞下面幾個問題來介紹 RT-Thread NetUtils 組件。
  • 是的,RT-Thread 3.0.3發布了
    完善signal支持,增加rt_signal_wait函數(對應到POSIX sigwait接口);當打開finsh shell時,rtthread.h頭文件中主動包含finsh修訂rtdbg.hDBG_SECTION_NAME 給出每行調試信息的前綴;DBG_LEVEL 定義調試信息的輸出等級;DBG_COLOR 定義指明是否攜帶帶顏色輸出的信息增加libc_stdio_get_console()接口,用於返回console的文件描述符(fd)更改UI engine為獨立的package;增加SPI上通用的TF/SD卡驅動;增加軟體方式的RTC設備
  • RT-Thread時鐘管理學習總結
    關於RT-Thread時鐘管理相關的內容,官方提供了比較豐富的文檔作為參考,具體可以查看以下連結:https://www.rt-thread.org/document/site/programming-manual/timer/timer/本文嘗試從以下幾個方面總結一下RT-Thread時鐘管理的學習過程。
  • Debug神器 | RT-Thread發布「超輕量級「日誌組件ulog
    不用再擔心像使用 rt_kprintf 那樣,多線程並發輸出日誌時,日誌顯示錯位、截斷等問題。支持浮點數列印這個一直以來都是大家用 rt_kprintf 的痛點,現在在 ulog 上得到了徹底的解決。使用流程ulog 的代碼目前開源在 RT-Thread 的  GitHub 倉庫中,代碼位於 rt-thread/components/utilities/ulog 下,大致使用流程如下:#define LOG_TAG      "example
  • RT-Thread Smart上手指南~
    4CC build/kernel/src/thread.o 5CC build/kernel/src/timer.o 6LINK rtthread.elf 7arm-linux-musleabi-objcopy -O binary rtthread.elf rtthread.bin 8arm-linux-musleabi-size rtthread.elf
  • RT-Thread Smart 上手指南
    4CC build/kernel/src/thread.o 5CC build/kernel/src/timer.o 6LINK rtthread.elf 7arm-linux-musleabi-objcopy -O binary rtthread.elf rtthread.bin 8arm-linux-musleabi-size rtthread.elf
  • 基於RT-Thread的雷射雷達避障小車
    投稿:andychen@rt-thread.com背景描述由於在學校裡很少有機會讓我將所學的東西付諸於實踐.有時候學完一個東西沒法真正了解自己是否掌握,同時為了進一步提高自己的能力,不再漫無目的的學習.所以決定做這樣一輛小車.其中PCB原理圖和初版PCB_layout是我在寒假在家中完成的,程序是基於rt-thread[BSP]stm32f429-Apollo
  • RT-Thread Nano實戰2-msh配置與運行
    這次先學習example示例工程安裝、學習,而後完成GD32F150上Nano的msh功能開發。1.打開keil5主界面上的「Pack Installer」按鈕,進入Pack安裝界面。rt_device設備控制塊、環形隊列、gd32串口設備號、中斷號、串口接收buffer等。
  • RT-Thread 入門學習筆記 - 解決RT_ASSERT失效的問題
    前言自己在使用動態內存過程中,重複rt_free一個指針,發現竟然沒有出錯!
  • 基於 NIOS II 處理器的RT-Thread物聯網作業系統移植與使用教程
    梅雪松:網名「小梅哥」,擁有多年FPGA設計經驗,有《小梅哥和你一起深入學習FPGA》、《小梅哥FPGA學習筆記》兩個系列網絡博文;並推出了手把手式視頻教程
  • 當「樹莓派」遇上RT-Thread Smart——應用編程入門
    樹莓派4B包括了4核的ARM Cortex-A72,1.5GHz的BCM2711晶片,可以執行ARM AArch64位指令,也可以執行ARM AArch32位指令,具備標準化的通用控制器GIC。和樹莓派3B+的硬體規格對比情況:   要在樹莓派上運行smart也很簡單,直接下載smart的發布版,裡面有樹莓派4B上對應的移植代碼,及一些用戶態應用程式。
  • 【應用筆記】如何在windows及linux平臺使用RT-Thread QEMU BSP
    請點擊下面連結獲取env詳細信息及env運行環境要求:https://www.rt-thread.org/document/site/zh/5chapters/01-chapter_env_manual/解壓RT-Thread源碼,在BSP目錄下找到qemu-vexpress-a9文件夾,RT-Thread qemu-vexpresss-a9 BSP實現了LCD、鍵盤、滑鼠