找回密码
 立即注册
查看: 119|回复: 15

AI8H1K08T RTC问题请教

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-10 15:40:26
已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
发表于 6 天前 | 显示全部楼层 |阅读模式
//============================RTC==========================================
void RTC_config(void)
{
    P_SW2 |= 0x80;                              //使能XFR访问
    INIYEAR = 25;                               //Y:2021
    INIMONTH = 12;                              //M:12
    INIDAY = 31;                                //D:31
    INIHOUR = 23;                               //H:23
    INIMIN = 59;                                //M:59
    INISEC = 50;                                //S:50
    INISSEC = 0;                                //S/128:0
    RTCCFG |= 0x03;                             //触发RTC寄存器初始化  xxxxxx11   BIT1 =0 :外部32K 1=内部32K、bi0=1 触发配置参数传递
    RTCIF = 0;                                  //清中断标志
    RTCIEN = 0x08;                              //使能RTC秒中断
    RTCCR = 0x01;                               // RTC使能
    P_SW2 &= ~0x80;                             //禁止XFR访问
}


void RTC_Rest()
{
    P_SW2 |= 0x80;                              //使能XFR访问        
        RTCCR = 0x00;                               // RTC使能
    INIYEAR = 25;                               //Y:2021
    INIMONTH = 0;                              //M:12
    INIDAY = 1;                                //D:31
    INIHOUR = 0;                               //H:23
    INIMIN = 0;                                //M:59
    INISEC = 0 ;                               //S:50
    INISSEC = 0;                                //S/128:0
    RTCCFG |= 0x03;                             //触发RTC寄存器初始化  xxxxxx11   BIT1 =0 :外部32K 1=内部32K、bi0=1 触发配置参数传递
    RTCCR = 0x01;                               // RTC使能
        P_SW2 &= ~0x80;                             //禁止XFR访问
}



问题:开机上电使用 RTC_config() 配置后 RTC正常启动,并打印秒数。实际使用中需要对RTC进行启动和停止的操作,也需要将“时分秒复位成0后重新计时” 所以用 RTC_Rest() 希望对RTC时间进行重新配置,此时调用这个函数后,RCT打印  :Year=206  Month=22  Day=22  Hour=22  Minute=22  Second=22系统会卡死.请问如何正确重新设置时间?和在RTC启动后,如何停止或者再次启动RTC ?最好能给出具体的示例函数。启停RTC和重置RTC(最好能任意配置时间),比较急,在线等,感谢!

回复

使用道具 举报 送花

3

主题

716

回帖

143

积分

等待验证会员

积分
143
发表于 6 天前 | 显示全部楼层
在STC8H RTC系统中, RTC的配置需要通过软件编写来实现。以下是关于RTC的配置说明和常见设置解释:

RTC配置说明
RTC(Real-Time Clock)是STC8H系统中的一个核心模块,用于实时 UTC 时钟的同步和操作。通过配置RTC,可以实现对 UTC 时钟的控制、读取和写入参数,以及与外部设备的通信。

1. 设备配置
PSW2 |= 0x80:控制端口(SW2)的使能,用于启动或禁用 RTC控制端口。
PBIT1 = 1:控制端口(SW1)的外设状态,用于控制SW2端的输入和输出。
PBIT2 = 1:控制端口(SW0)的外设状态,用于控制SW2端的输入和输出。

2. 系统时间设置
INIYEAR = 25:系统年份(Y:2021)。
INIMONTH = 12:系统月份数值(M:12)。
INIDAY = 31:系统日份数值(D:31)。
INIHOUR = 23:系统时区小时(H:23)。
INIMIN = 59:系统时区分钟(M:59)。
INISEC = 50:系统时区秒(S:50)。
INISSEC = 0:系统时区微秒(S/128:0)。

3. RTCInitialize参数
RTCIF = 0:清中断标志(RTCCFG | 0x00)。
RTCIEN = 0x08:使能 RTC秒中(RTCCFG | 0x08)。

