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

📄 mcuinit.c

📁 68HC08 MCU 初始化程序
💻 C
字号:
/************************************************************** 
   程序  名称:MCUInit.c
   印刷板名称:TERRACAN EATCS V1.0.PCB
   程  序  员:
   日      期:09.05.19
   版      本: Vyf.09.01
 **************************************************************/
 
 #include "MC68HC908GR8.h"
 #include "SysIO.h"
 #include "MCUInit.h"
 
 extern unsigned int Time_count = 0;
 
 
 void MCU_Init( void )
 {
    byte b;
    
    // I/O 口初始化
	PTA = 0b00000000;
	PTB = 0b00000000;
	PTC = 0b00000000;
	PTD = 0b00000000;
	PTE = 0b00000000;
	
	//设置各口输入或输出,1:输出, 0:输入
	DDRA = 0b00001000; PTAPUE = 0b00000100;
	DDRB = 0b00000101;
	DDRC = 0b00000011; PTCPUE = 0b00000000;
	DDRD = 0b01101101; PTDPUE = 0b00000010;
	DDRE = 0b00000001;
	
	// 设置总线频率为:4.9152MHz,外部晶振频率为: 32768Hz
	PCTL = 0;	    //设置反馈分频指数因子,P = 0 并关闭 PLL
	PBWC = 0x80;	//设置为自动带宽控制位
	PMSH = 0x02;	//设置PLL反馈分频寄存器中的反馈分频因子的高4位, N = 2H
	PMSL = 0x58;	//设置PLL反馈分频寄存器中的反馈分频因子的低8位, N = 58H
	//PMSL = 0x55;	//设置PLL反馈分频寄存器中的反馈分频因子的低8位, N = 55H
	PMRS = 0x80;	//设置VCO选择寄存器PMRS中的VCO中心频率线性因子, L = 80H
	PMDS = 0x01;	//设置参考时钟预分频寄存器PMDS中的预分频因子, R = 1
	PCTL = 0x22;	//设定VCO选择指数因子,E = 2, 启动 PLL  

	//while(!PBWC_LOCK); //Waiting for stable PLL
	b = 1;
	while(b)
	{	            //Waiting for PLL Lock Indicator Bit
		if (PBWC_LOCK == 1)  b = 0;
		else    HEF4094_EN = 0;
	}
	PCTL_BCS = 1;	//Select CGMVCLK as the source of CGMOUTPUT
	
	// Set Configuration Register
	CONFIG2 = 4+2+1;			//  4:Enables extra divide-by-128 prescaler in timebase module
							//  2:Oscillator enabled to operate during stop mode
							//  1:Internal data bus clock used as clock source for SCI
	CONFIG1 = 4+2;			//128:COP timeout period = 2^13-2^4 COPCLK cycles (or:2^18-2^4)
							// 64:LVI enabled during stop mode
							// 32:LVI module resets disabled
							// 16:LVI module power disabled
							//  8:LVI operates in 5-V(4.2~4.5V reset) mode (or: 3-V,2.4~2.7V reset)
							//  4:Stop mode recovery after 32 CGMXCLK cycles (or:4096)
							//  2:STOP instruction enabled
							//  1:COP module disabled
							
							
 }
 
 
 /*HC08 Timer1 initialization*/
void MCUTimer1_Init(void) 
{
	T1SC_TRST = 1;	        //清除T1MOD中的计数值和分频因子ps0~ps2
	//T1SC = 0x06;      	//总线频率除以64
    T1SC = 0x04;        	//总线频率除以16
    //T1SC = 0x00;          //总线频率除以1

	//T1MODH = 0x06;	        //必须先设置计数值的高位
	//T1MODL = 0x00;	        //设置计数值的低位,当总线频率为4.9152MHz,16分频时5ms产生中断

	//T1MODH = 0x0C;	        //必须先设置计数值的高位
	//T1MODL = 0x00;	        //设置计数值的低位,当总线频率为4.9152MHz,16分频时10ms产生中断

	T1MODH = 0x18;	        //必须先设置计数值的高位
	T1MODL = 0x00;	        //设置计数值的低位,当总线频率为4.9152MHz,16分频时20ms产生中断
	
	//T1MODH = 0x01;	        //必须先设置计数值的高位
	//T1MODL = 0x80;	        //设置计数值的低位,当总线频率为4.9152MHz,64分频时5ms产生中断

	//T1MODH = 0x03;	        //必须先设置计数值的高位
	//T1MODL = 0x00;	        //设置计数值的低位,当总线频率为4.9152MHz,64分频时10ms产生中断

	//T1MODH = 0x06;	        //必须先设置计数值的高位
	//T1MODL = 0x00;	        //设置计数值的低位,当总线频率为4.9152MHz,64分频时20ms产生中断
}

/*HC08 Timer1 overflow interrupt enable*/
void MCUTimer1Enable(void) 
{
	T1SC_TOIE = 1;
	T1SC_TSTOP = 0;
}

/*HC08 Timer1 overflow interrupt disable*/
void MCUTimer1Disable(void) 
{
	T1SC_TOIE = 0;
	T1SC_TSTOP = 1;
}

/*Config HC08 Timer1-channel0 Status and Control Register*/
void MCUTimer1Ch0_Init(void) 
{
	T1SC0 = 0x04;
	T1SC_TSTOP = 0;
}

/*Enable HC08 Timer1-channel0 Interrupt*/
void MCUTimer1Ch0IntEnable(void) 
{
	T1SC0_CH0IE = 1;
}

/*Disable HC08 Timer1-channel0 Interrupt*/
void MCUTimer1Ch0IntDisable(void) 
{

	T1SC0_CH0IE = 0;
}


