Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RTC
STM32F407
F407无法使用RTC,手册上的RTC实验例程跑不通。请各位不吝赐教!
发布于 2020-08-31 19:44:44 浏览:1621
订阅该版
今天在407上打算用RTC实现一个时间计时,各种配置后使用RT手册的RTC例程编译发现: 1. ``` static int rtc_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; time_t now; /* 设置日期 */ ret = set_date(2018, 12, 3); if (ret != RT_EOK) { rt_kprintf("set RTC date failed\n"); return ret; } /* 设置时间 */ ret = set_time(11, 15, 50); 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; } ``` 这里报错"set RTC date failed\n"。然后发现是rt_device_find("rtc") 找不到RTC设备,使用list_device命令发现不存在RTC设备。于是手动进行设备注册 ``` RT_ASSERT(!rt_device_find("rtc")); if(RT_EOK != rt_device_register(&rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR)) { rt_kprintf("rt_device_register failed\n"); } INIT_DEVICE_EXPORT(rt_rtc_init); ``` 编译,list_device出现设备RTC,但继续报错: 2. ``` rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day) { time_t now; struct tm *p_tm; struct tm tm_new; rt_device_t device; rt_err_t ret = -RT_ERROR; /* get current time */ now = time(RT_NULL); /* lock scheduler. */ rt_enter_critical(); /* converts calendar time time into local time. */ p_tm = localtime(&now); /* copy the statically located variable */ memcpy(&tm_new, p_tm, sizeof(struct tm)); /* unlock scheduler. */ rt_exit_critical(); /* update date. */ tm_new.tm_year = year - 1900; tm_new.tm_mon = month - 1; /* tm_mon: 0~11 */ tm_new.tm_mday = day; /* converts the local time in time to calendar time. */ now = mktime(&tm_new); device = rt_device_find("rtc"); if (device == RT_NULL) { return -RT_ERROR; } /* update to RTC device. */ ret = rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now); rt_kprintf("4.rt_device_control==%d \n",ret); return ret; } ``` 发现是该函数最后一行:“ ret = rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now);”返回异常,于是发现是由于该函数内的 ``` /* call device_write interface */ if (device_control != RT_NULL) { rt_kprintf("5.device_control==%d \n",device_control(dev, cmd, arg)); return device_control(dev, cmd, arg); } ``` device_control为NULL,即上面函数的设备参数dev->control为NULL,该参数是在set_date里面调用 ``` rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now) ``` 时传入的,于是接下来在调用之前把设备参数进行手动初始化。手动为 ``` rtc_dev.type = RT_Device_Class_RTC; /**< RTC device */ /* register rtc device */ soft_rtc_dev.ops = &soft_rtc_ops; rtc_dev.init = RT_NULL; rtc_dev.open = RT_NULL; rtc_dev.close = RT_NULL; rtc_dev.read = RT_NULL; rtc_dev.write = RT_NULL; rtc_dev.control = rtc_control; rtc_dev.user_data = RT_NULL; ``` 其中,将rtc_control设置为 ``` rtc_control(rt_device_t dev, int cmd, void *args) {return RT_EOK;} ``` 此时编译通过,运行正常。但是时间永远是1970-01-01-00-00-00. 研究发现,这应该是 ``` ret = rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now); ``` 里面的第二个参数没有起作用,该参数应该在 ``` rtc_control(rt_device_t dev, int cmd, void *args) ``` 进行处理,而我设置成了空函数。靠!QTQ。 后来把sort_rtc里面的sort_rtc_control函数搬过来 ``` static rt_err_t rtc_control(rt_device_t dev, int cmd, void *args) { time_t *time; struct tm time_temp; RT_ASSERT(dev != RT_NULL); memset(&time_temp, 0, sizeof(struct tm)); switch (cmd) { case RT_DEVICE_CTRL_RTC_GET_TIME: time = (time_t *) args; *time = init_time + (rt_tick_get() - init_tick) / RT_TICK_PER_SECOND; break; case RT_DEVICE_CTRL_RTC_SET_TIME: { time = (time_t *) args; init_time = *time - (rt_tick_get() - init_tick) / RT_TICK_PER_SECOND; break; } } return RT_EOK; } ``` 编译运行成功,时间可以变化了。然而,断电重启407后,时间又回到了初始化的时间。 静下来思考发现,想不通:明明我是用的407的片上RTC,并且VBAT引脚电池有电,为什么手册上的RTC例程会上来就找不到‘rtc’设备呢?注册了设备又为什么开始在set_date这里就一路报错呢?请各位不吝赐教! 附上例程链接:[RTC例程](https://www.rt-thread.org/document/site/programming-manual/device/rtc/rtc/) 以下为RTthread配置: CubeMX ![image.png](/uploads/20200831/bcda55ad8f6aac45b2ac2ed92dd935ec.png) ![image.png](/uploads/20200831/f48029abd2e2c184ffdcba0840e823a2.png) ![image.png](/uploads/20200831/75722c9fe0a8808722acb3562e659d74.png) Menuconfig ![image.png](/uploads/20200831/7b68a846ab546e9824143b69b96a0f2e.png) ![image.png](/uploads/20200831/4b6478ef0e84a1f2656415f0da1df3a7.png) ![image.png](/uploads/20200831/e1e2ca99280f1eb441a2c7e949b34976.png) ![image.png](/uploads/20200831/c0f1bcdb0f621a7b06ed0e27df999a4b.png)
查看更多
nongxiaoming
2020-09-01
rt-thread大师兄
你要通过备份寄存器去判断是不是需要设置时间,不是每次启动都要设置时间的,不然时间就又被设置回去了。
3
个回答
默认排序
按发布时间排序
mii
2020-09-01
这家伙很懒,什么也没写!
首先,你确定cube配置时钟的函数已经修改到RTT上了。第二,确保rtc时钟有起振,STM32有个奇怪的现象,RTC的无源晶振有时候不会起振。第三,根据RTT官方文档开启配置,我实测是不需要修改文件的,建议你选择最新的系统版本。
clickcheck
2020-09-01
这家伙很懒,什么也没写!
感谢各位的耐心回答。早上过来看了下@nongxiaoming 的回复,这给我提了个醒。于是翻了一下bsp\stm32\libraries\HAL_Drivers的文件,发现了drv_rtc.c文件!它并没有在一些列配置后自动加入到工程中,于是在keil5工程手动导入该文件。 至此,问题解决!
撰写答案
登录
注册新账号
关注者
0
被浏览
1.6k
关于作者
clickcheck
这家伙很懒,什么也没写!
提问
3
回答
1
被采纳
0
关注TA
发私信
相关问题
1
RTC驱动框架几点建议
2
求助:RTT在STM32F407上使用内置的RTC设置日期需重启生效,设置时间即时生效,有遇到同样问题的吗?
3
[新人试水] LPC1768 Nano3_9 添加RTC
4
STM32 关于RTC的问题
5
stm32f4xx-HAL BSP的RTC设置不对
6
关于STM32的RTC设置年份不正确的问题
7
RTT的RTC驱动调试
8
rtc驱动中的bkp模块起不到防止时间的重新设置
9
rtc时钟跑十几个小时后,比实际时间快几秒怎么解决
10
stm32如何断电之后开发板rtc时间继续往前跑
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RTT 源码分析笔记——互斥量篇
2
[E/app.filesystem] SD card mount to '/sdcard' failed!
3
单片机也能聊天?RT-Thread上跑通大语言模型
4
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
5
Rt-thread中OTA下载后,bootloader不搬程序
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
549
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部