浅夏星空 发表于 2022-11-25 15:43:15

8H8K64U怎么在程序中自己修改内部给CPU用的高速IRC频率

8H8K64U怎么在程序中自己修改内部给CPU用的高速IRC频率

太阳还暖 发表于 2022-11-25 15:48:25

参考如下

神农鼎 发表于 2022-11-25 16:16:52

这个高级功能,动态修改时钟,自己在自己的用户程序中修改 主时钟频率必须会

梁工 发表于 2022-12-15 11:47:44

选择系统时钟源,STC ISP的范例程序有源码。

    P_SW2 = 0x80;
    CLKSEL = 0x00;   //选择内部IRC ( 默认 )
    P_SW2 = 0x00;

/*
    P_SW2 = 0x80;
    XOSCCR = 0xc0;                              //启动外部晶振
    while (!(XOSCCR & 1));                      //等待时钟稳定
    CLKDIV = 0x00;                              //时钟不分频
    CLKSEL = 0x01;                              //选择外部晶振
    P_SW2 = 0x00;
*/

/*
    P_SW2 = 0x80;
    IRC32KCR = 0x80;                            //启动内部32K IRC
    while (!(IRC32KCR & 1));                  //等待时钟稳定
    CLKDIV = 0x00;                              //时钟不分频
    CLKSEL = 0x03;                              //选择内部32K
    P_SW2 = 0x00;
*/

wp929 发表于 2023-8-10 14:34:00

梁工 发表于 2022-12-15 11:47
选择系统时钟源,STC ISP的范例程序有源码。

    P_SW2 = 0x80;



STC8H3K64S4调频的时候,VRTRIM这个寄存器为什么没有呢,是不是早就取消了,技术手册上没改;我实测不需要VRTRIM这行代码也行

xxkj2010 发表于 2023-12-7 15:39:45

如果在运行过程中动态修改IRC频率,“等待时钟稳定”大约用多久?

huatlwangl 发表于 2024-9-26 16:01:28

梁工 发表于 2022-12-15 11:47
选择系统时钟源,STC ISP的范例程序有源码。

    P_SW2 = 0x80;


梁工您好,我想请假下,为什么我自己定义的内部时钟源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
#ifdefUSBCHIPID
#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;

//        Timer0_Init();
        //Timer0_Config(0, MAIN_Fosc / 1000);        //t=0: reload值是主时钟周期数,t=1: reload值是时间(单位us)
        ET0 = 1;
        EA = 1;
        while(1)
        {
          delay_ms(1);
          delay_ms(1);
          Delay1ms();
          Delay1ms();

        }

   
}

梁工 发表于 2024-9-26 18:40:19

huatlwangl 发表于 2024-9-26 16:01
梁工您好,我想请假下,为什么我自己定义的内部时钟源24M 一直不准
#include "STC8Hxxx.h"       //包含 ...

实际频率多少?你从P5.4输出时钟的10分频看看其频率。

huatlwangl 发表于 2024-9-27 08:39:10

梁工 发表于 2024-9-26 18:40
实际频率多少?你从P5.4输出时钟的10分频看看其频率。

梁工,刚刚测量P5.4引脚实际频率480k左右。

梁工 发表于 2024-9-27 09:47:49

huatlwangl 发表于 2024-9-27 08:39
梁工,刚刚测量P5.4引脚实际频率480k左右。

多少分频?如果是10分频,主频为4.8MHz。
页: [1]
查看完整版本: 8H8K64U怎么在程序中自己修改内部给CPU用的高速IRC频率