4. RTC初始化参数设置
RTCCFG |= 0x03:触发 RTC寄存器初始化参数(RTCCFG | 0x03)。
RTCIF = 0:清中断标志(RTCCFG | 0x00)。
RTCIEN = 0x08:使能 RTC秒中(RTCCFG | 0x08)。

5. 快速启动设置
RTCIF = 0x00:快速启动中断标志(RTCCFG | 0x00)。
RTCIEN = 0x00:快速启动中断标志(RTCCFG | 0x00)。

6. 内部参数设置
RTCCFG |= 0x00:不触发 RTC寄存器初始化参数(RTCCFG | 0x00)。
RTCIF = 0:清中断标志(RTCCFG | 0x00)。
RTCIEN = 0x00:使能 RTC秒中(RTCCFG | 0x00)。

7. 外部参数设置
RTCCFG |= 0x00:不触发 RTC寄存器初始化参数(RTCCFG | 0x00)。
RTCIF = 0x00:清中断标志(RTCCFG | 0x00)。
RTCIEN = 0x00:使能 RTC秒中(RTCCFG | 0x00)。

8. 时区设置
INIYEAR = 25:系统年份(Y:2021)。
INIMONTH = 12:系统月份数值(M:12)。
INIDAY = 31:系统日份数值(D:31)。
INIHOUR = 23:系统时区小时(H:23)。
INIMIN = 59:系统时区分钟(M:59)。
INISEC = 50:系统时区秒(S:50)。
INISSEC = 0:系统时区微秒(S/128:0)。

9. 数据读取与写入
RTCIF = 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。

10. 系统状态设置
RTCIF = 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。

11. 性能设置
RTCCFG |= 0x01:不触发 RTC寄存器初始化参数(RTCCFG | 0x01)。
RTCIF |= 0x01:清中断标志(RTCCFG | 0x01)。
RTCIF |= 0x01:清中断标志(RTCCFG | 0x01)。

