📄 initall.c
字号:
/**************************************************************************/
// 文件名称: InitAll.c
//
// 简 介: 初始化CPU和外设的寄存器,初始化全局变量,初始化1306。
//
// 版权所有(C)2007.8 中科大鲁能集成公司
/*************************************************************************/
#include "Device.h"
//初始化硬件设备和设备参数
void InitAll(void)
{
InitSysCtrl();
InitPara();
InitXintf();
InitPieCtrl();
InitPieVectTable();
InitCpuTimers();
StartCpuTimer2();
InitGpio();
InitAdc();
InitEv();
InitSpi();
InitXIntrupt();
// ReadParm();
InitSci();
Init1306();
GetTime1306();
InitLcd();
}
//初始化用户参数
void InitPara()
{
//memset((int *)0x000040, 0, 0x03C0);//M0
memset((int *)0x008000, 0, 0x1000);//L0
memset((int *)0x009000, 0, 0x1000);//L1
// cePin.capGood = 3;
}
//初始化ADC采样
void InitAdc(void)
{
unsigned int i;
AdcRegs.ADCTRL1.bit.RESET=1;
NOP;
AdcRegs.ADCTRL1.bit.RESET=0;
AdcRegs.ADCTRL1.bit.SUSMOD=3;
AdcRegs.ADCTRL1.bit.ACQ_PS=0;
AdcRegs.ADCTRL1.bit.CPS=0; //0>>>>1
AdcRegs.ADCTRL1.bit.CONT_RUN=0;
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
AdcRegs.ADCTRL1.bit.SEQ_OVRD=1;
AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;
for(i=0;i<10000;i++) NOP;
AdcRegs.ADCTRL3.bit.ADCPWDN=1;
for(i=0;i<5000;i++) NOP;
AdcRegs.ADCTRL3.bit.ADCCLKPS=15;//15>>>2
AdcRegs.ADCTRL3.bit.SMODE_SEL=1;//1>>>0 //1 并发;0 连续
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=7;
AdcRegs.ADCCHSELSEQ1.all = 0x3201; // Initialize all ADC channel selects to A0
AdcRegs.ADCCHSELSEQ2.all = 0x7654;
AdcRegs.ADCCHSELSEQ3.all = 0xBA98;
AdcRegs.ADCCHSELSEQ4.all = 0xFEDC;
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;
AdcRegs.ADCST.bit.INT_SEQ2_CLR=1;
AdcRegs.ADCTRL2.all = 0xC900;
}
//初始化EV
void InitEv(void)
{ /*
EvaRegs.T2CON.all =0;
EvaRegs.T2CON.bit.TMODE = 1;
EvaRegs.T2CON.bit.TPS = 0;
EvaRegs.T2CON.bit.TENABLE =1;
EvaRegs.T2CON.bit.TECMPR = 1;
EvaRegs.GPTCONA.all =0;
EvaRegs.GPTCONA.bit.TCMPOE =1;
EvaRegs.GPTCONA.bit.T2CMPOE =1;
EvaRegs.GPTCONA.bit.T2PIN = 2;
// T2PR *(1/(20Mhz/k)) *2 = 1/38khz
EvaRegs.T2CNT =0;
EvaRegs.T2PR = 0x107;
EvaRegs.T2CMPR = 0x83;
*/
// EVB Timer3-测频,CAP4捕获Ua周期 Timer4-A/D采样间隔
EvbRegs.T3PR = 0xFFFF;
EvbRegs.T3CNT=0;
EvbRegs.T3CON.all=0;
EvbRegs.T3CON.bit.TMODE=2;
EvbRegs.T3CON.bit.TPS=5; //32分频==>120M/6/32
EvbRegs.T3CON.bit.TENABLE=1;
EvbRegs.CAPCONB.all=0;
EvbRegs.CAPCONB.bit.CAPQEPN=1;// enable capture4
EvbRegs.CAPCONB.bit.CAP4EDGE=1;//detect rising edge of capture4
EvbRegs.CAPCONB.bit.CAP45TSEL=1;//select Timer3 for capture4
EvbRegs.CAPFIFOB.bit.CAP4FIFO=0;
EvbRegs.EVBIFRC.bit.CAP4INT=1;//clear capture3 interrupt flag.
EvbRegs.EVBIMRC.bit.CAP4INT=1;
//---------start ADC---------
cePin.pinLvNow = 0x062;// 625US // (625us*120M)/(6*128)
cePin.pinLvBef=cePin.pinLvNow;
EvbRegs.T4PR = cePin.pinLvNow;
EvbRegs.T4CNT=0;
EvbRegs.T4CON.all=0;
EvbRegs.T4CON.bit.TMODE=2;//连续增模式
EvbRegs.T4CON.bit.TPS=7; //128 分频
EvbRegs.T4CON.bit.TENABLE=1; //enable timer to start ADC
EvbRegs.GPTCONB.bit.T4TOADC=2;
}
//初始化CPU定时器-10ms
void InitCpuTimers(void)
{
// Initialize address pointers to respective timer registers:
CpuTimer0.RegsAddr = &CpuTimer0Regs;
CpuTimer1.RegsAddr = &CpuTimer1Regs;
CpuTimer2.RegsAddr = &CpuTimer2Regs;
// Make sure timers are stopped:
CpuTimer0Regs.TCR.bit.TSS = 1;
CpuTimer1Regs.TCR.bit.TSS = 1;
CpuTimer2Regs.TCR.bit.TSS = 1;
ConfigCpuTimer(&CpuTimer2, 120, 10000); //10ms
}
//配置CPU定时器
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, int Freq, int Period)
{
// Initialize timer period:
Timer->CPUFreqInMHz = Freq;
Timer->PeriodInUSec = Period;
Timer->RegsAddr->PRD.all = (long) (Freq * Period);// Initialize timer period
// Set pre-scale counter to divide by 1 (SYSCLKOUT):
Timer->RegsAddr->TPR.all = 0;
Timer->RegsAddr->TPRH.all = 0;
// Initialize timer control register:
Timer->RegsAddr->TCR.bit.POL = 0; // 0 = Pulse Low
Timer->RegsAddr->TCR.bit.TOG = 0; // 0 = No Toggle, POL bit defines action
Timer->RegsAddr->TCR.bit.TSS = 1; // 1 = Stop timer, 0 = Start/Restart Timer
Timer->RegsAddr->TCR.bit.TRB = 1; // 1 = reload timer
Timer->RegsAddr->TCR.bit.FRCEN = 0; // Force output enable (not used)
Timer->RegsAddr->TCR.bit.PWIDTH = 7; // 7+1 = 8 SYSCLKOUT cycle pulse width
Timer->RegsAddr->TCR.bit.SOFT = 1;
Timer->RegsAddr->TCR.bit.FREE = 1; // Timer Free Run
Timer->RegsAddr->TCR.bit.TIE = 1; // 0 = Disable/ 1 = Enable Timer Interrupt
}
//初始化I/O引脚
void InitGpio(void)
{
EALLOW;
//Yx input A0-A6 && LCD A8-A15
GpioMuxRegs.GPAMUX.all = 0x0;
GpioMuxRegs.GPADIR.all = 0xFF00;
GpioMuxRegs.GPAQUAL.all = 0x0;
//Yx input B5
GpioMuxRegs.GPBMUX.bit.PWM12_GPIOB5 =0;
GpioMuxRegs.GPBDIR.bit.GPIOB5 = 0x0;
GpioMuxRegs.GPBQUAL.bit.QUALPRD = 0x0;
//infrared carrier wave
GpioMuxRegs.GPAMUX.bit.T2PWM_GPIOA7 =1;
GpioMuxRegs.GPBMUX.bit.PWM9_GPIOB2=0;
GpioMuxRegs.GPBDIR.bit.GPIOB2=1;
GpioDataRegs.GPBDAT.bit.GPIOB2=0;//1306
GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0=0;
GpioMuxRegs.GPBDIR.bit.GPIOB0=1;
GpioDataRegs.GPBDAT.bit.GPIOB0=1;//5323
GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=0;
GpioMuxRegs.GPBDIR.bit.GPIOB1=1;
GpioDataRegs.GPBDAT.bit.GPIOB1=1;//5323 /wp
//7758 CSSTART
GpioMuxRegs.GPBMUX.bit.PWM10_GPIOB3=0;
GpioMuxRegs.GPBDIR.bit.GPIOB3=0;
GpioDataRegs.GPBDAT.bit.GPIOB3=1;
//buzzer
GpioMuxRegs.GPBMUX.bit.PWM11_GPIOB4=0;
GpioMuxRegs.GPBDIR.bit.GPIOB4=1;
GpioDataRegs.GPBDAT.bit.GPIOB4=0;
//ExFlash A19 A20
GpioMuxRegs.GPBMUX.bit.T3PWM_GPIOB6=0;
GpioMuxRegs.GPBDIR.bit.GPIOB6=1;
GpioDataRegs.GPBDAT.bit.GPIOB6=0;
GpioMuxRegs.GPBMUX.bit.T4PWM_GPIOB7=0;
GpioMuxRegs.GPBDIR.bit.GPIOB7=1;
GpioDataRegs.GPBDAT.bit.GPIOB7=0;
//Ev capture
GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8 =1;
//7758 CS
GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9 = 0;
GpioMuxRegs.GPBDIR.bit.GPIOB9 = 1;
GpioDataRegs.GPBDAT.bit.GPIOB9 = 1;
// switch between 232 and infrared
GpioMuxRegs.GPBMUX.bit.C5TRIP_GPIOB14 =0;
GpioMuxRegs.GPBDIR.bit.GPIOB14 =0;
//Lan CMD
GpioMuxRegs.GPBMUX.bit.C6TRIP_GPIOB15 =0;
GpioMuxRegs.GPBDIR.bit.GPIOB15 =1;
GpioDataRegs.GPBDAT.bit.GPIOB15 =0;
//GPRS Power Control ???
GpioMuxRegs.GPDMUX.bit.T1CTRIP_PDPA_GPIOD0 =0;
GpioMuxRegs.GPDDIR.bit.GPIOD0 =1;
//Mc39i startup contol???
GpioMuxRegs.GPDMUX.bit.T2CTRIP_SOCA_GPIOD1 =0;
GpioMuxRegs.GPDDIR.bit.GPIOD1 =1;
//Co110pc reset control ???
GpioMuxRegs.GPDMUX.bit.T3CTRIP_PDPB_GPIOD5 =0;
GpioMuxRegs.GPDDIR.bit.GPIOD5 =1;
//External interupt 7758,1306,tl16c752
GpioMuxRegs.GPEMUX.all =0x7;
GpioMuxRegs.GPFMUX.all |= 0x000F;//spi function
//Sci module
GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4=1;
GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5=1;
GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4=1;
GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5=1;
//running lamp
GpioMuxRegs.GPFMUX.bit.XF_GPIOF14=0;
GpioMuxRegs.GPFDIR.bit.GPIOF14=1;
GpioDataRegs.GPFDAT.bit.GPIOF14=1;
EDIS;
}
//初始化PIE中断 外部中断1 外部中断2 ADC中断 CAP4中断 SCIA SCIB中断
void InitPieCtrl(void)
{
// Disable PIE:
PieCtrlRegs.PIECRTL.bit.ENPIE = 0;
// set PIEIER registers :
PieCtrlRegs.PIEIER1.all = 0x30;//ADC+xint2 //+xint1
PieCtrlRegs.PIEIER2.all = 0;
PieCtrlRegs.PIEIER3.all = 0;
PieCtrlRegs.PIEIER4.all = 0;
PieCtrlRegs.PIEIER5.all = 0x10;//cap4
PieCtrlRegs.PIEIER6.all = 0;
PieCtrlRegs.PIEIER7.all = 0;
PieCtrlRegs.PIEIER8.all = 0;
PieCtrlRegs.PIEIER9.all = 0xF;//SciA SciB
PieCtrlRegs.PIEIER10.all = 0;
PieCtrlRegs.PIEIER11.all = 0;
PieCtrlRegs.PIEIER12.all = 0;
// Clear all PIEIFR registers:
PieCtrlRegs.PIEIFR1.all = 0;
PieCtrlRegs.PIEIFR2.all = 0;
PieCtrlRegs.PIEIFR3.all = 0;
PieCtrlRegs.PIEIFR4.all = 0;
PieCtrlRegs.PIEIFR5.all = 0;
PieCtrlRegs.PIEIFR6.all = 0;
PieCtrlRegs.PIEIFR7.all = 0;
PieCtrlRegs.PIEIFR8.all = 0;
PieCtrlRegs.PIEIFR9.all = 0;
PieCtrlRegs.PIEIFR10.all = 0;
PieCtrlRegs.PIEIFR11.all = 0;
PieCtrlRegs.PIEIFR12.all = 0;
// Enable PIE:
PieCtrlRegs.PIECRTL.bit.ENPIE = 1;
PieCtrlRegs.PIEACK.all = 0xFFFF;
}
//初始化SCIA SCIB
void InitSci(void)
{
int mintime;//最小等待时间
//波特率参数选择
switch (ComParm[0].baudrate)
{
case BD_1200 :
SciaRegs.SCIHBAUD=0xC;
SciaRegs.SCILBAUD=0x32;
mintime = 12;
break;
case BD_2400 :
SciaRegs.SCIHBAUD=0x6;
SciaRegs.SCILBAUD=0x19;
mintime = 10;
break;
case BD_4800 :
SciaRegs.SCIHBAUD=0x3;
SciaRegs.SCILBAUD=0x0C;
mintime = 8;
break;
case BD_9600 :
SciaRegs.SCIHBAUD=0x1;
SciaRegs.SCILBAUD=0x85;
mintime = 5;
break;
case BD_19200 :
SciaRegs.SCIHBAUD=0x0;
SciaRegs.SCILBAUD=0xC2;
mintime = 4;
break;
case BD_38400 :
SciaRegs.SCIHBAUD=0x0;
SciaRegs.SCILBAUD=0x60;
mintime = 2;
break;
case BD_57600 :
SciaRegs.SCIHBAUD=0x0;
SciaRegs.SCILBAUD=0x41;
mintime = 2;
break;
case BD_115200:
SciaRegs.SCIHBAUD=0x0;
SciaRegs.SCILBAUD=0x1F;
mintime = 2;
break;
default:
SciaRegs.SCIHBAUD = 0xC;
SciaRegs.SCILBAUD = 0x32;
mintime = 5;
break;
}
if(ComParm[0].txouttime < mintime)
{
ComParm[0].txouttime = mintime;
}
if(ComParm[0].rxouttime < mintime)
{
ComParm[0].rxouttime = mintime;
}
// Initialize SCI-A:
SciaRegs.SCICCR.all=0x67;//一个停止位,偶校验,八位字符
SciaRegs.SCICTL1.all=0x3;//使能发送接收
SciaRegs.SCICTL2.all=0x3;//使能发送接收中断
SciaRegs.SCIPRI.bit.FREE=1;//当前接收/发送结束后再停止
SciaRegs.SCIFFTX.all=0xE000; //FIFO及其发送使能,发送中断级位为0,但暂不使能
SciaRegs.SCIFFRX.all=0x2021; //FIFO接收中断使能,级位为1
SciaRegs.SCICTL1.bit.RXERRINTENA = 1;
SciaRegs.SCIFFCT.bit.FFTXDLY=0x0F; //从FIFO寄存器到发送移位寄存器的延迟,可根据需要调整
SciaRegs.SCICTL1.bit.SWRESET=1; //SCIA使能,脱离复位状态
//波特率参数选择
switch (ComParm[1].baudrate)
{
case BD_1200 :
ScibRegs.SCIHBAUD=0xC;
ScibRegs.SCILBAUD=0x32;
mintime = 12;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -