找回密码
 立即注册
查看: 62|回复: 14

RTC使用外部晶振的问题 | 已解决

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-07 17:15:49
已绑定手机

2

主题

11

回帖

62

积分

注册会员

积分
62
发表于 前天 14:08 | 显示全部楼层 |阅读模式
求大佬帮助!在使用芯片STC8H1K08T作为主控的情况下,使用外部32.768K的晶振无法启动RTC,一直卡在while (!(X32KCR & 0x01) && timeout--) 的循环部分无法启动成功,选用的晶振匹配电容试过:20pf,15pf,12pf。三个均不行
程序功能是先初始化RTC,然后使用STCISP获取实时时间写入RTC中(目前启动RTC晶振出现问题所以后面的功能还未实现)下面是代码:


#include "STC8H.h"

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

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

#define MAIN_Fosc        22118400L   //定义主时钟(精确计算115200波特率)
//#define UART1_BUF_LENGTH    128
#define  P1_MODE_IO_PU(Pin)                                P1M1 &= ~(Pin), P1M0 &= ~(Pin);
#define  P3_MODE_IO_PU(Pin)                                P3M1 &= ~(Pin), P3M0 &= ~(Pin);
#define  P1_MODE_IN_HIZ(Pin)                        P1M1 |= (Pin), P1M0 &= ~(Pin);


/*************  本地变量声明    **************/

u8  TX1_Cnt;    //发送计数
u8  RX1_Cnt;    //接收计数
bit B_TX1_Busy; //发送忙标志

//u8  RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲


char code *STCRTC  = "@STCRTC#";    //= "@STCRTC#";  命令头   
char indexrtc=0;                    //当前的命令头索引
char length =0;                     //长度
char rtctime[12] ;               //rtc时间数据
bit  Rec_OK = 0;                    //rtc时间获取完成标志

bit B_1S;
bit B_Alarm;

/****************  RTC初始化函数 *****************/
void RTC_config(void)
{
  u16 timeout = 10000;
  
  X32KCR = 0xc0; // 启动外部32K晶振
  
  while (!(X32KCR & 0x01) && timeout--)
    _nop_();
  
  if(!(X32KCR & 0x01)) {
    printf("X32K Fail! Status: %02x\n", X32KCR);
  }
  
  RTCCFG &= ~0x02; // 选择外部32K时钟源
  INIYEAR = 24;    // 初始化时间
  INIMONTH = 12;
  INIDAY = 31;
  INIHOUR = 23;
  INIMIN = 59;
  INISEC = 50;
  INISSEC = 0;
  
  RTCCFG |= 0x01;  // 触发初始化
  timeout = 10000;
  while((RTCCFG & 0x01) && timeout--)
    _nop_();
  
  if(RTCCFG & 0x01) {
    printf("RTC Init Timeout!\n");
  }
  
  RTCIF = 0;       // 清中断标志
  RTCIEN = 0x08;   // 使能秒中断
  RTCCR = 0x01;    // 使能RTC
  
  printf("RTC Init Done. Status: %02x\n", RTCCR);
}

char putchar(char dat)
{
        B_TX1_Busy = 1;                        //标志发送忙
        SBUF = dat;                                        //发一个字节
        while(B_TX1_Busy);        //等待发送完成
    return dat;
}  

void Uart1_Init(void)        //115200bps@24.000MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器时钟1T模式
        T2L = 0xCC;                        //设置定时初始值
        T2H = 0xFF;                        //设置定时初始值
        AUXR |= 0x10;                //定时器2开始计时
        ES = 1;                                //使能串口1中断
}


void main(void)
{
        EAXSFR();
        EA = 1;
        P1_MODE_IO_PU(0x80 | 0x40);//P16、P17用于外部晶振
        P3_MODE_IO_PU(0x00 | 0x01);//P30、P31用于串口
        Uart1_Init();
        RTC_config();
//        EA = 1;
        
        while(1)
        {
                if(B_1S)
                {
                                B_1S = 0;
                                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");
                }
        }
        
}


