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(最好能任意配置时间),比较急,在线等,感谢!
在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 时钟的实时控制和通信。以上是主要的设置解释,具体配置需要根据实际需求调整各个参数的值。
[本文内容由国芯人工智能辅助生成,仅供参考]
用例程直接重新调用RTC_config未卡死,试下:
我这边直接编译不过,调用的STC8H 头文件里都没有RCT的部分定义……?你是怎么编译通过的?
麻烦您帮忙看看前面的函数是否有问题?目前用的单片机型号 STC8H1K08T 产品很快要量产,客户追的比较急。 因为软件定时误差太大,所以准备启用RTC
ksen_Sang 发表于 2025-6-10 16:09
我这边直接编译不过,调用的STC8H 头文件里都没有RCT的部分定义……?你是怎么编译通过的?
...
用了最新的头文件,这先不要更新了,先解决问题。
只是参考这个例程里Config 寄存器操作序列,看下挪到问题工程是否有效,注意内外晶振选用,
config前可以加上RTC去使能和停止RTC中断操作。
ksen_Sang 发表于 2025-6-10 16:15
麻烦您帮忙看看前面的函数是否有问题?目前用的单片机型号 STC8H1K08T 产品很快要量产,客户追的比较急。...
1L明显点的问题是:
1.切换XFR访问 ,这个建议main函数里打开就不要动了
新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读! - 老鸟反刍/吐槽,新手乐园,毕业设计 国芯技术交流网站 - AI32位8051交流社区
2.没有等待时钟稳定操作和RTC配置完成操作
可参考官网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寄存器初始化
} 目前通过一些标记测试(在RTC秒中断服务函数内放了LED 取反的指示),在二次调用RTC Config() 后程序不能跑主循环,但秒中断还是能正常运行,LED还是每秒改变一次状态,但主程序循环中不跑(也放了个取反LED的指示)。上电初始化后,两个LED都闪烁,但再次调用RTC Config() 后,就只有RTC 秒中断的LED闪烁,麻烦帮定位一下可能的问题根源,感谢! 用最新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