Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RTC
芯片掉电,只有rtc电源,rtthread读取年月日都为0,时分秒正常
发布于 2019-11-08 13:44:56 浏览:5120
订阅该版
[table=98%] [tr][td]移植rtc后,设想设置正常时间后,芯片断电,但RTC电源保持,再次上电后只有时分秒,且数据正确,但年月日变为1999年12月31日,调试发现读取时在CNTL寄存器中只有时分秒数据, Set_Date函数中并没有把年月日数据折算为秒写到CNT寄存器。导致芯片断电后年月日数据丢失,这应该是rtc驱动的BUg。[/td][/tr] [/table]
查看更多
10
个回答
默认排序
按发布时间排序
EmbeddedKing
2020-01-15
这家伙很懒,什么也没写!
参考正点原子的RTC寄存器示例代码,修改drv_rtc.c的以下两个函数,改为RTC CNT直接存时间戳 ```c static time_t get_rtc_timestamp(void) static rt_err_t set_rtc_time_stamp(time_t time_stamp) ``` get_rtc_timestamp ```c static time_t get_rtc_timestamp(void) { #if 0 RTC_TimeTypeDef RTC_TimeStruct = {0}; RTC_DateTypeDef RTC_DateStruct = {0}; struct tm tm_new; HAL_RTC_GetTime(&RTC_Handler, &RTC_TimeStruct, RTC_FORMAT_BIN); HAL_RTC_GetDate(&RTC_Handler, &RTC_DateStruct, RTC_FORMAT_BIN); tm_new.tm_sec = RTC_TimeStruct.Seconds; tm_new.tm_min = RTC_TimeStruct.Minutes; tm_new.tm_hour = RTC_TimeStruct.Hours; tm_new.tm_mday = RTC_DateStruct.Date; tm_new.tm_mon = RTC_DateStruct.Month - 1; tm_new.tm_year = RTC_DateStruct.Year + 100; LOG_D("get rtc time."); return mktime(&tm_new); #else time_t timestamp; timestamp = RTC->CNTH; /* 得到计数器中的值(秒钟数) */ timestamp <<= 16; timestamp += RTC->CNTL; LOG_D("get rtc time."); return timestamp; #endif } ``` set_rtc_time_stamp: ```c static rt_err_t set_rtc_time_stamp(time_t time_stamp) { #if 0 RTC_TimeTypeDef RTC_TimeStruct = {0}; RTC_DateTypeDef RTC_DateStruct = {0}; struct tm *p_tm; p_tm = localtime(&time_stamp); if (p_tm->tm_year < 100) { return -RT_ERROR; } RTC_TimeStruct.Seconds = p_tm->tm_sec ; RTC_TimeStruct.Minutes = p_tm->tm_min ; RTC_TimeStruct.Hours = p_tm->tm_hour; RTC_DateStruct.Date = p_tm->tm_mday; RTC_DateStruct.Month = p_tm->tm_mon + 1 ; RTC_DateStruct.Year = p_tm->tm_year - 100; RTC_DateStruct.WeekDay = p_tm->tm_wday + 1; if (HAL_RTC_SetTime(&RTC_Handler, &RTC_TimeStruct, RTC_FORMAT_BIN) != HAL_OK) { return -RT_ERROR; } if (HAL_RTC_SetDate(&RTC_Handler, &RTC_DateStruct, RTC_FORMAT_BIN) != HAL_OK) { return -RT_ERROR; } LOG_D("set rtc time."); HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR1, BKUP_REG_DATA); return RT_EOK; #else /* 设置时钟 */ RCC->APB1ENR |= 1<<28; /* 使能电源时钟 */ RCC->APB1ENR |= 1<<27; /* 使能备份时钟 */ PWR->CR |= 1 << 8; /* 取消备份区写保护 */ /* 上面三步是必须的! */ RTC->CRL |= 1 << 4; /* 允许配置 */ RTC->CNTL = time_stamp & 0xffff; RTC->CNTH = time_stamp >> 16; RTC->CRL &= ~(1 << 4); /* 配置更新 */ while (!(RTC->CRL & (1 << 5))); /* 等待RTC寄存器操作完成 */ HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR1, BKUP_REG_DATA); LOG_D("set rtc time."); return RT_EOK; #endif } ```
ericwang215
2019-11-08
这家伙很懒,什么也没写!
RTC复位年月日丢失的问题我也遇到了,用的stm32f103RC,只是复位后时间变1999年11月30日,想请教一下驱动的修改在什么地方?
liu2guang
认证专家
2019-11-09
这家伙很懒,什么也没写!
>RTC复位年月日丢失的问题我也遇到了,用的stm32f103RC,只是复位后时间变1999年11月30日,想请教一下驱动的 ... --- 这个和STM32F1芯片有关,这个芯片掉电了年月日就是会丢失
ericwang215
2019-11-12
这家伙很懒,什么也没写!
>这个和STM32F1芯片有关,这个芯片掉电了年月日就是会丢失 --- 谢谢提醒!我检索了一下确实如此,有一些简单的解决方法,但也仅是缓兵之计
HelloBye
2019-11-12
这家伙很懒,什么也没写!
>谢谢提醒!我检索了一下确实如此,有一些简单的解决方法,但也仅是缓兵之计 ... --- f1库的问题,日期没有存到掉电存储寄存器里,自己改下就行
ericwang215
2019-11-12
这家伙很懒,什么也没写!
f1库的问题,日期没有存到掉电存储寄存器里,自己改下就行[/quote] 经过各位前辈提示,已经修改完成,主要有几个修改地方: 1. 在RTC驱动文件drv_rtc.c中,在函数set_rtc_time_stamp结尾处增加写入掉电存储器的代码: ```c HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR2, RTC_DateStruct.Year); HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR3, RTC_DateStruct.Month); HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR4, RTC_DateStruct.Date); HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR5, RTC_DateStruct.WeekDay); ``` 2.在函数rt_rtc_config结尾处增加上电读取掉电寄存器的代码: ```c else { datebuff.Year = HAL_RTCEx_BKUPRead(&RTC_Handler, RTC_BKP_DR2); datebuff.Month = HAL_RTCEx_BKUPRead(&RTC_Handler, RTC_BKP_DR3); datebuff.Date = HAL_RTCEx_BKUPRead(&RTC_Handler, RTC_BKP_DR4); datebuff.WeekDay = HAL_RTCEx_BKUPRead(&RTC_Handler, RTC_BKP_DR5); DateToUpdate = datebuff; if (HAL_RTC_SetDate(&RTC_Handler, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } } ``` 3. 为了保证日期跳变后掉电寄存器可以同步修改,需要自己格外加一个函数去执行 ```c /* update RTC_BKP_DRx*/ void rt_rtc_bkp_update(void) { RTC_DateTypeDef RTC_DateStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; HAL_PWR_EnableBkUpAccess(); PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); __HAL_RCC_BKP_CLK_ENABLE(); HAL_RTC_GetDate(&RTC_Handler, &RTC_DateStruct, RTC_FORMAT_BIN); if (HAL_RTCEx_BKUPRead(&RTC_Handler, RTC_BKP_DR4) != RTC_DateStruct.Date) { HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR1, BKUP_REG_DATA); HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR2, RTC_DateStruct.Year); HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR3, RTC_DateStruct.Month); HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR4, RTC_DateStruct.Date); HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR5, RTC_DateStruct.WeekDay); } } ``` 4. 有一点可能需要额外注意,再写入掉电寄存器的时候要配置一下,否则写不进去 `__HAL_RCC_BKP_CLK_ENABLE();`
wlof
2019-11-23
这个家伙不懒,什么也没写
遇到同样的问题,周一试一下,强烈建议RTT的库里面添加进去。
coulson
2020-01-03
这家伙很懒,什么也没写!
楼主您好,我遇到跟您同样的问题,在增加上电读取掉电寄存器的代码时遇到错误,请问是要自己写一个datebuffer的结构体吗
CZFU_1394
2020-01-03
这家伙很懒,什么也没写!
接上边第五条,在数据写[https://1680380.com/view/shishicai_xy/ssc_index.html]([u]幸运时时彩[/u])入时,littlefs每次都会新开辟一个数据块,然后在新的数据块中添加要写入的数据,即便是对原文件覆盖写入也同样开辟一个新的块,待整个块写满或数据写完时才更新文件索引,让新的[https://1680380.com/view/cjdlt/index.html]([u]超级大乐透[/u])数据块在文件链路中生效, 由于数据写入的较慢,而索引更新只需一次[https://1680380.com/view/shiyix5_sd/index.html]([u]十一运夺金[/u])写入即可,所以littlefs能实现“断电恢复”
ticat710
2020-01-08
这家伙很懒,什么也没写!
您用6楼的方法试试,我这边因为暂时没用到rtc功能,暂时还没空弄这个
撰写答案
登录
注册新账号
关注者
1
被浏览
5.1k
关于作者
ticat710
这家伙很懒,什么也没写!
提问
8
回答
9
被采纳
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
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
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
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部