📄 mcuinit.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 + -