找回密码
 立即注册
查看: 204|回复: 5

8H8K64U的RTC时钟调用不触发

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

3

主题

9

回帖

35

积分

新手上路

积分
35
发表于 2025-2-21 14:27:26 | 显示全部楼层 |阅读模式
使用官方的范例程序烧录都不触发,串口1没有任何输出。我用的是8H8K64U GD,D版本的,应该是有RTC时钟的。

而且本来串口能正常输出的,现在调用RTC后就没有任何输出了

截图202502211426478825.jpg

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

#define MAIN_Fosc        11095200
#define BRT        115200
#define        TM        (65536-(MAIN_Fosc/BRT/4))

#define MAX        64        

bit B1S_Flag;

bit busy;
bit busy2;
bit busy3;
unsigned char wptr;
unsigned char rptr;
unsigned char wptr2;
unsigned char rptr2;
unsigned char wptr3;
unsigned char rptr3;
xdata unsigned char buffer[MAX];
xdata unsigned char buffer2[MAX];
xdata unsigned char buffer3[MAX];


void Delay1000ms(void)        //@11.0592MHz
{
        unsigned char data i, j, k;

        _nop_();
        _nop_();
        i = 43;
        j = 6;
        k = 203;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void UartIsr() interrupt 4
{
        if(TI)        //发送
        {
                TI=0;
                busy=0;
        }
        if(RI)
        {
                RI=0;
                buffer[wptr++]=SBUF;
                if(wptr>=(MAX))        wptr=0;
        }
}

void UartInit()
{
  SCON=0x50;
  TMOD=0x00;
  TL1=BRT;
  TH1=BRT>>8;
  TR1=1;
  AUXR=0x15;
  wptr=0x00;
  rptr=0x00;
      
  S2CON=0x10;
  TL2=BRT;
  TH2=BRT>>8;
  wptr2=0x00;
  rptr2=0x00;
        
        S3CON=0x10;
        TL3=BRT;
        TH3=BRT>>8;
        //AUXR=0x14;
        wptr3=0x00;
        rptr3=0x00;
        
  busy=0;
        busy2=0;
        busy3=0;
}
/*
void UartIsr() interrupt 4
{
        if(TI)        //发送
        {
                TI=0;
                busy=0;
        }
        if(RI)
        {
                RI=0;
                buffer[wptr++]=SBUF;
                if(wptr>=(MAX))        wptr=0;
        }
}
*/

void RTC_config(void);

/*

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

void UartSend(char dat)
{
        while(busy);
        busy=1;
        SBUF=dat;
}

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

void UartSendStr(char *p)
{
        int i=0;
        int l=strlen(p);
        //UartSendStr("\n--------rsend--------\n");
        //UartSendStr(p);
        for(i=0;i<=(l-1);i++)
        {
                UartSend(p);
        }
}

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

void RTC_Isr()        interrupt 13
{
        char store;
        
        store=P_SW2;
        P_SW2|=0x80;
        
        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;
        
        UartInit();
        RTC_config();
        EA=1;
        Delay1000ms();
        Delay1000ms();
        Delay1000ms();
        UartSendStr("1RTC Test Programme!\r\n");
        printf("2RTC Test Programme!\r\n");
        
        while(1)
        {
                char yearStr[5];  // 足够存储两位年份
                yearStr[0] = (YEAR / 10) + '0';  // 十位
                yearStr[1] = (YEAR % 10) + '0';  // 个位
                yearStr[2] = '\0';
                UartSendStr("1RTC Test Programme!\r\n");
               
                if(B1S_Flag)
                {
                        B1S_Flag=0;
                        P_SW2|=0x80;
                        
                        UartSendStr(yearStr);
                        printf("Year=20%bd",YEAR);
                        printf("\r\n");
                }
                Delay1000ms();
        }
}

void RTC_config(void)
{
        P_SW2|=0x80;
        while(!(IRC32KCR&0x01));
        RTCCFG|=0x02;
        
        INIYEAR=25;
        INIMONTH=12;
        INIDAY=31;
        INIHOUR=23;
        INIMIN=59;
        INISEC=50;
        INISSEC=0;
        RTCCFG|=0x01;
        
        RTCIF=0;
        RTCIEN=0x08;
        RTCCR=0x01;
        P_SW2&=~0x80;
}
        




回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:424
  • 最近打卡:2025-05-02 14:37:11
已绑定手机

77

主题

4849

回帖

8382

积分

超级版主

DebugLab

积分
8382
发表于 2025-2-21 14:50:02 | 显示全部楼层
RTC中断是否正常跳转
打开的中断必须要有中断函数
借用中断13必须保证正常跳转
打开RTC必须使用外部32768Hz晶振,晶振IO必须设置为高阻,并在初始化打开晶振后等待时钟稳定(内部32K仅供测试,看秒钟在走表示RTC正常工作,没有准确度,不建议实际运行使用)

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-2-21 14:52:02 | 显示全部楼层

几个疑问,,

1.为啥你选择24M下载程序,而你的宏定义MAIN_Fosc 11095200 ?
2.看你这里中断是借用13号中断,但是你没有给出你的isr.asm里面的代码,是否正确使用了13号中断?
3.看起来你想用内部的低速IRC作为RTC的时钟,但是代码里好像没有看到你开启低速IRC时钟的代码...

参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2025-2-21 15:30:00 | 显示全部楼层
RTC和串口没有任何关系,串口卡死是串口代码的问题,即使RTC不启动也不会影响串口操作。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-02 00:29:54

10

主题

1159

回帖

5121

积分

论坛元老

积分
5121
发表于 2025-2-21 17:11:45 | 显示全部楼层
少了这个。

;isr.asm

        CSEG        AT        011BH                ;35号 触摸按键 中断入口
        LJMP        006BH                        ;跳转到中断号13的向量
        
        CSEG    AT  0123H           ;36号 RTC_VECTOR
    LJMP     006BH                        ;跳转到中断号13的向量
        END
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:400
  • 最近打卡:2025-05-02 00:11:26

2

主题

170

回帖

200

积分

中级会员

积分
200
发表于 2025-3-11 00:15:18 来自手机 | 显示全部楼层
好像没有外部晶振无法工作吧?我用开天斧好像没有成功…看手册得上外部晶振…
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 20:27 , Processed in 0.122788 second(s), 85 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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