📄 sysinit.c
字号:
//-------------------------------------------------------------------------*
// 文件名: sysinit.c (芯片初始化文件) *
// 说 明: MCF52233芯片初始化(将25MHz晶振频率倍频到60MHz的系统时钟) *
//-------------------------------------------------------------------------*
//1.头文件
#include "sysinit.h" //芯片初始化头文件
//2.内部函数声明
void mcf52233_init(void);
void mcf5223_wtm_init(void);
void mcf5223_pll_init(void);
void mcf5223_scm_init(void);
//3.外部函数引用
extern void mcf5xxx_wr_cacr (uint32);
extern void mcf5xxx_wr_vbr (uint32);
//-------------------------------------------------------------------------*
// 函数名: mcf52233_init() *
// 功 能: 初始化MCF52233芯片 *
// 参 数: 无 *
// 返 回: 无 *
//-------------------------------------------------------------------------*
void
mcf52233_init(void)
{
extern char __DATA_ROM[];
extern char __DATA_RAM[];
extern char __DATA_END[];
extern char __BSS_START[];
extern char __BSS_END[];
extern char __heap_addr[];
extern char __heap_size[];
extern uint32 VECTOR_TABLE[];
extern uint32 __VECTOR_RAM[];
extern uint8 __SRAM[];
extern uint8 __SRAM_SIZE[];
extern uint32 __SP_INIT[];
register uint32 n;
register uint8 *dp, *sp;
//1 使能pst[0..3]
MCF_GPIO_PDDPAR = 0x0F;
//2 配置中断向量表
mcf5xxx_wr_vbr((uint32)VECTOR_TABLE);
//3、将已初始化的数据从ROM移到RAM
if (__DATA_ROM != __DATA_RAM)
{
dp = (uint8 *)__DATA_RAM;
sp = (uint8 *)__DATA_ROM;
n = (uint32)(__DATA_END - __DATA_RAM);
while (n--)
*dp++ = *sp++;
}
//4 将所有未初始化的数据初始化为0
if (__BSS_START != __BSS_END)
{
sp = (uint8 *)__BSS_START;
n = (uint32)(__BSS_END - __BSS_START);
while (n--)
*sp++ = 0;
}
//5 设置实时时钟频率(MCF_CLOCK_RTCDR=晶振频率/1Hz)
MCF_CLOCK_RTCDR = 25000000;
//6 模块初始化
mcf5223_wtm_init(); //设置看门狗
mcf5223_pll_init(); //系统时钟初始化
mcf5223_scm_init(); //
//清所有位允许中断
MCF_INTC0_IMRL &= ~(MCF_INTC_IMRL_MASKALL);
}
//-------------------------------------------------------------------------*
// 函数名: mcf5223_wtm_init() *
// 功 能: 软件看门狗定时器 *
// 参 数: 无 *
// 返 回: 无 *
//-------------------------------------------------------------------------*
void
mcf5223_wtm_init(void)
{
MCF_SCM_CWCR = 0; //禁止看门狗
//MCF_SCM_CWCR |=MCF_SCM_CWCR_CWT(0b110)|MCF_SCM_CWCR_CWE; //开看门狗
}
//-------------------------------------------------------------------------*
// 函数名: mcf5223_pll_init() *
// 功 能: 初始化PLL *
// 将25MHz晶振频率倍频到60MHz的系统时钟 *
// 参 数: 无 *
// 返 回: 无 *
//-------------------------------------------------------------------------*
void
mcf5223_pll_init(void)
{
//fsys 计数公式:fsys = fref x 2(MFD + 2)/(2 exp RFD);
//fref x 2(MFD + 2) ≤ 60 MHz, fsys ≤ MHz。
//该程序中,CCHR是4(复位后默认值),MFD=4,RFD=0。系统频率计算:
//为25MHz/(CCHR+1)* 2(MFD + 2)/(2 exp RFD) = 60Mhz.
MCF_CLOCK_SYNCR = (MCF_CLOCK_SYNCR_MFD(4)
| MCF_CLOCK_SYNCR_CLKSRC
| MCF_CLOCK_SYNCR_PLLMODE
| MCF_CLOCK_SYNCR_PLLEN) ;
while (!(MCF_CLOCK_SYNSR & MCF_CLOCK_SYNSR_LOCK))
{
}
}
//-------------------------------------------------------------------------*
// 函数名: mcf5223_scm_init() *
// 功 能: 初始化SCM模块 *
// 设置基址、允许片上模块访问内部SRAM *
// 参 数: 无 *
// 返 回: 无 *
//-------------------------------------------------------------------------*
void
mcf5223_scm_init(void)
{
//使能片上模块访问内部SRAM
MCF_SCM_RAMBAR = (0
| MCF_SCM_RAMBAR_BA(SRAM_ADDRESS)
| MCF_SCM_RAMBAR_BDE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -