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)函數設置。