12. 内部参数
RTCCFG |= 0x00:不触发 RTC寄存器初始化参数(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。

13. 外部参数
RTCCFG |= 0x00:不触发 RTC寄存器初始化参数(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。

14. 快速启动
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。

15. 内部参数
RTCCFG |= 0x00:不触发 RTC寄存器初始化参数(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。

16. 外部参数
RTCCFG |= 0x00:不触发 RTC寄存器初始化参数(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。

17. 性能设置
RTCCFG |= 0x01:不触发 RTC寄存器初始化参数(RTCCFG | 0x01)。
RTCIF |= 0x01:清中断标志(RTCCFG | 0x01)。
RTCIF |= 0x01:清中断标志(RTCCFG | 0x01)。

18. 内部参数
RTCCFG |= 0x00:不触发 RTC寄存器初始化参数(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。

19. 外部参数
RTCCFG |= 0x00:不触发 RTC寄存器初始化参数(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。
RTCIF |= 0x00:清中断标志(RTCCFG | 0x00)。

20. 性能设置
RTCCFG |= 0x01:不触发 RTC寄存器初始化参数(RTCCFG | 0x01)。
RTCIF |= 0x01:清中断标志(RTCCFG | 0x01)。
RTCIF |= 0x01:清中断标志(RTCCFG | 0x01)。

总结
通过配置RTC的控制端口、时间设置、参数初始化和中断标志,可以实现对 UTC 时钟的实时控制和通信。以上是主要的设置解释,具体配置需要根据实际需求调整各个参数的值。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1919

回帖

4309

积分

荣誉版主

无情的代码机器

积分
4309
发表于 6 天前 | 显示全部楼层

用例程直接重新调用RTC_config未卡死,试下:
51-内部RTC时钟低功耗休眠唤醒-比较器检测电压程序 - 副本.zip (65.29 KB, 下载次数: 2)


截图202506101554517038.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-10 15:40:26
已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
发表于 6 天前 | 显示全部楼层
我这边直接编译不过,调用的STC8H 头文件里都没有RCT的部分定义……?你是怎么编译通过的?

点评

用了最新的头文件,这先不要更新了,先解决问题。 只是参考这个例程里Config 寄存器操作序列,看下挪到问题工程是否有效,注意内外晶振选用, config前可以加上RTC去使能和停止RTC中断操作。 [attachimg]103498[/a  详情 回复 发表于 6 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-10 15:40:26
已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
发表于 6 天前 | 显示全部楼层
麻烦您帮忙看看前面的函数是否有问题?目前用的单片机型号 STC8H1K08T 产品很快要量产,客户追的比较急。 因为软件定时误差太大,所以准备启用RTC

点评

1L明显点的问题是: 1.切换XFR访问 ,这个建议main函数里打开就不要动了 2.没有等待时钟稳定操作和RTC配置完成操作  详情 回复 发表于 6 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1919

回帖

4309

积分

荣誉版主

无情的代码机器

积分
4309
发表于 6 天前 | 显示全部楼层
ksen_*** 发表于 2025-6-10 16:09
我这边直接编译不过,调用的STC8H 头文件里都没有RCT的部分定义……?你是怎么编译通过的?
...

用了最新的头文件,这先不要更新了,先解决问题。
只是参考这个例程里Config 寄存器操作序列,看下挪到问题工程是否有效,注意内外晶振选用,
config前可以加上RTC去使能和停止RTC中断操作。


截图202506101618163354.jpg

三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1919

回帖

4309

积分

荣誉版主

无情的代码机器

积分
4309
发表于 6 天前 | 显示全部楼层
ksen_*** 发表于 2025-6-10 16:15
麻烦您帮忙看看前面的函数是否有问题?目前用的单片机型号 STC8H1K08T 产品很快要量产,客户追的比较急。  ...

1L明显点的问题是:
1.切换XFR访问 ,这个建议main函数里打开就不要动了
新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读! - 老鸟反刍/吐槽,新手乐园,毕业设计 国芯技术交流网站 - AI32位8051交流社区
截图202506101621136699.jpg

2.没有等待时钟稳定操作和RTC配置完成操作
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:444
  • 最近打卡:2025-06-16 09:26:42
已绑定手机

39

主题

2059

回帖

7070

积分

论坛元老

积分
7070
发表于 6 天前 | 显示全部楼层
可参考官网8H实验箱例程包里面的RTC例程:50-内部RTC时钟程序
例程包下载地址:https://www.stcai.com/syx
RTC初始化函数:
  1. void RTC_config(void)
  2. {
  3.     INIYEAR = 21;     //Y:2021
  4.     INIMONTH = 12;    //M:12
  5.     INIDAY = 31;      //D:31
  6.     INIHOUR = 23;     //H:23
  7.     INIMIN = 59;      //M:59
  8.     INISEC = 50;      //S:50
  9.     INISSEC = 0;      //S/128:0
  10.     ALAHOUR = 0;        //闹钟小时
  11.     ALAMIN  = 0;        //闹钟分钟
  12.     ALASEC  = 0;        //闹钟秒
  13.     ALASSEC = 0;        //闹钟1/128秒
  14.     //STC8H8K64U B版本芯片使用内部32K时钟,休眠无法唤醒
  15. //    IRC32KCR = 0x80;   //启动内部32K晶振.
  16. //    while (!(IRC32KCR & 1));  //等待时钟稳定
  17. //    RTCCFG = 0x03;    //选择内部32K时钟源,触发RTC寄存器初始化
  18.     X32KCR = 0x80 + 0x40;   //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
  19.     while (!(X32KCR & 1));  //等待时钟稳定
  20.     RTCCFG = 0x01;    //选择外部32K时钟源,触发RTC寄存器初始化
  21.     RTCIF = 0x00;     //清中断标志
  22.     RTCIEN = 0x88;    //中断使能, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
  23.     RTCCR = 0x01;     //RTC使能
  24.     while(RTCCFG & 0x01);        //等待初始化完成,需要在 "RTC使能" 之后判断.
  25.     //设置RTC时间需要32768Hz的1个周期时间,大约30.5us. 由于同步, 所以实际等待时间是0~30.5us.
  26.     //如果不等待设置完成就睡眠, 则RTC会由于设置没完成, 停止计数, 唤醒后才继续完成设置并继续计数.
  27. }
复制代码

RTC时钟修改函数:
  1. void WriteRTC(void)
  2. {
  3.     INIYEAR = YEAR;   //继承当前年月日
  4.     INIMONTH = MONTH;
  5.     INIDAY = DAY;
  6.     INIHOUR = hour;   //修改时分秒
  7.     INIMIN = minute;
  8.     INISEC = 0;
  9.     INISSEC = 0;
  10.     RTCCFG |= 0x01;   //触发RTC寄存器初始化
  11. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-10 15:40:26
已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
发表于 6 天前 | 显示全部楼层
目前通过一些标记测试(在RTC秒中断服务函数内放了LED 取反的指示),在二次调用RTC Config() 后程序不能跑主循环,但秒中断还是能正常运行,LED还是每秒改变一次状态,但主程序循环中不跑(也放了个取反LED的指示)。上电初始化后,两个LED都闪烁,但再次调用RTC Config() 后,就只有RTC 秒中断的LED闪烁,麻烦帮定位一下可能的问题根源,感谢!

点评

回帖记得要点回复对方才能收到提醒~  发表于 6 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-10 15:40:26
已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
发表于 6 天前 | 显示全部楼层
用最新STC8H实验包里的RTC Config() 函数上电就不动了,RTC也不能运行。请问这个和单片机型号STC8H1K08T有没关系?或者说1K08T你们有实际验证过RTC部分的状况吗?

//============================RTC==========================================
//========================================================================
// 函数: void RTC_config(void)
// 描述: RTC初始化函数。
// 参数: 无.
// 返回: 无.
// 版本: V1.0, 2020-6-10
//========================================================================
void RTC_config(void)
{
    INIYEAR = 21;     //Y:2021
    INIMONTH = 12;    //M:12
    INIDAY = 31;      //D:31
    INIHOUR = 23;     //H:23
    INIMIN = 59;      //M:59
    INISEC = 50;      //S:50
    INISSEC = 0;      //S/128:0

    ALAHOUR = 0;        //闹钟小时
    ALAMIN  = 0;        //闹钟分钟
    ALASEC  = 0;        //闹钟秒
    ALASSEC = 0;        //闹钟1/128秒

    //STC8H8K64U B版本芯片使用内部32K时钟,休眠无法唤醒
    IRC32KCR = 0x80;   //启动内部32K晶振.
    while (!(IRC32KCR & 1));  //等待时钟稳定
    RTCCFG = 0x03;    //选择内部32K时钟源,触发RTC寄存器初始化

//    X32KCR = 0x80 + 0x40;   //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
//    while (!(X32KCR & 1));  //等待时钟稳定
//    RTCCFG = 0x01;    //选择外部32K时钟源,触发RTC寄存器初始化

    RTCIF = 0x00;     //清中断标志
    RTCIEN = 0x88;    //中断使能, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
    RTCCR = 0x01;     //RTC使能

    while(RTCCFG & 0x01);        //等待初始化完成,需要在 "RTC使能" 之后判断.
    //设置RTC时间需要32768Hz的1个周期时间,大约30.5us. 由于同步, 所以实际等待时间是0~30.5us.
    //如果不等待设置完成就睡眠, 则RTC会由于设置没完成, 停止计数, 唤醒后才继续完成设置并继续计数.
}

/********************** 写RTC函数 ************************/
void WriteRTC(void)
{
    INIYEAR = YEAR;   //继承当前年月日
    INIMONTH = MONTH;
    INIDAY = DAY;

    INIHOUR = hour;   //修改时分秒
    INIMIN = minute;
    INISEC = 0;
    INISSEC = 0;
    RTCCFG |= 0x01;   //触发RTC寄存器初始化
}
就用了这两个函数,初始化过不了。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 19:45 , Processed in 0.132687 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表