找回密码
 立即注册
查看: 519|回复: 7

【求助】8H内部32K时钟误差问题 | 用外部32768RTC晶振

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:109
  • 最近打卡:2025-02-12 18:01:31

6

主题

27

回帖

520

积分

高级会员

积分
520
发表于 2024-12-8 20:57:15 | 显示全部楼层 |阅读模式

使用的代码是我从ai-isp中下的,修改了一点(设置时钟为内部高精度IRC、启用内部32K低速IRC)

测试下来一分钟差了10秒左右,各位大佬能帮忙想想办法吗

#include "STC8H.h"
#include "intrins.h"
#include "stdio.h"


sfr     TH2     =   0xD6;
sfr     TL2     =   0xD7;


#define MAIN_Fosc   22118400L
#define Baudrate    115200L
#define TM          (65536 -(MAIN_Fosc/Baudrate/4))

bit B1S_Flag;

void RTC_config(void);


void Delay100ms(void)	//@24.000MHz
{
	unsigned char data i, j, k;

	_nop_();
	_nop_();
	i = 13;
	j = 45;
	k = 214;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void UartInit(void)
{
    SCON = (SCON & 0x3f) | 0x40;
    TL2  = TM;
    TH2  = TM>>8;
    AUXR |= 0x15;
}

void UartPutc(unsigned char dat)
{
    SBUF = dat;
    while(TI==0);
    TI = 0;
}

char putchar(char c)
{
    UartPutc(c);
    return c;
}

void RTC_Isr() interrupt 13
{
    char store;

    store = P_SW2;
    P_SW2 |= 0x80;                              //使能XFR访问

    if(RTCIF & 0x08)                            //判断是否秒中断
    {
        RTCIF &= ~0x08;                         //清中断标志
        B1S_Flag = 1;
    }

    P_SW2 = store;
}

void main(void)
{
    P0M1 = 0;   P0M0 = 0;                       //设置为准双向口
    P1M1 = 0;   P1M0 = 0;                       //设置为准双向口
    P2M1 = 0;   P2M0 = 0;                       //设置为准双向口
    P3M1 = 0;   P3M0 = 0;                       //设置为准双向口
    P4M1 = 0;   P4M0 = 0;                       //设置为准双向口
    P5M1 = 0;   P5M0 = 0;                       //设置为准双向口
    P_SW2 |= 0x80;                              //使能XFR访问

    UartInit();
  X32KCR=0x00;
  HIRCCR|=0xff;
 //  while(HIRCCR&0x01);
  IRC32KCR|=0xff;
  while(IRC32KCR&0x01);
  Delay100ms();  
    RTC_config();
    EA = 1;
    printf("STC8H4K64TLR RTC Test Programme!\r\n"); //UART发送一个字符串

    while (1)
    {
        if(B1S_Flag)
        {
            B1S_Flag = 0;
            P_SW2 |= 0x80;                      //使能XFR访问

            printf("Year=20%bd  ", YEAR);
            printf("Month=%bd  ", MONTH);
            printf("Day=%bd  ", DAY);
            printf("Hour=%bd  ", HOUR);
            printf("Minute=%bd  ", MIN);
            printf("Second=%bd  ", SEC);
            printf("\r\n");

            P_SW2 &= ~0x80;                     //禁止XFR访问
        }
    }
}

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
    RTCCFG |= 0xff;                             //触发RTC寄存器初始化

    RTCIF = 0;                                  //清中断标志
    RTCIEN = 0x08;                              //使能RTC秒中断
    RTCCR = 0x01;                               // RTC使能
   // P_SW2 &= ~0x80;                             //禁止XFR访问
}

/*

;将以下代码保存为ASM格式文件,一起加载到项目里,例如:isr.asm

    CSEG    AT  0123H
    JMP     006BH
    END

*/


回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:109
  • 最近打卡:2025-02-12 18:01:31

6

主题

27

回帖

520

积分

高级会员

积分
520
发表于 2024-12-8 20:59:36 | 显示全部楼层

顶一下dizzy

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-12-8 21:40:40 | 显示全部楼层
内部32K

正常的
作为掉电唤醒定时器
低功耗
无抗温飘压飘电路
无校准
制造误差大
正常
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-12-8 21:42:48 | 显示全部楼层
RTC想误差小必须用外部32768Hz晶振
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:434
  • 最近打卡:2025-05-01 20:16:58
已绑定手机

229

主题

328

回帖

1471

积分

金牌会员

积分
1471
发表于 2024-12-9 07:35:49 | 显示全部楼层
下载程序的时候能看到内部32K时钟的实际频率,差不多有35KHZ,你可以做一个误差纠正,每隔1分钟纠正一次
就算你使用外部32k高精度时钟源那也是有误差的,这个误差通过纠正后效果是非常好的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-12-9 08:06:56 | 显示全部楼层

想做电子钟用或需要相对准确的场合,请使用外部晶振吧。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:109
  • 最近打卡:2025-02-12 18:01:31

6

主题

27

回帖

520

积分

高级会员

积分
520
发表于 2024-12-9 21:11:17 | 显示全部楼层

shuai STC啥时能出个内置带温补晶振的片子

点评

内部高速时钟就是带温补的。  详情 回复 发表于 2024-12-10 22:21
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-12-10 22:21:24 | 显示全部楼层
gqz*** 发表于 2024-12-9 21:11
STC啥时能出个内置带温补晶振的片子

内部高速时钟就是带温补的。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:56 , Processed in 0.129736 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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