8H8K64U怎么在程序中自己修改内部给CPU用的高速IRC频率
8H8K64U怎么在程序中自己修改内部给CPU用的高速IRC频率参考如下
这个高级功能,动态修改时钟,自己在自己的用户程序中修改 主时钟频率必须会 选择系统时钟源,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;
*/
梁工 发表于 2022-12-15 11:47
选择系统时钟源,STC ISP的范例程序有源码。
P_SW2 = 0x80;
STC8H3K64S4调频的时候,VRTRIM这个寄存器为什么没有呢,是不是早就取消了,技术手册上没改;我实测不需要VRTRIM这行代码也行
如果在运行过程中动态修改IRC频率,“等待时钟稳定”大约用多久? 梁工 发表于 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();
}
}
huatlwangl 发表于 2024-9-26 16:01
梁工您好,我想请假下,为什么我自己定义的内部时钟源24M 一直不准
#include "STC8Hxxx.h" //包含 ...
实际频率多少?你从P5.4输出时钟的10分频看看其频率。 梁工 发表于 2024-9-26 18:40
实际频率多少?你从P5.4输出时钟的10分频看看其频率。
梁工,刚刚测量P5.4引脚实际频率480k左右。
huatlwangl 发表于 2024-9-27 08:39
梁工,刚刚测量P5.4引脚实际频率480k左右。
多少分频?如果是10分频,主频为4.8MHz。
页:
[1]