void UART1_int (void) interrupt 4
{
    u8 dat;
    if(RI)
    {
        RI = 0;
        dat = SBUF;
//        RX1_Buffer[RX1_Cnt] = SBUF;
//        if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0;
//-------------------------------串口RTC对时 -------------------------------   
        if( length>0 )
        {     
            rtctime[length-1]=dat;
            length++;
            if( length>=12 )
            {
                length = 0;
                Rec_OK = 1;
                indexrtc=0;
            }
        }        
        if (dat == STCRTC[ indexrtc])
        {
            indexrtc++;
            if(STCRTC[indexrtc] == '\0')
            {
                length = 1;   //开启接收
                indexrtc=0;
            }
        }
        else
        {
            indexrtc = 0;
            if (dat ==STCRTC[ indexrtc])
                indexrtc++;
        }         
    }

    if(TI)
    {
        TI = 0;
        B_TX1_Busy = 0;
    }
}


void RTC_ISR_Handler (void) interrupt 13//RTC_VECTOR
{
        // TODO: 在此处添加用户代码
        if(RTCIF & 0x80)    //闹钟中断
        {
                P01 = !P01;
                RTCIF &= ~0x80;
                B_Alarm = 1;
        }

        if(RTCIF & 0x08)    //秒中断
        {
                P00 = !P00;
                RTCIF &= ~0x08;
                B_1S = 1;
        }
}
main.c (3.88 KB, 下载次数: 0)


原理图部分

原理图部分


PCB部分

PCB部分





main.c

3.88 KB, 下载次数: 0

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-07 17:15:49
已绑定手机

2

主题

11

回帖

62

积分

注册会员

积分
62
发表于 前天 14:10 | 显示全部楼层
求大佬解答
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:485
  • 最近打卡:2025-08-08 08:56:29
已绑定手机

44

主题

2146

回帖

7471

积分

论坛元老

积分
7471
发表于 前天 14:41 | 显示全部楼层
直接烧录8H实验箱例程包例子到芯片里试试:50-内部RTC时钟程序
下载时, 选择时钟 24MHz,串口大于RTC时钟信息。
实验箱例程包下载地址:https://www.stcai.com/syx

如果还是不起振的话,先排查板子有没有虚焊或者短路,没有的话换个晶振试试。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-07 17:15:49
已绑定手机

2

主题

11

回帖

62

积分

注册会员

积分
62
发表于 前天 15:03 | 显示全部楼层
乘风*** 发表于 2025-8-6 14:41
直接烧录8H实验箱例程包例子到芯片里试试:50-内部RTC时钟程序
下载时, 选择时钟 24MHz,串口大于RTC时钟信 ...

我直接使用的试验箱的程序,还是不起振,打算换个晶振再试一试。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-08-08 08:05:56
已绑定手机

86

主题

5861

回帖

1万

积分

超级版主

DebugLab

积分
10561
发表于 前天 15:11 | 显示全部楼层
晶振IO设置为高阻
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-07 17:15:49
已绑定手机

2

主题

11

回帖

62

积分

注册会员

积分
62
发表于 前天 15:29 | 显示全部楼层
Debu*** 发表于 2025-8-6 15:11
晶振IO设置为高阻

