找回密码
 立即注册
查看: 612|回复: 12

AI8H1K08 自己定义的内部时钟源测试一直不准

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-9-26 16:05:51 | 显示全部楼层 |阅读模式
本帖最后由 DebugLab 于 2024-9-26 16:21 编辑

想请假下,为什么我自己定义的内部时钟源24M 一直不准
#include "STC8Hxxx.h"       //包含此头文件后,不需要再包含"reg51.h"头文件
#include "test.h"

#define     MAIN_Fosc       24000000L   //定义主时钟

/*************  功能说明    **************
程序使用
AIN1-P1.1
AIN2-P1.2
BIN1-P1.5
BIN2-P3.4
驱动步进电机
******************************************/
#include "intrins.h"

sfr     VRTRIM  =   0xA6;

#define CKSEL           (*(unsigned char volatile xdata *)0xfe00)
#define CKDIV           (*(unsigned char volatile xdata *)0xfe01)
#define IRC24MCR        (*(unsigned char volatile xdata *)0xfe02)
#define XOSCCR          (*(unsigned char volatile xdata *)0xfe03)
#define IRC32KCR        (*(unsigned char volatile xdata *)0xfe04)

#define USBCHIPID
#define CPUIDBASE   0xfde0

#define T22M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0b))   //22.1184MHz
#define T24M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0c))   //24MHz
#ifdef  USBCHIPID
#define T27M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0d))   //27MHz
#define T30M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0e))   //30MHz
#define T33M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0f))   //33.1776MHz
#define T35M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x10))   //35MHz
#define T36M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x11))   //36.864MHz
#define T40M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x12))   //40MHz
#define T44M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x13))   //44.2368MHz
#define T48M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x14))   //48MHz
#else
#define T20M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0d))   //20MHz
#define T27M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0e))   //27MHz
#define T30M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0f))   //30MHz
#define T33M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x10))   //33.1776MHz
#define T35M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x11))   //35MHz
#define T36M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x12))   //36.864MHz
#define T40M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x13))   //40MHz
#define T45M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x14))   //45MHz
#endif
#define VRT6M_ADDR  (*(unsigned char volatile xdata *)(CPUIDBASE + 0x15))   //VRTRIM_6M
#define VRT10M_ADDR (*(unsigned char volatile xdata *)(CPUIDBASE + 0x16))   //VRTRIM_10M
#define VRT27M_ADDR (*(unsigned char volatile xdata *)(CPUIDBASE + 0x17))   //VRTRIM_27M
#define VRT44M_ADDR (*(unsigned char volatile xdata *)(CPUIDBASE + 0x18))   //VRTRIM_44M
//========================================================================
// 函数: void delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2021-3-9
// 备注:
//========================================================================
void delay_ms(unsigned int ms)
{
     unsigned int i;
     do{
          i = MAIN_Fosc / 10000;
          while(--i);   //10T per loop
     }while(--ms);
}
void Delay1ms(void)        //@24.000MHz
{
        unsigned char data i, j;

        i = 24;
        j = 85;
        do
        {
                while (--j);
        } while (--i);
}
void Delay10ms(void)        //@24.000MHz
{
        unsigned char data i, j;

        i = 234;
        j = 115;
        do
        {
                while (--j);
        } while (--i);
}
/******************** 主函数 **************************/
void main(void)
{

        P_SW2 = 0x80;
        CKSEL = 0x00;                               //选择内部IRC ( 默认 )
        P_SW2 = 0x00;
   P_SW2 |= 0x80;  //扩展寄存器(XFR)访问使能
   P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;P2M0 = 0x00;P2M1 = 0x00;P3M0 = 0x00;P3M1 = 0x00;P4M0 = 0x00;P4M1 = 0x00;P5M0 = 0x00;P5M1 = 0x00;
    //选择24MHz
    CLKDIV = 0x04;
    IRTRIM = T24M_ADDR;
    VRTRIM = VRT27M_ADDR;
    IRCBAND &= ~0x03;
        IRCBAND |= 0x02;
        CLKDIV = 0x00;

        while(1)  
        {
          delay_ms(1);
          delay_ms(1);
          Delay1ms();
          Delay1ms();

        }

     
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4851

回帖

8390

积分

超级版主

DebugLab

积分
8390
发表于 2024-9-26 16:25:25 | 显示全部楼层

内部预置频率应该是准确的
使用AIapp-ISP-v6.94R生成延时函数,优化级别默认
截图202409261623201693.jpg
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-9-26 16:45:28 | 显示全部楼层
Debu*** 发表于 2024-9-26 16:25
内部预置频率应该是准确的
使用AIapp-ISP-v6.94R生成延时函数,优化级别默认

不好意思,我使用的是STC8H1K08,然后选用内部时钟源24M,我也用ISP的函数了,仍然不准,延时1ms,实测有7MS
回复 支持 反对

使用道具 举报 送花

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

19

主题

3191

回帖

4876

积分

论坛元老

积分
4876
发表于 2024-9-26 22:38:38 来自手机 | 显示全部楼层
huatlwangl 发表于 2024-9-26 16:45
不好意思,我使用的是STC8H1K08,然后选用内部时钟源24M,我也用ISP的函数了,仍然不准,延时1ms,实测有 ...

可以写入频率过段时间在读取寄存器查看是否写入成功。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-9-27 08:40:05 | 显示全部楼层
so*** 发表于 2024-9-26 22:38
可以写入频率过段时间在读取寄存器查看是否写入成功。

您好,读取什么寄存器
回复 支持 反对

使用道具 举报 送花

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

39

主题

2006

回帖

6845

积分

论坛元老

积分
6845
发表于 2024-9-27 09:07:26 | 显示全部楼层
huatl*** 发表于 2024-9-26 16:45
不好意思,我使用的是STC8H1K08,然后选用内部时钟源24M,我也用ISP的函数了,仍然不准,延时1ms,实测有 ...

STC8H1K08没有CHIPID寄存器,时钟参数需要从Flash空间读取:

截图202409270904226712.jpg

并且烧录时需要勾选“在程序区的结束处添加重要测试参数”选项:
截图202409270905132183.jpg

程序可参考规格书这个例子:
截图202409270907172948.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-9-27 09:24:08 | 显示全部楼层
乘风*** 发表于 2024-9-27 09:07
STC8H1K08没有CHIPID寄存器,时钟参数需要从Flash空间读取:

大佬您好,我刚接触这个芯片,我按照您说的做了,遇到以下问题:
1.提示没有VRTRIM这个变量的定义,我自己参考CHIPID添加了这一句话sfr VRTRIM = 0xA6;
2.这是我的烧录界面。
3.下载后仍然不准和以前一样。
请问您是什么原因
1.png
2.png
回复 支持 反对

使用道具 举报 送花

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

39

主题

2006

回帖

6845

积分

论坛元老

积分
6845
发表于 2024-9-27 09:40:21 | 显示全部楼层
照搬ISP软件里的这个例子试试,这个例子也是使用STC8H1K08芯片的参数,设置24M的IRC频率:
截图202409270936486480.jpg
此外可以设置主时钟分频输出功能,用示波器测量对应脚位,判断主时钟是否已经调到程序设置的频率:
截图202409270939138022.jpg
回复 支持 反对

使用道具 举报 送花

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

39

主题

2006

回帖

6845

积分

论坛元老

积分
6845
发表于 2024-9-27 09:43:29 | 显示全部楼层
如果没有特殊需求的话,只要烧录时硬件选项设置好芯片运行时需要的IRC频率,
上电后硬件会自动将主频调整到指定的频率,完全不需要使用程序设置频率:
截图202409270941504095.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-9-27 09:47:11 | 显示全部楼层
乘风*** 发表于 2024-9-27 09:43
如果没有特殊需求的话,只要烧录时硬件选项设置好芯片运行时需要的IRC频率,
上电后硬件会自动将主频调整到 ...

您的意思是说,我程序里完全不用管,什么都可以不写,只是下载程序的时候在这里选择,写入24M就可以了吗?但是我这里选择了 也不对
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 20:19 , Processed in 0.154457 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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