GD32F470 RTC设置 不生效!(BUG)

[复制链接]
634|12
手机看帖
扫描二维码
随时随地手机跟帖
caizhiwei|  楼主 | 2023-3-20 18:56 | 显示全部楼层 |阅读模式
用的官方的标准库,先使用历程,貌似OK;
第一次能设置,RTC跑起来了之后,设置不生效,但是仿真到库函数里面,返回值确实成功的!

使用特权

评论回复
评论
duzhiqiang521 2023-3-20 20:03 回复TA
RTC有一个初始化模式,RTC运行起来,如果重新想设置RTC时间,需要控制RTC模块进入初始化模式 
duzhiqiang521| | 2023-3-20 20:01 | 显示全部楼层
啥意思?

使用特权

评论回复
caizhiwei|  楼主 | 2023-3-21 13:09 | 显示全部楼层
问题解决了: 1. 没有初始化RTC是不行的,结果是 TRC 能走秒,但是写不进去;
2. 年月日不需要转BCD,但是时分秒需要转;

使用特权

评论回复
caizhiwei|  楼主 | 2023-3-21 13:10 | 显示全部楼层
代码分享给大家:
/*******************************************************************!
    \brief  使用固定格式设置时间,默认东八区
    \param[in]  year: 0 ~ 99 (十进制)
                            month: 1 ~ 12 (十进制)
                            date: 1 ~ 31 (十进制)
                            day_of_week:1 ~7 (十进制)
                            hour: 0 ~ 23
                            minute: 0 ~ 59
                            second: 0 ~ 59
    \param[out] none
    \retval     none
*******************************************************************/
void BSP_RTC_time_setup(uint8_t year, uint8_t month, uint8_t date,\
              uint8_t hour,  uint8_t minute,  uint8_t second)
{
    //设置RTC时间值
    rtc_parameter_struct rtc_initpara;

    rtc_initpara.factor_asyn = 0x7F;
    rtc_initpara.factor_syn = 0xFF;
    rtc_initpara.year = (year);
    rtc_initpara.day_of_week = RTC_SATURDAY;  // 一般用不到
    rtc_initpara.month = (month);
    rtc_initpara.date = (date);
    rtc_initpara.display_format = RTC_24HOUR;
    rtc_initpara.am_pm = RTC_AM;
   
    rtc_initpara.hour = RTC_ByteToBCD(hour);
        rtc_initpara.minute = RTC_ByteToBCD(minute);
        rtc_initpara.second = RTC_ByteToBCD(second);

#if 0
    /* current time input */
    //当前时间输入
    printf("=======Configure RTC Time========\n\r");
    printf("  please input hour:\n\r");
    while (0xFF == tmp_hh)
        {
        tmp_hh = usart_input_threshold(23);//输入 时
        rtc_initpara.hour = tmp_hh;
    }
    printf("  %0.2x\n\r", tmp_hh);

    printf("  please input minute:\n\r");
    while (0xFF == tmp_mm)
        {
        tmp_mm = usart_input_threshold(59);//输入 分
        rtc_initpara.minute = tmp_mm;
    }
    printf("  %0.2x\n\r", tmp_mm);

    printf("  please input second:\n\r");
    while (0xFF == tmp_ss)
        {
        tmp_ss = usart_input_threshold(59);//输入 秒
        rtc_initpara.second = tmp_ss;
    }
    printf("  %0.2x\n\r", tmp_ss);
   
#endif
            //RTC当前时间配置
    if(ERROR == rtc_init(&rtc_initpara))
        {
        printf("\n\r** RTC time configuration failed! **\n\r");
    }
        else
        {
        printf("\n\r** RTC time configuration success! **\n\r");
        rtc_show_time();
    }
}

使用特权

评论回复
caizhiwei|  楼主 | 2023-3-21 13:10 | 显示全部楼层
点击插入代码,但是还是没有代码格式,

使用特权

评论回复
caizhiwei|  楼主 | 2023-3-21 13:11 | 显示全部楼层
uint8_t RTC_BCDToByte(uint8_t Value)//BCD转二进制
{
        uint8_t tmp;
        tmp = ((Value & 0xF0u) >> 4u) * 10u;
        return (tmp + (Value & 0x0Fu));
}

uint8_t RTC_ByteToBCD(uint8_t Value)//二进制转BCD
{
        uint32_t bcdhigh = 0u;
        uint8_t Param = Value;

        while(Param >= 10u)
        {
                bcdhigh++;
                Param -= 10u;
        }
        return  ((uint8_t)(bcdhigh << 4u) | Param);
}

使用特权

评论回复
caizhiwei|  楼主 | 2023-3-21 13:11 | 显示全部楼层
这两个小函数很好用,分享之

使用特权

评论回复
sagade| | 2023-3-22 09:49 | 显示全部楼层
本帖最后由 sagade 于 2023-3-22 09:54 编辑
caizhiwei 发表于 2023-3-21 13:09
问题解决了: 1. 没有初始化RTC是不行的,结果是 TRC 能走秒,但是写不进去;
2. 年月日不需要转BCD,但是 ...

分秒是BCD的啊 96381641a5fb356682.png

使用特权

评论回复
caizhiwei|  楼主 | 2023-3-22 15:09 | 显示全部楼层

截图的注释里,年月日是bcd格式,但是填进去不行。实际操作就是10进制

结论:数据手册+代码注释有误

使用特权

评论回复
sagade| | 2023-3-23 09:52 | 显示全部楼层
caizhiwei 发表于 2023-3-22 15:09
截图的注释里,年月日是bcd格式,但是填进去不行。实际操作就是10进制

结论:数据手册+代码注释有误 ...

库文件的注释确实是有点问题,手册应该是对的,我450/470都是按照手册来操作的,BCD码写入RTC,读取的时候再转成10进制的,没有问题。
库文件貌似没有对写入值做判断,写入的不是BCD码也能写入,但是在边界的地方就会出错,比如跨年跨月的时候。

使用特权

评论回复
caizhiwei|  楼主 | 2023-3-23 16:19 | 显示全部楼层
354641c0b6c0de4b.png
这是官方的历程,写的稀烂,打印出来的数据有 89分 89秒

使用特权

评论回复
caizhiwei|  楼主 | 2023-3-23 16:21 | 显示全部楼层
为啥呢? 因为没有 bcd->hex 转换。
毫秒打印为啥搞3个变量?
    time_subsecond = (1000 - (time_subsecond*1000+1000)/400);

这一句不就好了么 一个%d输出。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

96

主题

842

帖子

11

粉丝