还是不行,无法起振。目前程序:
  1. #include "STC8H.h"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. typedef         unsigned char        u8;
  5. typedef         unsigned int        u16;
  6. typedef         unsigned long        u32;
  7. #define MAIN_Fosc        22118400L   //定义主时钟(精确计算115200波特率)
  8. //#define UART1_BUF_LENGTH    128
  9. #define  P1_MODE_IO_PU(Pin)                                P1M1 &= ~(Pin), P1M0 &= ~(Pin);
  10. #define  P3_MODE_IO_PU(Pin)                                P3M1 &= ~(Pin), P3M0 &= ~(Pin);
  11. #define  P1_MODE_IN_HIZ(Pin)                        P1M1 |= (Pin), P1M0 &= ~(Pin);
  12. /*************  本地变量声明    **************/
  13. u8  TX1_Cnt;    //发送计数
  14. u8  RX1_Cnt;    //接收计数
  15. bit B_TX1_Busy; //发送忙标志
  16. //u8  RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
  17. char code *STCRTC  = "@STCRTC#";    //= "@STCRTC#";  命令头   
  18. char indexrtc=0;                    //当前的命令头索引
  19. char length =0;                     //长度
  20. char rtctime[12] ;               //rtc时间数据
  21. bit  Rec_OK = 0;                    //rtc时间获取完成标志
  22. bit B_1S;
  23. bit B_Alarm;
  24. ///****************  RTC初始化函数 *****************/
  25. //void RTC_config(void)
  26. //{
  27. //  u16 timeout = 10000;
  28. //  
  29. ////  X32KCR = 0xc0; // 启动外部32K晶振
  30. ////  
  31. ////  while (!(X32KCR & 0x01) && timeout--)
  32. ////    _nop_();
  33. ////  
  34. ////  if(!(X32KCR & 0x01)) {
  35. ////    printf("X32K Fail! Status: %02x\n", X32KCR);
  36. ////  }
  37. //        INIYEAR = 24;    // 初始化时间
  38. //  INIMONTH = 12;
  39. //  INIDAY = 31;
  40. //  INIHOUR = 23;
  41. //  INIMIN = 59;
  42. //  INISEC = 50;
  43. //  INISSEC = 0;
  44. //       
  45. //        IRC32KCR = 0x80;   //启动内部32K晶振.
  46. //        while (!(IRC32KCR & 1) && timeout--)  //等待时钟稳定
  47. //                 _nop_();
  48. //  if(!(IRC32KCR & 0x01)) {
  49. //    printf("IRC32K Fail! Status: %02x\n", IRC32KCR);
  50. //  }
  51. //  RTCCFG = 0x03;    //选择内部32K时钟源,触发RTC寄存器初始化
  52. //       
  53. //        RTCIF = 0;       // 清中断标志
  54. //       
  55. //  RTCCR = 0x01;    // 使能RTC
  56. //       
  57. //  timeout = 10000;
  58. //  while((RTCCFG & 0x01) && timeout--)
  59. //    _nop_();
  60. //  
  61. //  if(RTCCFG & 0x01) {
  62. //    printf("RTC Init Timeout!\n");
  63. //  }
  64. //       
  65. //  printf("RTC Init Done. Status: %02x\n", RTCCR);
  66. //       
  67. //  RTCIEN = 0x08;   // 使能秒中断
  68. //}
  69. /****************  RTC初始化函数 *****************/
  70. void RTC_config(void)
  71. {
  72.   u16 timeout = 10000;
  73.   
  74.   X32KCR = 0xc0; // 启动外部32K晶振
  75.   
  76.   while (!(X32KCR & 0x01) && timeout--)
  77.     _nop_();
  78.   
  79.   if(!(X32KCR & 0x01)) {
  80.     printf("X32K Fail! Status: %02x\n", X32KCR);
  81.   }
  82.   
  83.   RTCCFG &= ~0x02; // 选择外部32K时钟源
  84.   INIYEAR = 24;    // 初始化时间
  85.   INIMONTH = 12;
  86.   INIDAY = 31;
  87.   INIHOUR = 23;
  88.   INIMIN = 59;
  89.   INISEC = 50;
  90.   INISSEC = 0;
  91.   
  92.   RTCCFG |= 0x01;  // 触发初始化
  93.   timeout = 10000;
  94.   while((RTCCFG & 0x01) && timeout--)
  95.     _nop_();
  96.   
  97.   if(RTCCFG & 0x01) {
  98.     printf("RTC Init Timeout!\n");
  99.   }
  100.   
  101.   RTCIF = 0;       // 清中断标志
  102.   RTCIEN = 0x08;   // 使能秒中断
  103.   RTCCR = 0x01;    // 使能RTC
  104.   
  105.   printf("RTC Init Done. Status: %02x\n", RTCCR);
  106. }
  107. char putchar(char dat)
  108. {
  109.         B_TX1_Busy = 1;                        //标志发送忙
  110.         SBUF = dat;                                        //发一个字节
  111.         while(B_TX1_Busy);        //等待发送完成
  112.     return dat;
  113. }  
  114. void Uart1_Init(void)        //115200bps@24.000MHz
  115. {
  116.         SCON = 0x50;                //8位数据,可变波特率
  117.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  118.         AUXR |= 0x04;                //定时器时钟1T模式
  119.         T2L = 0xCC;                        //设置定时初始值
  120.         T2H = 0xFF;                        //设置定时初始值
  121.         AUXR |= 0x10;                //定时器2开始计时
  122.         ES = 1;                                //使能串口1中断
  123. }
  124. void main(void)
  125. {
  126.         EAXSFR();
  127.         EA = 1;
  128.         P1_MODE_IN_HIZ(0x80 | 0x40);//P16、P17用于外部晶振
  129.         P3_MODE_IO_PU(0x00 | 0x01);//P30、P31用于串口
  130.         Uart1_Init();
  131.         RTC_config();
  132. //        EA = 1;
  133.        
  134.         while(1)
  135.         {
  136.                 if(B_1S)
  137.                 {
  138.                                 B_1S = 0;
  139.                                 printf("Year=20%bd ", YEAR);
  140.                                 printf("Month=%bd ", MONTH);
  141.                                 printf("Day=%bd ", DAY);
  142.                                 printf("Hour=%bd ", HOUR);
  143.                                 printf("Minute=%bd ", MIN);
  144.                                 printf("Second=%bd ", SEC);
  145.                                 printf("\r\n");
  146.                 }
  147.                
  148.                 if(Rec_OK == 1)
  149.                 {
  150. //                                // 禁用RTC以安全更新参数
  151. //                                RTCCR = 0x00;     //RTC关闭
  152. //                                YEAR = rtctime[1];     //Y:2021            //单片机内部rtc时钟初始化的办法
  153. //                                MONTH = rtctime[2];    //M:12
  154. //                                DAY = rtctime[3];      //D:31
  155. //                                HOUR = rtctime[5];     //H:23
  156. //                                MIN =rtctime[6];      //M:59
  157. //                                SEC = rtctime[7];      //S:50
  158. //                                SSEC = rtctime[8];      //S/128:0
  159. //                                RTCCR = 0x01;     //RTC使能
  160.                                
  161.                                 Rec_OK = 0;
  162.                                 printf("%02d%02dyear %dmon %dday\t",(int)rtctime[0],(int)rtctime[1],(int)rtctime[2],(int)rtctime[3]);
  163.                                 printf("%d:%d:%d.%d\t",(int)rtctime[5],(int)rtctime[6],(int)rtctime[7],(int)((u16)(rtctime[9]*256)|(u8)rtctime[10]));
  164.                                 printf("%d\r\n",(int)rtctime[8]);
  165.                 }
  166.         }
  167.        
  168. }
  169. void UART1_int (void) interrupt 4
  170. {
  171.     u8 dat;
  172.     if(RI)
  173.     {
  174.         RI = 0;
  175.         dat = SBUF;
  176. //        RX1_Buffer[RX1_Cnt] = SBUF;
  177. //        if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0;
  178. //-------------------------------串口RTC对时 -------------------------------   
  179.         if( length>0 )
  180.         {     
  181.             rtctime[length-1]=dat;
  182.             length++;
  183.             if( length>=12 )
  184.             {
  185.                 length = 0;
  186.                 Rec_OK = 1;
  187.                 indexrtc=0;
  188.             }
  189.         }        
  190.         if (dat == STCRTC[ indexrtc])
  191.         {
  192.             indexrtc++;
  193.             if(STCRTC[indexrtc] == '\0')
  194.             {
  195.                 length = 1;   //开启接收
  196.                 indexrtc=0;
  197.             }
  198.         }
  199.         else
  200.         {
  201.             indexrtc = 0;
  202.             if (dat ==STCRTC[ indexrtc])
  203.                 indexrtc++;
  204.         }         
  205.     }
  206.     if(TI)
  207.     {
  208.         TI = 0;
  209.         B_TX1_Busy = 0;
  210.     }
  211. }
  212. void RTC_ISR_Handler (void) interrupt 13//RTC_VECTOR
  213. {
  214.         // TODO: 在此处添加用户代码
  215.         if(RTCIF & 0x80)    //闹钟中断
  216.         {
  217.                 P01 = !P01;
  218.                 RTCIF &= ~0x80;
  219.                 B_Alarm = 1;
  220.         }
  221.         if(RTCIF & 0x08)    //秒中断
  222.         {
  223.                 P00 = !P00;
  224.                 RTCIF &= ~0x08;
  225.                 B_1S = 1;
  226.         }
  227. }
