⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysinit.c

📁 基于32位ColdFire构建嵌入式系统书本原程序.rar
💻 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 + -