Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RTC
芯片掉电,只有rtc电源,rtthread读取年月日都为0,时分秒正常
发布于 2019-11-08 13:44:56 浏览:4935
订阅该版
[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
被浏览
4.9k
关于作者
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
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
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
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
15
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部