ksen_Sang 发表于 2025-6-10 15:40:26

AI8H1K08T RTC问题请教

//============================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=206Month=22Day=22Hour=22Minute=22Second=22系统会卡死.请问如何正确重新设置时间?和在RTC启动后,如何停止或者再次启动RTC ?最好能给出具体的示例函数。启停RTC和重置RTC(最好能任意配置时间),比较急,在线等,感谢!

国芯人工智能 发表于 2025-6-10 15:43:00

在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 时钟的实时控制和通信。以上是主要的设置解释,具体配置需要根据实际需求调整各个参数的值。

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-6-10 15:54:53


用例程直接重新调用RTC_config未卡死,试下:




ksen_Sang 发表于 2025-6-10 16:09:02

我这边直接编译不过,调用的STC8H 头文件里都没有RCT的部分定义……?你是怎么编译通过的?

ksen_Sang 发表于 2025-6-10 16:15:04

麻烦您帮忙看看前面的函数是否有问题?目前用的单片机型号 STC8H1K08T 产品很快要量产,客户追的比较急。 因为软件定时误差太大,所以准备启用RTC

ercircle 发表于 2025-6-10 16:19:37

ksen_Sang 发表于 2025-6-10 16:09
我这边直接编译不过,调用的STC8H 头文件里都没有RCT的部分定义……?你是怎么编译通过的?
...

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




ercircle 发表于 2025-6-10 16:20:41

ksen_Sang 发表于 2025-6-10 16:15
麻烦您帮忙看看前面的函数是否有问题?目前用的单片机型号 STC8H1K08T 产品很快要量产,客户追的比较急。...
1L明显点的问题是:
1.切换XFR访问 ,这个建议main函数里打开就不要动了
新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读! - 老鸟反刍/吐槽,新手乐园,毕业设计 国芯技术交流网站 - AI32位8051交流社区


2.没有等待时钟稳定操作和RTC配置完成操作

乘风飞扬 发表于 2025-6-10 16:56:58

可参考官网8H实验箱例程包里面的RTC例程:50-内部RTC时钟程序
例程包下载地址:https://www.stcai.com/syx
RTC初始化函数:
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寄存器初始化
}

ksen_Sang 发表于 2025-6-10 17:00:52

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

ksen_Sang 发表于 2025-6-10 17:25:17

用最新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寄存器初始化
}
就用了这两个函数,初始化过不了。
页: [1] 2
查看完整版本: AI8H1K08T RTC问题请教