复制代码

点评

测试正常的程序: 串口对时,命令头01 0B [attachimg]110819[/attachimg]  详情 回复 发表于 前天 16:27
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-07 17:15:49
已绑定手机

2

主题

11

回帖

62

积分

注册会员

积分
62
发表于 前天 15:30 | 显示全部楼层
目前使用的晶振为晶振链接
晶振.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-08-08 08:05:56
已绑定手机

86

主题

5861

回帖

1万

积分

超级版主

DebugLab

积分
10561
发表于 前天 16:27 | 显示全部楼层
ccc*** 发表于 2025-8-6 15:29
还是不行,无法起振。目前程序:

测试正常的程序:
基于以下串口程序:
https://www.stcaimcu.com/thread-16321-1-1.html
串口对时,命令头01 0B

截图202508061626041037.jpg
  1. #include <AI8H.H>
  2. #include <intrins.h>
  3. #include <absacc.h>
  4. #include <string.h>
  5. #include <stdarg.h>
  6. #include <stdio.h>
  7. #include <math.h>
  8. #define                FOSC                        24000000UL                                        //主时钟
  9. #define                BAUD                        9600UL                                                //波特率
  10. #define                TMRF                        200UL                                                //定时器频率
  11. #define                BRT                                (0x10000-(FOSC/BAUD+2)/4)        //波特率发生器值
  12. #define                TMR                                (0x10000-FOSC/TMRF/12)                //定时器值
  13. #define                T_Buf_Len                64                                                        //Uart1发送缓存长度
  14. #define                R_Buf_Len                64                                                        //Uart1接收缓存长度
  15. unsigned char                RP;                                        //Uart1接收指针
  16. unsigned char                TP;                                        //Uart1发送指针
  17. unsigned char                Uart_R_Len;                        //Uart1接收长度
  18. unsigned char                Uart_T_Len;                        //Uart1发送长度
  19. unsigned char xdata        R_Buf[R_Buf_Len];        //Uart1接收缓存
  20. unsigned char xdata        T_Buf[T_Buf_Len];        //Uart1发送缓存
  21. bit RTC_1s_Flag;
  22. void Delay_ms(unsigned char ms)
  23. {
  24.         unsigned int i;
  25.         do
  26.         {
  27.                 i=FOSC/10000;
  28.                 while(--i);        //10T per loop
  29.         }
  30.         while(--ms);
  31. }
  32. void UART_Send(unsigned int x)
  33. {
  34.         while(Uart_T_Len);
  35.         TP=0;
  36.         Uart_T_Len=x;
  37.         TI=1;
  38. }
  39. void Uart_Printf(unsigned char *v,...)
  40. {
  41.         va_list ap;
  42.         va_start(ap,v);
  43.         while(Uart_T_Len);
  44.         UART_Send(vsprintf(T_Buf,v,ap));
  45.         va_end(ap);
  46. }
  47. void Init(void)
  48. {
  49.         P_SW2|=EAXFR;
  50.         
  51.         P0M1=0x00;        P0M0=0x00;        //设置IO模式
  52.         P1M1=0xC0;        P1M0=0x00;        //设置IO模式
  53.         P2M1=0x00;        P2M0=0x00;        //设置IO模式
  54.         P3M1=0x00;        P3M0=0x00;        //设置IO模式
  55.         P4M1=0x00;        P4M0=0x00;        //设置IO模式
  56.         P5M1=0x00;        P5M0=0x00;        //设置IO模式
  57.         P6M1=0x00;        P6M0=0x00;        //设置IO模式
  58.         P7M1=0x00;        P7M0=0x00;        //设置IO模式
  59.         
  60.         X32KCR=0x80;                        //启动外部32.768KHz晶振
  61.         while(!(X32KCR&0x01));        //等待外部32.768KHz晶振稳定
  62.         RTCCFG=0x00;                        //RTC选择外部32.768KHz时钟源
  63.         
  64.         AUXR=0x05;                //设置定时器0时钟为12T模式,设置定时器2为1T模式,设置定时器2为波特率发生器
  65.         TMOD=0x01;                //设置定时器0为16位不自动重装载模式
  66.         TH0=TMR>>8;                //设置定时器0初始值
  67.         TL0=TMR;                //设置定时器0初始值
  68.         TF0=0;                        //清除TF0中断标志位
  69.         ET0=1;                        //启用定时器0中断
  70.         
  71.         SCON=0x50;                //设置UART1模式为8位数据可变波特率
  72.         T2H=BRT>>8;                //设置UART1波特率
  73.         T2L=BRT;                //设置UART1波特率
  74.         AUXR|=T2R;                //打开定时器2
  75.         ES=1;                        //启用UART1中断
  76.         
  77.         INIYEAR                =25;        //初始化年
  78.         INIMONTH        =1;                //初始化月
  79.         INIDAY                =1;                //初始化日
  80.         INIHOUR                =0;                //初始化时
  81.         INIMIN                =0;                //初始化分
  82.         INISEC                =0;                //初始化秒
  83.         INISSEC                =0;                //初始化1/128秒
  84.         INIWEEK                =3;                //初始化星期
  85.         
  86.         RTCCFG|=0x01;                //初始化RTC
  87.         
  88.         RTCIF=0x00;                //清除RTC中断标志
  89.         RTCIEN=0x08;        //启用RTC秒中断
  90.         RTCCR=0x01;                //打开RTC
  91.         
  92.         EA=1;                        //启用总中断
  93. }
  94. void main(void)
  95. {
  96.         Init();
  97.         while(1)
  98.         {
  99.                 if(RTC_1s_Flag)
  100.                 {
  101.                         RTC_1s_Flag=0;
  102.                         Uart_Printf("\r\n\r\n20%02bu/%02bu/%02bu 星期%bu %02bu:%02bu:%02bu\r\n",RTCYEAR,RTCMONTH,RTCDAY,RTCWEEK,RTCHOUR,RTCMIN,RTCSEC);
  103.                 }
  104.                
  105.                 Delay_ms(250);
  106.                 Delay_ms(250);
  107.         }
  108. }
  109. void Uart_Start(void)
  110. {
  111.         TH0=TMR>>8;
  112.         TL0=TMR;
  113.         TR0=1;
  114. }
  115. void Uart_Stop(void)
  116. {
  117.         TR0=0;
  118.         TH0=TMR>>8;
  119.         TL0=TMR;
  120.         RP=0;
  121.         memset(R_Buf,0x00,sizeof R_Buf);
  122. }
  123. void TMR0_Isr(void) interrupt TMR0_VECTOR
  124. {
  125.         Uart_Stop();
  126. }
  127. void UART1_Isr(void) interrupt UART1_VECTOR
  128. {
  129.         if(RI)
  130.         {
  131.                 RI=0;
  132.                 Uart_Start();
  133.                 R_Buf[RP]=SBUF;
  134.                 if(RP==0)
  135.                 {
  136.                         if(R_Buf[0]==0x01)
  137.                         {
  138.                                 
  139.                         }
  140.                         else
  141.                         {
  142.                                 Uart_Stop();
  143.                         }
  144.                 }
  145.                 else if(RP==1)
  146.                 {
  147.                         if(R_Buf[1]==0x0B)
  148.                         {
  149.                                 Uart_R_Len=R_Buf[1]+2;
  150.                         }
  151.                         else
  152.                         {
  153.                                 Uart_Stop();
  154.                         }
  155.                 }
  156.                 else if(RP==Uart_R_Len-1)
  157.                 {
  158.                         INIYEAR=        R_Buf[3];        //初始化年
  159.                         INIMONTH=        R_Buf[4];        //初始化月
  160.                         INIDAY=                R_Buf[5];        //初始化日
  161.                         INIHOUR=        R_Buf[7];        //初始化时
  162.                         INIMIN=                R_Buf[8];        //初始化分
  163.                         INISEC=                R_Buf[9];        //初始化秒
  164.                         INISSEC=        0;                        //初始化1/128秒
  165.                         INIWEEK=        R_Buf[6];        //初始化星期
  166.                         RTCCFG|=0x01;                        //初始化RTC
  167.                         Uart_Stop();
  168.                 }
  169.                 else if(RP==R_Buf_Len-1)
  170.                 {
  171.                         Uart_Stop();
  172.                 }
  173.                 if(TR0)
  174.                 {
  175.                         RP++;
  176.                 }
  177.         }
  178.         if(TI)
  179.         {
  180.                 TI=0;
  181.                 if(TP==Uart_T_Len)
  182.                 {
  183.                         TP=0;
  184.                         Uart_T_Len=0;
  185.                 }
  186.                 if(Uart_T_Len!=0)
  187.                 {
  188.                         SBUF=(T_Buf[TP]);
  189.                         TP++;
  190.                 }
  191.         }
  192. }
  193. void RTC_Isr(void) interrupt RTC_VECTOR
  194. {
  195. //        if(RTCIF&0x80)        //闹钟中断
  196. //        {
  197. //                RTCIF&=~0x80;
  198. //        }
  199. //        if(RTCIF&0x40)        //日中断
  200. //        {
  201. //                RTCIF&=~0x40;
  202. //        }
  203. //        if(RTCIF&0x20)        //时中断
  204. //        {
  205. //                RTCIF&=~0x20;
  206. //        }
  207. //        if(RTCIF&0x10)        //分中断
  208. //        {
  209. //                RTCIF&=~0x10;
  210. //        }
  211.         if(RTCIF&0x08)        //秒中断
  212.         {
  213.                 RTCIF&=~0x08;
  214.                 RTC_1s_Flag=1;
  215.         }
  216. //        if(RTCIF&0x04)        //1/2秒中断
  217. //        {
  218. //                RTCIF&=~0x04;
  219. //        }
  220. //        if(RTCIF&0x02)        //1/8秒中断
  221. //        {
  222. //                RTCIF&=~0x02;
  223. //        }
  224. //        if(RTCIF&0x01)        //1/32秒中断
  225. //        {
  226. //                RTCIF&=~0x01;
  227. //        }
  228. }
复制代码



DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-07 17:15:49
已绑定手机

2

主题

11

回帖

62

积分

注册会员

积分
62
发表于 前天 16:50 | 显示全部楼层
Debu*** 发表于 2025-8-6 16:27
测试正常的程序:
基于以下串口程序:
https://www.stcaimcu.com/thread-16321-1-1.html

我测试还是不行,应该是我硬件选型和设计的问题,晶振有推荐的吗?

点评

2*6mm直插:X206032768KGB2SC 3215贴片:XKXGI-SUA-32.768K 1610贴片:X161032768KGD2SI  详情 回复 发表于 前天 17:25
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-08-08 08:05:56
已绑定手机

86

主题

5861

回帖

1万

积分

超级版主

DebugLab

积分
10561
发表于 前天 17:25 | 显示全部楼层
ccc*** 发表于 2025-8-6 16:50
我测试还是不行,应该是我硬件选型和设计的问题,晶振有推荐的吗?

2*6mm直插:X206032768KGB2SC
3215贴片:XKXGI-SUA-32.768K
1610贴片:X161032768KGD2SI
DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-8 15:32 , Processed in 0.181599 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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