/*Config HC08 Timer1-channel1 Status and Control Register*/
void MCUTimer1Ch1_Init(void) 
{
	T1SC1 = 0x04;
}


/*Enable HC08 Timer1-channel1 Interrupt*/
void MCUTimer1Ch1IntEnable(void) 
{
	T1SC1_CH1IE = 1;
}


/*Disable HC08 Timer1-channel1 Interrupt*/
void MCUTimer1Ch1IntDisable(void) 
{
	T1SC1_CH1IE = 0;
}


/*HC08 Timer1 overflow ISR*/
 interrupt void MCUTimer1_Int(void) 
{
	T1SC_TOF = 0;	                    //Clear the flag of Timer1 overflow
//	Timeover = 1;
	Time_count++;
	if( Time_count == 50)
	{
	   Time_count = 0;
	   if(Start_flag )                  //前提条件是在打开测试开关才能正常显示失败指示
	   {	   
	        if( !Memory_Test_Success )
	        {
	            JP1_Pin37 = !JP1_Pin37;
                HEF4094_U11 = JP1_Pin37 << 6;
                HEF4094_Output();
	        }
	   }
	   else                             //测试开关关闭下,PASS灯不亮
	   {
	        JP1_Pin37 = 0;
            HEF4094_U11 = JP1_Pin37 << 6;
            HEF4094_Output();
	   }
	}	
} 

/*HC08 Timer1-channel0 input capture ISR*/
 interrupt void MCUTimer1CH0_Int(void) 
{
	T1SC0_CH0F = 0;	//Clear the flag of T1CH0 interrupt
//	CarSpeedFre ++;
} 


/*HC08 Timer1-channel1 input capture ISR*/
 interrupt void MCUTimer1CH1_Int(void) 
{
	T1SC1_CH1F = 0;	//Clear the flag of T1CH1 interrupt
}


/*HC08 Timer2 initialization*/
void MCUTimer2_Init(void) 
{
	T2SC_TRST = 1;	//Clear old content of T2MOD and ps0~ps2
	T2SC = 0x06;	//Frequency 64 divided
	
	//T2MODH = 0x05;	//Must write high byte before low byte
	//T2MODL = 0xf8;	//set 20ms when BUSFREQUENCY is 4.9152MHz
	T2MODH = 0x02;      //10ms
	T2MODL = 0xfc;
}


/*HC08 Timer2 overflow interrupt enable*/
void MCUTimer2Enable(void) 
{
	T2SC_TOIE = 1;
	T2SC_TSTOP = 0;
}


/*HC08 Timer2 overflow interrupt disable*/
void MCUTimer2Disable(void) 
{
	T2SC_TSTOP = 1;
	T2SC_TOIE = 0;
}


/*Config HC08 Timer2-channel0 Status and Control Register*/
void MCUTimer2Ch0_Init(void) 
{
	T2SC0 = 0x04;
}


/*Enable HC08 Timer2-channel0 Interrupt*/
void MCUTimer2Ch0IntEnable(void) 
{
	T2SC0_CH0IE = 1;
	
}


/*Disable HC08 Timer2-channel0 Interrupt*/
void MCUTimer2Ch0IntDisable(void) 
{
	T2SC0_CH0IE = 0;
}


/*HC08 Timer2 overflow ISR*/
/*void interrupt  MCUTimer2_Int(void) 
{
	T2SC_TOF = 0;	//Clear the flag of Timer2 overflow
	Temp1++;
	if(Temp1>=2){
	    Temp1 = 0;
	    TimerOver = 1;      //20ms
	}
	if(TimerFlag){
	    if(!Reseiver){
	        Temp2++;
	    }
	    else{
	        TimerFlag = 0;
	  	    if(Temp2 > 7 && Temp2<13) RemoULock = 1;
	        else if(Temp2 > 2 && Temp2 < 8) RemoLock = 1;      
	    }
	}
	else{
	    Temp2 = 0;
	}

} */

/*HC08 Timer2-channel0 input capture ISR*/
void interrupt  MCUTimer2CH0_Int(void) 
{
	T2SC0_CH0F = 0;	//Clear the flag of T2CH0 interrupt
	
}


void MCUKBI_Init(void) 
{
	//INTKBIER_KBIE = 0x01;	//Keyboard Interrupt Enable Bits
	INTKBIER_KBIE = 0x02;
}

/*void interrupt MCUKBI_Int(void) 
{
	INTKBSCR_ACKK =1;	//Keyboard Acknowledge Bit
	SleepState = 0;
	KBICount++;
	if(KBICount >= 2){
    	TimerFlag = 1;
    	KBICount = 0;
	}
} */

void MCUTBM_Init(void) 
{
	TBCR_TBR = 2;		//Timebase Divider Selection Bits  250ms 
	TBCR_TBIE = 1;		//Timebase Interrupt Enable
	TBCR_TBON = 1;		//Timebase Enabled
}

void interrupt MCUTBM_Int(void) 
{
	TBCR_TACK =1;		//Timebase ACKnowledge
}

void MCUADC_Init(void) 
{

	ADCLK = 0b01010000;	//Bus frequency is 4.9152MHz,A/D frequency is 1.2576MHz
}


/*unsigned char MCUADCOp(unsigned char chrChNum) 
{
	unsigned char Result;
	
	ADSCR = chrChNum;
	while(!ADSCR_COCO) 
	{
		nop();
	}
	if(ADSCR_COCO) 
	{
		Result = ADR;			
	}				
	return Result;
}   */


//HC08IRQInit"
/*void MCUIRQ_Init(void)
{
	INTSCR_MODE1 = 1;
	INTSCR_IMASK1 = 1;
}*/
							
							
							
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -