?? init.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 + -