找回密码
 立即注册
查看: 141|回复: 0

STC8H4K64TL的RTC和触摸同时开启32.768K晶振波形不对

[复制链接]
  • TA的每日心情
    开心
    2024-4-20 10:39
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    2

    主题

    1

    回帖

    106

    积分

    注册会员

    积分
    106
    发表于 2023-12-25 10:22:48 | 显示全部楼层 |阅读模式
    STC8H4K64TL需要RTC和触摸同时开启,下图是同时开启RTC和触摸的 发现32.768K晶振输出的波形有个70Hz的尖峰脉冲,导致波形的频率不是32.768K,使得RTC走时不精确,实测600分钟慢了6分钟左右

    截图202312251003184940.jpg

    下图是开启RTC、不开启触摸,此时波形就很正常,晶振输出的频率就很准 32.768K

    截图202312251017404102.jpg

    不知道为什么会这样,起振电容为12PF(10-20PF都试了)触摸的参考电容为47PF
    下面是我触摸的初始化程序

    void TSU_Init()
    {
        P_SW2 |= 0x80;          //允许访问XSF
        TSRT = 0x00;            //没有LED分时扫描
        TSCHEN1 = 0x00;         //使能TK07~TK00
        TSCHEN2 = 0xF0;         //使能TK15~TK08
        TSCFG1  = (7<<4) + 7;   //开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1)), 放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
        TSCFG2  = 7;            //配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
        TSCTRL  = 0x90;
        IE2 |= 0x80;            //使能触摸中断
    }

    下面是我RTC的初始化和设置程序


    void RTC_Init()//RTC初始化函数
    {
        P_SW2 |= 0x80;//SFR enable   
        P1M0=0x00;
        P1M1=0x00+1<<7+1<<6;//P1.6 P1.7设置为高阻输入
        P1IE = ~0xC0;//P1.6 P1.7关闭数字输入功能
        X32KCR = 0x80 + 0x40;//启动外部32K晶振, 低增益+0x00, 高增益+0x40.
        while(!(X32KCR&0x01));//等待外部晶振稳定
        RTCIEN  = 0x08|0x04; //中断使能, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
        RTCIF   = 0x00;    //中断标志, 0x80:闹钟中断, 0x40:日中
    }


    void RTC_Set(int year,char month,char day,char hour,char minute,char second)//设置RTC时间函数
    {
        RTCCR = 0x01;//使能RTC, 并开始RTC计数
        if(year>2099)   year=2099;
        if(month==0)    month=1;
        if(month>12)    month=12;
        if(day==0)      day=1;
        if(day>31)      day=31;
        if(hour>23)     hour=23;
        if(minute>59)   minute=59;
        if(second>59)   second=59;
        INIYEAR  = year-2000;
        INIMONTH = month;
        INIDAY   = day;
        INIHOUR  = hour;
        INIMIN   = minute;
        INISEC   = second;
        INISSEC  = 0;
        RTCCFG = 0x01 | 0x00;//设置RTC时间, |0x00:选择外部32K时钟, |0x02:选择内部32K时钟.  
        while(RTCCFG & 0x01);//等待初始化完成. 设置RTC时间需要32768Hz的1个周期时间,大约30.5us. 由于同步, 所以实际等待时间是0~30.5us.
                              //如果不等待设置完成就睡眠, 则RTC会由于设置没完成, 停止计数, 唤醒后才继续完成设置并继续计数.
    }



    如果各位大佬有遇到类似的情况,欢迎指导 谢谢!!!!



    回复 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-14 10:33 , Processed in 0.099582 second(s), 31 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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