找回密码
 立即注册
查看: 423|回复: 8

求助8H8K64U版本识别及问题

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:511
  • 最近打卡:2025-06-17 10:39:32

46

主题

232

回帖

3093

积分

论坛元老

积分
3093
发表于 2025-2-5 11:02:26 | 显示全部楼层 |阅读模式
最近使用8H8K64U 做了一个温湿度计,想使用硬件RTC功能。
当时芯片是积分兑换的,没有注意版本,仔细看芯片最后一行最小的字母,最后两个是HD, 不是到是不是D版本的。

软件是使用keil。
RTOS使用的是CosyOs。
现象:
在初始化钩子中未添加RTC相关初始化代码时能正常工作,任务管理器也工作正常;
在初始化钩子中缇娜家了RTC相关初始化代码后就不能正常工作了,具体时停留在一个欢迎界面,任务管理器也不能正常工作;

在欢迎界面的退出部分添加了点亮一个指示灯。指示灯也能点亮。就是页面不切换, 任务管理器也不能正常工作。

不争是争
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:91
  • 最近打卡:2025-06-16 09:57:09

14

主题

93

回帖

1090

积分

版主

积分
1090
发表于 2025-2-5 11:12:12 | 显示全部楼层
您好,正看芯片丝印最下面一行最后一个字母为芯片版本号
截图202502051112567953.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-06-17 09:09:48
已绑定手机

79

主题

5137

回帖

9134

积分

超级版主

DebugLab

积分
9134
发表于 2025-2-5 12:58:09 | 显示全部楼层
是D版
DebugLab
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:511
  • 最近打卡:2025-06-17 10:39:32

46

主题

232

回帖

3093

积分

论坛元老

积分
3093
发表于 2025-2-5 15:43:58 | 显示全部楼层

那就是可以使用硬件RTC了。
我初始化设置使用内部32K,
按照试验箱的例程初始化,导致RTOS不工作了。
不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:511
  • 最近打卡:2025-06-17 10:39:32

46

主题

232

回帖

3093

积分

论坛元老

积分
3093
发表于 2025-2-5 23:47:19 | 显示全部楼层
麻烦哪位大佬帮忙看下这个程序有什么问题吗?
现象是,按一下复位键,串口打印信息:

[23:44:20.004]接收←.
[23:44:20.379]接收←Second=0
                    
[23:44:21.567]接收←
                    彊0欭聶"..稿.$.鮽?

然后就一直不打印任何信息了。

  1. #include "STC8H.H"
  2. #include "stdio.h"
  3. #define     MAIN_Fosc       24000000L   //定义主时钟
  4. typedef     unsigned char   u8;
  5. typedef     unsigned int    u16;
  6. typedef     unsigned long   u32;
  7. #define Baudrate      115200L
  8. #define TM            (65536 -(MAIN_Fosc/Baudrate/4))
  9. #define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒
  10. u8 B_1s;
  11. void RTC_config(void);
  12. /******************** 串口打印函数 ********************/
  13. void UartInit(void)
  14. {
  15.         SCON = (SCON & 0x3f) | 0x40;  // 00xx xxxx | 0100 0000 = 01xx xxxx
  16.         AUXR |= 0x40;                //定时器时钟1T模式
  17.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  18.         TL1  = TM;
  19.         TH1  = TM>>8;
  20.         TR1 = 1;                                //定时器1开始计时
  21. //        REN = 1;        //允许接收
  22. //        SCON = (SCON & 0x3f) | 0x40;
  23. //        T2L  = TM;
  24. //        T2H  = TM>>8;
  25. //        AUXR |= 0x15;   //串口1选择定时器2为波特率发生器
  26. //        REN = 1;        //允许接收
  27. }
  28. void UartPutc(unsigned char dat)
  29. {
  30.         SBUF = dat;
  31.         while(TI==0);
  32.         TI = 0;
  33. }
  34. char putchar(char c)
  35. {
  36.         UartPutc(c);
  37.         return c;
  38. }
  39. void main(void)
  40. {
  41.     P_SW2 |= 0x80;  //扩展寄存器(XFR)访问使能
  42.     P0M1 = 0x00;   P0M0 = 0x00;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
  43.     P1M1 = 0x00;   P1M0 = 0x00;   //设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V)
  44.     P2M1 = 0x00;   P2M0 = 0x00;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
  45.     P3M1 = 0x00;   P3M0 = 0x00;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
  46.     P4M1 = 0x00;   P4M0 = 0x00;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
  47.     P5M1 = 0x00;   P5M0 = 0x00;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
  48.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
  49.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  50.    
  51. //    AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
  52. //    TH0 = (u8)(Timer0_Reload / 256);
  53. //    TL0 = (u8)(Timer0_Reload % 256);
  54. //    ET0 = 1;    //Timer0 interrupt enable
  55. //    TR0 = 1;    //Tiner0 run
  56.     UartInit();
  57.     RTC_config();
  58.     EA = 1;     //打开总中断
  59.     while(1)
  60.     {
  61.         if(B_1s)
  62.         {
  63.             B_1s = 0;
  64.             printf("Second=%bd\r\n",SEC);
  65.         }
  66.     }
  67. }
  68. /******************** RTC中断函数 *********************/
  69. void RTC_Isr() interrupt 13
  70. {
  71.         if(RTCIF & 0x80)    //闹钟中断
  72.         {
  73.                 RTCIF &= ~0x80;
  74.         }
  75.         if(RTCIF & 0x08)    //秒中断
  76.         {
  77.                 RTCIF &= ~0x08;
  78.                 B_1s = 1;
  79.         }
  80. }
  81. //========================================================================
  82. // 函数: void RTC_config(void)
  83. // 描述: RTC初始化函数。
  84. // 参数: 无.
  85. // 返回: 无.
  86. // 版本: V1.0, 2020-6-10
  87. //========================================================================
  88. void RTC_config(void)
  89. {
  90.     INIYEAR = 21;     //Y:2021
  91.     INIMONTH = 12;    //M:12
  92.     INIDAY = 31;      //D:31
  93.     INIHOUR = 23;     //H:23
  94.     INIMIN = 59;      //M:59
  95.     INISEC = 50;      //S:50
  96.     INISSEC = 0;      //S/128:0
  97.     ALAHOUR = 0;        //闹钟小时
  98.     ALAMIN  = 0;        //闹钟分钟
  99.     ALASEC  = 0;        //闹钟秒
  100.     ALASSEC = 0;        //闹钟1/128秒
  101.     //STC8H8K64U B版本芯片使用内部32K时钟,休眠无法唤醒
  102.    IRC32KCR = 0x80;   //启动内部32K晶振.
  103.    while (!(IRC32KCR & 1));  //等待时钟稳定
  104.    RTCCFG = 0x03;    //选择内部32K时钟源,触发RTC寄存器初始化
  105.     // X32KCR = 0x80 + 0x40;   //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
  106.     // while (!(X32KCR & 1));  //等待时钟稳定
  107.     // RTCCFG = 0x01;    //选择外部32K时钟源,触发RTC寄存器初始化
  108.     RTCIF = 0x00;     //清中断标志
  109.     RTCIEN = 0x88;    //中断使能, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
  110.     RTCCR = 0x01;     //RTC使能
  111.     while(RTCCFG & 0x01);        //等待初始化完成,需要在 "RTC使能" 之后判断.
  112.     //设置RTC时间需要32768Hz的1个周期时间,大约30.5us. 由于同步, 所以实际等待时间是0~30.5us.
  113.     //如果不等待设置完成就睡眠, 则RTC会由于设置没完成, 停止计数, 唤醒后才继续完成设置并继续计数.
  114. }
