📄 init.c
字号:
/*****初始化串口SCI0*****/
void InitSci0(void)
{
*SCI0_SCIBR = 0x002b; // 0000 0010 0000 1001 b
//bit15-13 xxx 保留
//bit12-0(SBR) 0x2b SCI波特率57600=SCI模块时钟40M/(16×SBR)
*SCI0_SCICR = 0x002c; // 0000 0000 0010 1100 b
//bit15(LOOP) 0 禁用LOOP(自环)方式
//bit14(SWAI) 0 在等待模式也允许SCI
//bit13(RSRC) 0 接收输入内部连接到传送(用于当LOOP为1时决定接受的内部反馈路径)
//bit12(M) 0 数据格式 1个起始位,8个数据,1个停止位
//bit11(WAKE) 0 唤醒方式:Idle line
//bit10(POL) 0 极性不变
//bit9(PE) 0 禁用奇偶校验位
//bit8(PT) 0 奇偶校验方式:偶校验
//bit7(TEIE) 0 发送数据寄存器空时不允许中断请求
//bit6(TIIE) 0 传送空闲中断不允许
//bit5(RIE) 1 允许接收满时中断
//bit4(REIE) 0 不允许接收错误中断
//bit3(TE) 1 允许输出
//bit2(RE) 1 允许接收
//bit1(RWU) 0 Normal Operation 1=Standby state
//bit0(SBK) 0 No break characters
}
/*****end of 初始化串口SCI0*****/
/*****初始化串口SCI1发送状态*****/
void InitSci1Trans( void )
{
if (!MeterType) //使用新型号的数显表
{
*SCI1_SCIBR = 0x0412;
//bit15-13 xxx 保留
//bit12-0(SBR) 0x412 SCI波特率2400=SCI模块时钟40M/(16×SBR)
}
else //使用旧型号的数显表
{
*SCI1_SCIBR = 0x0823; // 0000 0010 0000 1001 b
//bit15-13 xxx 保留
//bit12-0(SBR) 0x823 SCI波特率1200=SCI模块时钟40M/(16×SBR)
}
*SCI1_SCICR = 0x0008; // 0000 0000 00000 1000 b
//bit15(LOOP) 0 禁用LOOP(自环)方式
//bit14(SWAI) 0 在等待模式也允许SCI
//bit13(RSRC) 0 接收输入内部连接到传送(用于当LOOP为1时决定接受的内部反馈路径)
//bit12(M) 0 数据格式 1个起始位,8个数据,1个停止位
//bit11(WAKE) 0 唤醒方式:Idle line
//bit10(POL) 0 极性不变
//bit9(PE) 0 禁用奇偶校验位
//bit8(PT) 0 奇偶校验方式:偶校验
//bit7(TEIE) 0 发送数据寄存器空时不允许中断请求
//bit6(TIIE) 0 传送空闲中断不允许
//bit5(RIE) 0 禁止接收满时中断
//bit4(REIE) 0 不允许接收错误中断
//bit3(TE) 1 允许TXD输出
//bit2(RE) 0 禁止接收
//bit1(RWU) 0 Normal Operation 1=Standby state
//bit0(SBK) 0 No break characters
}
/*****end of 初始化串口SCI1发送状态*****/
/*****初始化串口SCI1接收状态*****/
#pragma interrupt
void InitSci1Rec( void )
{
*SCI1_SCIBR = 0x0209; // 0000 0010 0000 1001 b
//bit15-13 xxx 保留
//bit12-0(SBR) 0x209 SCI波特率4800=SCI模块时钟40M/(16×SBR)
*SCI1_SCICR = 0x0024; // 0000 0000 0010 0100 b
//bit15(LOOP) 0 禁用LOOP(自环)方式
//bit14(SWAI) 0 在等待模式也允许SCI
//bit13(RSRC) 0 接收输入内部连接到传送(用于当LOOP为1时决定接受的内部反馈路径)
//bit12(M) 0 数据格式 1个起始位,8个数据,1个停止位
//bit11(WAKE) 0 唤醒方式:Idle line
//bit10(POL) 0 极性不变
//bit9(PE) 0 禁用奇偶校验位
//bit8(PT) 0 奇偶校验方式:偶校验
//bit7(TEIE) 0 发送数据寄存器空时不允许中断请求
//bit6(TIIE) 0 传送空闲中断不允许
//bit5(RIE) 1 允许接收满时中断
//bit4(REIE) 0 不允许接收错误中断
//bit3(TE) 0 禁用TXD输出
//bit2(RE) 1 允许接收
//bit1(RWU) 0 Normal Operation 1=Standby state
//bit0(SBK) 0 No break characters
}
/*****end of 初始化串口SCI1接收状态*****/
/*****初始化中断优先级*****/
void InitIPL(void)
{
*GPR5 = 0x0101; //GPIO B, GPIO D 中断优先级
*GPR7 = 0x0400; //TimerD0 中断优先级
*GPR8 = 0x7030; //TimerC1、TimerD3中断优先级
*GPR10 = 0x0700; //TimerA0 中断优先级
*GPR11 = 0x0007; //TimerA2 中断优先级
*GPR12 = 0x0050; //SCI1 Receiver full 中断优先级
*GPR13 = 0x0050; //SCI0 Receiver full 中断优先级
*IPR = 0xfe00; //允许0-6级中断
//bit15-9 111111 允许0-6级中断
//bit8-6 xxx 保留
//bit5 0 irqb为电平触发
//bit4 0 irqb中断屏蔽
//bit3 0 低触发
//bit2 0 irqa为电平触发
//bit1 0 irqa中断屏蔽
//bit0 0 低触发
}
/*****end of 初始化中断优先级*****/
/*****允许捕捉键相脉冲和A相电压脉冲中断*****/
#pragma interrupt
void InitPulseCapture(void)
{
*TMRA0_SCR = 0x04c0;
*TMRA2_SCR = 0x04c0;
//bit15(TCF) 0 Compare发生标志
//bit14(TCFIE) 0 1——允许Compare中断
//bit13(TOF) 0 计数器溢出标志
//bit12(TOFIE) 0 1——允许溢出中断
//bit11(IEF) 0 输入信号边沿触发(CAPTURE)标志
//bit10(IEFIE) 1 1——允许输入信号边沿触发中断(捕捉发生时发出中断)
//bit9(IPS) 0 1——对外部引脚输入信号反向
//bit8(INPUT) x 反映外部引脚的电平状态,只读
//bit7-6(CAPTURE MODE) 11 外部输入(CAPTURE)触发模式,11——跳变沿触发方式
//bit5(MSTR) 0 0——不广播信息给其他定时器
//bit4(EEOF) 0 0——不允许其它定时器影响本定时器的外部OFLAG输出
//bit3(VAL) 0 OFLAG强制输出值
//bit2(FORCE) 0 1——强制OFLAG输出VAL的值,只写,读=0
//bit1(OPS) 0 0——输出极性不反向
//bit0(OEN) 0 0——禁用外部引脚输出
}
/*****end of 允许捕捉键相脉冲和A相电压脉冲中断*****/
/*****初始化测试用变量*****/
void InitTestVariable(void)
{
unsigned int i;
for (i=0; i<32; i++)
{
InputPpsCounterRecBuf[i] = 0; //输入PPS上升沿计数器值存储缓冲区,用于测试
OutputPpsCounterRecBuf[i] = 0; //输出PPS上升沿计数器值存储缓冲区,用于测试
Td3OverflowCounterRecBuf[i] = 0;
}
InputPpsCounterRecBufPtr = &InputPpsCounterRecBuf[0];
OutputPpsCounterRecBufPtr = &OutputPpsCounterRecBuf[0];
Td3OverflowCounterRecBufPtr = &Td3OverflowCounterRecBuf[0];
for (i=0; i<TEST_BUS_SIZE; i++)
{
EAbsoluteAngleBuf[i] = 0;
RotateSpeedBuf[i] = 0;
PowerAngleBuf[i] = 0;
}
EAbsoluteAngleBufPtr = &EAbsoluteAngleBuf[0];
RotateSpeedBufPtr = &RotateSpeedBuf[0];
PowerAngleBufPtr = &PowerAngleBuf[0];
FirstTimes = 0;
LastPowerAngle = 0;
for (i=0; i<50; i++)
{
Sci0RecBuf[i] = 0;
}
Sci0RecBufPtr = &Sci0RecBuf[0];
for (i=0; i<100; i++)
{
Sci1RecBuf[i] = 0;
}
Sci1RecBufPtr = &Sci1RecBuf[0];
IntFlag = 0;
EErrorTimes = 0;
GpsReportMaxReachTime = 0;
GpsReportMinReachTime = 999;
for (i=0; i<20; i++)
{
GpsReachTime.ReachTime[i] = 0;
GpsReachTime.FixStat[i] = 0;
}
GpsReachTimeWritePtr = 0;
GpsReachTimeErrorCnt = 0;
}
/*****end of 初始化测试用变量*****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -