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

📄 init.c

📁 我用ARM写的一些东西
💻 C
字号:
#include "config.h"

#define Start 		1 
#define StandBy		2
#define LeakDtc		3
#define Error 		4




extern void __irq IRQ_UART1(void);
extern void __irq IRQ_UART0 (void);
extern void __irq IRQ_Timer0 (void);
extern void __irq IRQ_Timer1 (void);
extern void __irq IRQ_I2C(void);
extern void __irq IRQ_Bod(void);
extern void __irq IRQ_Eint3(void);
extern void ad_ch_scal(unsigned char  ch,uint8 scal);
extern void ad_init(void);
extern uint8 MSPI_SendData(uint8 dat);


extern uint16 IntAdDat[6];
extern uint32  SysErrNum;
/* 定义串口模式设置数据结构 */
typedef struct UartMode
{
	uint8 datab;		// 字长度,5/6/7/8可选
	uint8 stopb;		// 停止位,1/2可选
	uint8 parity;		// 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;

/*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时
** 入口参数 :dly	延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************
*/
 
 
/*******************************************************************************************
port init
*******************************************************************************************/
void PortInit(void)
{
	PINSEL0=0;
	PINSEL1=0;
	//PINSEL0=(PINSEL0&(~0X03))|0X02;//p0.0 ,p0.1 配制为uart口
	PINSEL0=(PINSEL0&(~0X0F))|0X05;//p0.0 ,p0.1 配制为uart口
	PINSEL0=(PINSEL0&(~(0X0F<<4)))|(0X05<<4);//p0.2 ,p0.3 配制为I2C口
	
	//PINSEL0=(PINSEL0&(~(0X0F<<8)))|(0X01<<8);//p0.4 配制为spi口
	//PINSEL0=(PINSEL0&(~(0X0F<<12)))|(0X01<<12);//p0.6 配制为spi口
	
	PINSEL0=(PINSEL0&(~(0X03<<14)))|(0X02<<14);//p0.7  配制为PWM2
	PINSEL0=(PINSEL0&(~(0X0F<<16)))|(0X05<<16);//p0.8 ,p0.9 配制为uart口
	
	PINSEL0=(PINSEL0&(~(0X03<<20)))|(0X03<<20);//p0.10  配制为Inter Ad1.2
	PINSEL0=(PINSEL0&(~(0X0F<<24)))|(0X0F<<24);//p0.12 ,p0.13 配制为Inter Ad1.3,Ad1.4
 	PINSEL0=(PINSEL0&(~(0X0003<<30)))|(0X0003<<30);//p0.15  配制为Inter Ad1.5
	
	PINSEL1=(PINSEL1&(~(0X03<<10)))|(0X02<<10);//p0.21  配制为Inter Ad1.6
	
	PINSEL1=(PINSEL1&(~(0X01<<20)))|(0X01<<20);//p0.15   ->ad0.5
	
	PINSEL1=(PINSEL1&(~(0X02<<28)))|(0X02<<28);//p0.30   ->ex3 //外部中断3
	
	
	PINSEL2=(PINSEL2&(~(0X01<<2)))|(0X01<<2);//P1.26~P1.36  配制为 JTAG 调试
	PINSEL2=(PINSEL2&(~(0X01<<3)))|(0X00<<3);//P1.25~P1.16  配制为 GPIO
	
 
	IO0DIR   = IO0DIR | BEEP	;
	IO0DIR   = IO0DIR | PWM2	;
	IO0DIR   = IO0DIR | Var1	;
	IO0DIR   = IO0DIR | Var2	;
	IO0DIR   = IO0DIR | Var3	;
	IO0DIR   = IO0DIR | Var4	;
	IO0DIR   = IO0DIR | Var6	;
	
	IO1DIR   = IO1DIR | VcuumOut1;
	IO0DIR   = IO0DIR | Dx10r2;
	IO0DIR   = IO0DIR | AlarmRel;
	
	IO0DIR   = IO0DIR | AD_DAT;
	

	
	IO1DIR   = IO1DIR | Var5;				//p1
	IO1DIR   = IO1DIR | VcuumOut2;  		//p1
	IO1DIR   = IO1DIR | DxBoard;			//p1
	IO0DIR   = IO0DIR | TmpCtrl;			//p1
	
	IO1DIR   = IO1DIR | HC595_CS;
	IO0DIR   = IO0DIR | HC595_CLK;
	IO0DIR   = IO0DIR | HC595_DAT;
	
	IO1DIR   = IO1DIR | DA_DAT;
	IO1DIR   = IO1DIR | DA_CLK;

	
	
	
	
	
}	

/********************************************************************************************/
void I2cInit(uint32 Fi2c)
{
	if (Fi2c > 400000)
		Fi2c = 400000;
		
   	//PINSEL0 = (PINSEL0 & 0xFFFFFF0F) | 0x50; 			/* 设置I2C控制口有效 				*/
	//PINSEL0 = (PINSEL0 & (~0xF0)) | 0x50; 				// 不影响其它管脚连接
	I2SCLH = (Fpclk/Fi2c + 1) / 2;						/* 设定I2C时钟 						*/
	I2SCLL = (Fpclk/Fi2c)/2;
	I2CONCLR = 0x2C;
	I2CONSET = 0x40;									/* 使能主I2C 						*/
	
	/* 设置I2C中断允许 */
	VICIntSelect = 0x00000000;							/* 设置所有通道为IRQ中断 			*/
	VICVectCntl3 = (0x20 | 0x09);						/* I2C通道分配到IRQ slot0,最高优先级 */
	VICVectAddr3 = (int32)IRQ_I2C;						/* 设置I2C中断向量 					*/
	VICIntEnable = VICIntEnable|(1 << 9);							/* 使能I2C中断 						*/
}



/*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud	波特率
**			  set	模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
*********************************************************************************************************
*/

void ExInt3Init(void)
{
	
	/* 外部中断3初始化 */

	
	EXTPOLAR=0x00;
	EXTMODE=0x08;
	VICIntSelect   = 0x00000000;		// 设置所有中断分配为IRQ中断
	VICVectCntl0   = 0x20 | 17;			// 分配外部中断0到向量中断0
	VICVectAddr0   = (uint32)IRQ_Eint3;	// 设置中断服务程序地址
	EXTINT         = 0x08;				// 清除EINT0中断标志
	VICIntEnable   = 1 << 17;			// 使能EINT0中断
	//EXTWAKE        = 0x01;				// 外部中断0唤醒芯片
	
}


int8 UART1_Init (uint32 baud, UARTMODE set)
{
	uint32 bak;
	
	/* 参数过滤 */
	if ((baud ==0 ) || (baud > 115200))	return (0);
	if ((set.datab <5) || (set.datab > 8))	return (0);
	if ((set.stopb == 0) || (set.stopb > 2)) 	return (0);
	if (set.parity > 4)	return (0);
	
	/* 设置串口波特率 */
	U1LCR = 0x80;						// DLAB = 1	
	bak   = (Fpclk >> 4) / baud;
	U1DLM = bak >> 8;
	U1DLL = bak & 0xFF;
	
	/* 设置串口模式 */
	bak   = set.datab - 5;				// 设置字长
	if (set.stopb == 2)	bak |= 0x04;	// 判断是否为2位停止位
	
	if (set.parity != 0)
	{
		set.parity = set.parity - 1;
		bak |= 0x08;
	}
	bak |= set.parity << 4;				// 设置奇偶校验
	
	U1LCR = bak;
	U1FCR=0x41;//4字触发
	U1IER=0x01;
	 
	IRQEnable();
	VICIntSelect=0x000000;
	VICVectCntl1=0x20|0x07;  //uart1 最高中断优先
	VICVectAddr1=(uint32)IRQ_UART1; //设置中断入口
	VICIntEnable=VICIntEnable|(1<<0x07); //开启UART1
	
	return (1);
}


int8 UART0_Init (uint32 baud, UARTMODE set)
{
	uint32 bak;
	
	/* 参数过滤 */
	if ((baud ==0 ) || (baud > 115200))	return (0);
	if ((set.datab <5) || (set.datab > 8))	return (0);
	if ((set.stopb == 0) || (set.stopb > 2)) 	return (0);
	if (set.parity > 4)	return (0);
	
	/* 设置串口波特率 */
	U0LCR = 0x80;						// DLAB = 1	
	bak   = (Fpclk >> 4) / baud;
	U0DLM = bak >> 8;
	U0DLL = bak & 0xFF;
	
	/* 设置串口模式 */
	bak   = set.datab - 5;				// 设置字长
	if (set.stopb == 2)	bak |= 0x04;	// 判断是否为2位停止位
	
	if (set.parity != 0)
	{
		set.parity = set.parity - 1;
		bak |= 0x08;
	}
	bak |= set.parity << 4;				// 设置奇偶校验
	
	U0LCR = bak;
	U0FCR=0x41;//4字触发
	U0IER=0x01;
	 
	IRQEnable();
	VICIntSelect=0x000000;
	VICVectCntl6=0x20|0x06;  //uart0 最高中断优先
	VICVectAddr6=(uint32)IRQ_UART0; //设置中断入口
	VICIntEnable=VICIntEnable|(1<<0x06); //开启UART1
	
	return (1);
}


/**********************************************************************************/

void Tm0Init(void)
{

	//PINSEL1 = 0x00000000;			/* 设置管脚连接GPIO							*/

	
	IRQEnable();					/* IRQ中断使能								*/
	
	/* 定时器0初始化 */
	T0TC   = 0;			/* 定时器设置为0										*/
	T0PR   = 0;			/* 时钟不分频											*/
	T0MCR  = 0x03;		/* 设置T0MR0匹配后复位T0TC,并产生中断标志				*/
	T0MR0  = Fpclk / 60;	/* 0.5秒钟定时/2;/4=0.25s?		//used div 60									*/
	T0TCR  = 0x01;		/* 启动定时器											*/
	
	/* 设置定时器0中断IRQ */
	VICIntSelect = 0x00;				/* 所有中断通道设置为IRQ中断			*/
	VICVectCntl2 = 0x20 | 0x04;			/* 设置定时器0中断通道分配最2优先级	*/
	VICVectAddr2 = (uint32)IRQ_Timer0;	/* 设置中断服务程序地址					*/
	VICIntEnable =VICIntEnable|( 1 << 0x04);			/* 使能定时器0中断						*/
}
 
 
void Tm1Init(void)
{

	//PINSEL1 = 0x00000000;			/* 设置管脚连接GPIO							*/

	IRQEnable();					/* IRQ中断使能								*/
	
	/* 定时器1初始化 */
	T1TC   = 0;			/* 定时器设置为0										*/
	T1PR   = 0;			/* 时钟不分频											*/
	T1MCR  = 0x03;		/* 设置T0MR1匹配后复位T1TC,并产生中断标志				*/
	T1MR0  = Fpclk / 2;	/* 0.5秒钟定时/2;/40.25s?											*/
	T1TCR  = 0x01;		/* 启动定时器											*/
	
	/* 设置定时器1中断IRQ */
	VICIntSelect = 0x00;				/* 所有中断通道设置为IRQ中断			*/
	VICVectCntl4 = 0x20 | 0x05;			/* 设置定时器1中断通道分配最2优先级	*/
	VICVectAddr4 = (uint32)IRQ_Timer1;	/* 设置中断服务程序地址					*/
	VICIntEnable = VICIntEnable|(1 << 0x05);			/* 使能定时器1中断						*/
}
 

/**********************************************************************************/
/**********************************************************************************/
/*******       ad初始化                       ********************************************************/
void InterAdInit(void)
{
	/* 进行ADC模块设置 */
	AD0CR = //(1 << 5)						|	// SEL=8,选择通道5
			((Fpclk / 3000000 - 1) << 8)	|	// CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
			(0 << 16)						|	// BURST=0,软件控制转换操作
			(0 << 17)						|	// CLKS=0, 使用11clock转换
			(1 << 21)						|  	// PDN=1,正常工作模式
			(0 << 22)						|  	// TEST1:0=00,正常工作模式
			//(1 << 24)						|	// START=1,直接启动ADC转换
			(0 << 27);						 	// 直接启动ADC转换时,此位无效
	      
	/* 进行ADC模块设置 */
	AD1CR = //(1 << 2)						|	// SEL=8,选择通道2
			((Fpclk / 3000000 - 1) << 8)	|	// CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
			(0 << 16)						|	// BURST=0,软件控制转换操作
			(0 << 17)						|	// CLKS=0, 使用11clock转换
			(1 << 21)						|  	// PDN=1,正常工作模式
			(0 << 22)						|  	// TEST1:0=00,正常工作模式
			//(1 << 24)						|	// START=1,直接启动ADC转换
			(0 << 27);						 	// 直接启动ADC转换时,此位无效   

}

/**********************************************************************************/
/**********************************************************************************/
/*******     spi                       ********************************************************/
/*
void  MSPI_Init(void)
{  
	//PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500;	// 设置管脚连接SPI
	//PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;
    SPCCR = 0x16;		            // 设置SPI时钟分频
 	SPCR  = (0 << 3) |				// CPHA = 0, 数据在SCK 的第一个时钟沿采样
 			(1 << 4) |				// CPOL = 1, SCK 为低有效
 			(1 << 5) |				// MSTR = 1, SPI 处于主模式
 			(0 << 6) |				// LSBF = 0, SPI 数据传输MSB (位7)在先
 			(0 << 7);				// SPIE = 0, SPI 中断被禁止
}*/

/*
void Bod()
{
	IRQEnable();					/* IRQ中断使能								*/
	
	/* 定时器1初始化 */

/*	VICIntSelect = 0x00;				/* 所有中断通道设置为IRQ中断			*/
/*	VICVectCntl0 = 0x20 | 20;			/* 设置定时器1中断通道分配最2优先级	*/
/*	VICVectAddr0 = (uint32)IRQ_Bod;	/* 设置中断服务程序地址					*/
/*	VICIntEnable = VICIntEnable|(1 << 20);			/* 使能定时器1中断*/
/*}*/

void Pwm2Init()
{
    PWMPR    = 0x00;		    // 不分频,计数频率为Fpclk
    PWMMCR   = 0x02;			// 设置PWMMR0匹配时复位PWMTC
    PWMPCR   = 0x0400;			// 允许PWM2输出,单边PWM
    PWMMR0   = Fpclk / 200;
    //PWMMR1   = PWMMR0 / 2;		// 50%占空比
    PWMMR2   = PWMMR0 *0/4;		// 50%占空比
    PWMLER   = 0x07;			// PWM0和PWM2匹配锁存
    PWMTCR   = 0x02;            // 复位PWMTC
    PWMTCR   = 0x09;            // 启动PWM输出
	 
}


void SysInit(void)
{
	 UARTMODE set;
	 
	 set.datab=8; 
	 set.stopb=1;
	 set.parity=0;
	 
	 PortInit();
	 
	 //WDMOD=0x00;
	 IO0CLR = AD_DAT;
	 IO0CLR = BEEP;			// BEEP	蜂鸣
	 DelayNS(50);
	 IO0SET = BEEP;			// BEEP停止蜂鸣

	 I2cInit(20000);
	 UART1_Init (115200,set);	//串口1初始化
 	 UART0_Init (115200,set);	//串口0初始化

	 Tm0Init();				//定时器0初始化	
	 Tm1Init();				//定时器1初始化	
	 InterAdInit();			//内部AD初始化
	 //Bod();
	 Pwm2Init();
	 

	DelayNS(10);	
	IO0DIR = IO0DIR | AD_DAT; //输出
	IO0DIR = IO0DIR | AD_DAT; //输出
	IO0DIR = IO0DIR | AD_DAT; //输出
	IO0DIR = IO0DIR | AD_DAT; //输出
	IO0DIR = IO0DIR | AD_DAT; //输出
	DelayNS(10); 
	Cs7705(0);
	
	
	 ad_init();
	 
	 ad_ch_scal(0,0);

	Cs7705(1);
	 
	ExInt3Init();
	 

	 
	 
	 
}

⌨️ 快捷键说明

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