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

📄 initall.c

📁 此代码应用与f2812的通讯程序!!方便用户编程!
💻 C
📖 第 1 页 / 共 2 页
字号:

/**************************************************************************/
//  文件名称: 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 + -