复制代码
不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:511
  • 最近打卡:2025-06-17 10:39:32

46

主题

232

回帖

3093

积分

论坛元老

积分
3093
发表于 2025-2-6 11:39:01 | 显示全部楼层

我看试验箱上的最后两个字符是 0D 也是D版本吧?
我把5楼贴出来的程序烧录到试验箱和我的温湿度计后,都不能正常工作。

然后在试验箱的示例程序中有一段汇编代码,加上后试验箱就工作了。

有关于汇编中那段代码的解释吗?

RTC的中断编号是13, 按照 13 *8 + 3 计算就是 6bH。 也就是如果RTC中断发生应该会跳到 6BH  去执行代码把, 为啥还需要跳转。

点评

中断13是保留中断 [attachimg]83624[/attachimg]  详情 回复 发表于 2025-2-6 11:54
不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-06-17 09:09:48
已绑定手机

79

主题

5137

回帖

9134

积分

超级版主

DebugLab

积分
9134
发表于 2025-2-6 11:54:45 | 显示全部楼层
大*** 发表于 2025-2-6 11:39
我看试验箱上的最后两个字符是 0D 也是D版本吧?
我把5楼贴出来的程序烧录到试验箱和我的温湿度计后,都 ...

中断13是保留中断
RTC中断是中断36
汇编是借用中断13重映射中断
也可以使用中断号扩展插件
截图202502061154337566.jpg



DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:569
  • 最近打卡:2025-06-18 00:24:58

11

主题

1196

回帖

5536

积分

论坛元老

积分
5536
发表于 2025-2-6 11:57:20 | 显示全部楼层
大*** 发表于 2025-2-6 11:39
我看试验箱上的最后两个字符是 0D 也是D版本吧?
我把5楼贴出来的程序烧录到试验箱和我的温湿度计后,都 ...

又是一个不读手册的大神。
RTC的中断编号是36
目前 Keil 各个版本的 C51 和 C251 编译器均只支持 32 个中断号(0~31)

中断编号13是使用保留中断号进行中转


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:511
  • 最近打卡:2025-06-17 10:39:32

46

主题

232

回帖

3093

积分

论坛元老

积分
3093
发表于 2025-2-6 12:51:27 来自手机 | 显示全部楼层
angmall 发表于 2025-2-6 11:57
又是一个不读手册的大神。
RTC的中断编号是36
目前 Keil 各个版本的 C51 和 C251 编译器均只支持 32 个中 ...

在没有遇到问题之前确实没有看关于中断序号部分的手册,直接使用了示例程序。
就单纯以为中断序号就是13。
那中专了了是不是可以在示例程序中说明一下呢
不争是争
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-18 02:00 , Processed in 0.164344 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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