初始化仓库
This commit is contained in:
200
Source/clock_init.c
Normal file
200
Source/clock_init.c
Normal file
@@ -0,0 +1,200 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user