Files
STC32G_Power_Monitor/Source/clock_init.c
2025-08-31 21:43:17 +08:00

201 lines
3.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "clock_init.h"
#include "delay.h"
#include "uart.h"
//22.11MHz的IRC参数寄存器 0xFB
//24MHz的IRC参数寄存器 0xFB
#define IRC_22M (*((uint8 idata*)0xFA))
#define IRC_24M (*((uint8 idata*)0xFB))
//内核频率
int32 sys_clk = FOSC;
//-------------------------------------------------------------------------------------------------------------------
// @brief STC32G设置系统频率
// @param NULL 空值
// @return void 系统频率
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 set_clk(void)
{
P_SW2 |= 0x80;
if(sys_clk == 22118400)
{
//选择 22.1184MHz
CLKDIV = 0x04;
IRTRIM = T22M_ADDR;
VRTRIM = VRT27M_ADDR;
IRCBAND = 0x02;
CLKDIV = 0x00;
}
else if(sys_clk == 24000000)
{
//选择 24MHz
CLKDIV = 0x04;
IRTRIM = T24M_ADDR;
VRTRIM = VRT27M_ADDR;
IRCBAND = 0x02;
CLKDIV = 0x00;
}
else if(sys_clk == 27000000)
{
//选择 27MHz
CLKDIV = 0x04;
IRTRIM = T27M_ADDR;
VRTRIM = VRT27M_ADDR;
IRCBAND = 0x02;
CLKDIV = 0x00;
}
else if(sys_clk == 30000000)
{
//选择 30MHz
CLKDIV = 0x04;
IRTRIM = T30M_ADDR;
VRTRIM = VRT27M_ADDR;
IRCBAND = 0x02;
CLKDIV = 0x00;
}
else if(sys_clk == 33177600)
{
//选择 33.1776MHz
CLKDIV = 0x04;
IRTRIM = T33M_ADDR;
VRTRIM = VRT27M_ADDR;
IRCBAND = 0x02;
CLKDIV = 0x00;
}
else if(sys_clk == 35000000)
{
//选择 35MHz
CLKDIV = 0x04;
IRTRIM = T35M_ADDR;
VRTRIM = VRT44M_ADDR;
IRCBAND = 0x03;
CLKDIV = 0x00;
}
else
{
sys_clk = 30000000;
//选择 30MHz
CLKDIV = 0x04;
IRTRIM = T30M_ADDR;
VRTRIM = VRT27M_ADDR;
IRCBAND = 0x02;
CLKDIV = 0x00;
}
return sys_clk;
}
void board_init(void)
{
EAXFR = 1; // 使能访问XFR
CKCON = 0x00; // 设置外部数据总线为最快
WTST = 0; // 设置程序代码等待参数赋值为0可将CPU执行程序的速度设置为最快
SET_P54_RESRT; // 使P54为复位引脚
P_SW2 = 0x80; // 开启特殊地址访问
#if (1 == EXTERNAL_CRYSTA_ENABLE)
XOSCCR = 0xc0; //启动外部晶振
while (!(XOSCCR & 1)); //等待时钟稳定
CLKDIV = 0x00; //时钟不分频
CLKSEL = 0x01; //选择外部晶振
#else
//自动设置系统频率
#if (0 == FOSC)
sys_clk = set_clk();
#else
sys_clk = FOSC;
#endif
#endif
delay_init(); //延时函数初始化
WTST = 0;
P_SW2 |= 0x80;
CLKDIV = 0; //24MHz主频分频设置
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
ADCCFG = 0;
AUXR = 0;
SCON = 0;
S2CON = 0;
S3CON = 0;
S4CON = 0;
P_SW1 = 0;
IE2 = 0;
TMOD = 0;
P_SW2 |= 0x80;
#if (1 == USE_USB_CDC)
P3M0 &= ~0x03;
P3M1 |= 0x03;
IRC48MCR = 0x80;
while (!(IRC48MCR & 0x01));
USBCLK = 0x00;
USBCON = 0x90;
usb_init();
IE2 |= 0x80;
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
#else
uart_init(DEBUG_UART, DEBUG_UART_RX_PIN, DEBUG_UART_TX_PIN, DEBUG_UART_BAUD, DEBUG_UART_TIM);
#endif
EnableGlobalIRQ();
}
#if (1 == PRINTF_ENABLE)
#if (1==USE_USB_CDC)
#else
//重定义printf 数字 只能输出uint16
char putchar(char c)
{
uart_putchar(DEBUG_UART, c);//把自己实现的串口打印一字节数据的函数替换到这里
return c;
}
#endif
#endif
void DisableGlobalIRQ(void)
{
EA = 0;
}
void EnableGlobalIRQ(void)
{
EA = 1;
}