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

📄 board.c

📁 基于ARM7的直流电机的驱动,还有FLASH驱动,LCD驱动等
💻 C
📖 第 1 页 / 共 2 页
字号:
static ULONG	factor = 0xC4BA;

// 微秒延时
void
udelay(ULONG us) {
	dlycnt = us * factor / 10000;
	while(dlycnt != 0)
		dlycnt--;
}

// 毫秒延时
void
mdelay(ULONG ms) {
	while(ms--)
		udelay(1000);
}

static void
Port_Init(void) {
    ///****PortA 使用默认值****/      10-bit output

    //*********断口 PortB配置********/  11-bit output
    //    引脚       功能       配置值
    //  PortB.10    nGCS5         1
    //  PortB.09    nGCS4         1
    //  PortB.08    nGCS3         1

    //  PortB.07    nGCS2         1
    //  PortB.06    nGCS1         1
    //  PortB.05    OUTPUT        0
    //  PortB.04    OUTPUT        0
    //  PortB.03    nSRAS         1
    //  PortB.02    nSCAS         1
    //  PortB.01    SCLK          1
    //  PortB.00    SCKE          1
    rPCONB = 0x000007CF;//端口配置寄存器,决定每个引脚功能
    rPDATB = 0x07EF;//端口数据寄存器
	rPCONB |= 1 << 4;

    //*********端口 PortC配置********/  16-bit input/output
    //    引脚       功能       配置值
    //  PortC.15   Input          00
    //  PortC.14   Input          00
    //  PortC.13   RxD1           11
    //  PortC.12   TxD1           11
    //  PortC.11   Output         01
    //  PortC.10   Output         01
    //  PortC.09   Output         01
    //  PortC.08   Input          00

    //  PortC.07   VD4            11
    //  PortC.06   VD5            11
    //  PortC.05   VD6            11
    //  PortC.04   VD7            11
    //  PortC.03   IISCLK         11    01     OUTPUT
    //  PortC.02   IISDI          11    01     OUTPUT
    //  PortC.01   IISDO          11    01     OUTPUT
    //  PortC.00   IISRLCK        11    01     OUTPUT
    rPCONC = 0x0F54FF55;
    rPDATC = 0xFEFF;
    rPUPE |= 0xC000; //端口上拉寄存器

    //*********端口 PortD配置********/   8-bit input/output
    //    引脚     功能         配置值
    //  PortD.07   VFRAME         10
    //  PortD.06   VM             10
    //  PortD.05   VLINE          10
    //  PortD.04   VCLK           10
    //  PortD.03   VD3            10
    //  PortD.02   VD2            10
    //  PortD.01   VD1            10
    //  PortD.00   VD0            10
    rPCOND = 0x0000AAAA;
    rPDATD = 0xFF;

    //*********端口 PortE配置********/   9-bit input/output
    //    引脚      功能        配置值
    //  PortE.08   CODECLK        10
    //  PortE.07   OutPut         01  10  TOUT4          D5
    //  PortE.06   OutPut         01            D4
    //  PortE.05   OutPut         01            D3
    //  PortE.04   OutPut         01  10  TOUT1          D2
    //  PortE.03   OutPut         01  
    //  PortE.02   RxD0           10
    //  PortE.01   TxD0           10
    //  PortE.00   OutPut         00            
    rPCONE = 0x00029668;
    rPDATE = 0x1FF;
    rPUPE |= 0x0FF06; 

    //*********端口 PortF配置********/   9-bit input/output
    //    引脚      功能        配置值
    //  PortF.08   SIOCLK        011
    //  PortF.07   SIORxD        011
    //  PortF.06   SIORDY        011   001 OUTPUT
    //  PortF.05   SIOTXD        011
    //  PortF.04   nXDREQ0        11
    //  PortF.03   nXDACK0        11
    //  PortF.02   nWAIT          10
    //  PortF.01   IICSDA         10
    //  PortF.00   IICSCL         10
    //rPCONF = 0x001B2FEA;

    //*********端口 PortG配置********/  8-bit input/output
    //    引脚      功能        配置值
    //  PortG.07   IISLRCK        10
    //  PortG.06   IISDO          10
    //  PortG.05   IISDI          10
    //  PortG.04   IISCLK         10
    //  PortG.03   INPUT          00      11  --EINT3
    //  PortG.02   EINT2          11
    //  PortG.01   EINT1          11
    //  PortG.00   EINT0          11    
    rPCONG = 0xAAFF;
	rPDATG = 0x2;
	rPUPG = 0x0;

    /***** 外部中断触发模式配置 *****/
    
    // 000 低电平中断
    // 001 高电平中断
    // 01x 下降沿触发
    // 10x 上升沿触发
    // 11x 沿触发
    
    // SL811HS高电平中断输出,我们将它反向接EINT0
	rEXTINT = 0x22;		// FIXED ME!!! SL811HS/EINT0下降沿触发,MCP2510/EINT1低电平触发
    
}

//将BIN码转换成BCD码
#define Byte2Bcd(x)	__bin2bcd[x]

//将BCD码转换成BIN码
#define Bcd2Byte(x)	__bcd2bin[x];

const UCHAR __bcd2bin[] = {
	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 0, 0, 0, 0, 0, 0,
	10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0,
	20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0,
	30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0,
	40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0,
	50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, 0, 0, 0, 0,
	60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, 0, 0, 0, 0, 0,
	70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 0, 0, 0, 0, 0, 0,
	80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 0, 0, 0, 0, 0, 0,
	90, 91, 92, 93, 94, 95, 96, 97, 98, 99
};

const UCHAR __bin2bcd[] = {
	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
	0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
	0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
	0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
	0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99
};

// 设置时钟时间
void
SetTime(struct tm *t) {
	int psw;
	
	CHECK_PTR(t);
	
	psw = interrupts_disable();
	rRTCCON = 0x01;    // R/W enable, 1/32768, Normal(merge), No reset
	rBCDYEAR = Byte2Bcd(t->tm_year - 2000);
    rBCDMON  = Byte2Bcd(t->tm_mon);
    rBCDDAY  = Byte2Bcd(t->tm_mday);
    //rBCDDATE = Byte2Bcd(t->tm_wday);// SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
    rBCDHOUR = Byte2Bcd(t->tm_hour);
    rBCDMIN  = Byte2Bcd(t->tm_min);
    rBCDSEC  = Byte2Bcd(t->tm_sec);
    rRTCCON = 0x00;
    interrupts_enable(psw);
}

// 读时钟时间
void
GetTime(struct tm *t) {
	int psw;
	
	CHECK_PTR(t);
	
	psw = interrupts_disable();
    rRTCCON = 0x01;    // R/W enable, 1/32768, Normal(merge), No reset
   	t->tm_year = 2000 + Bcd2Byte(rBCDYEAR);
   	t->tm_mon = Bcd2Byte(rBCDMON);
   	t->tm_mday = Bcd2Byte(rBCDDAY);
   	t->tm_wday = Bcd2Byte(rBCDDATE);
   	t->tm_hour = Bcd2Byte(rBCDHOUR);
   	t->tm_min = Bcd2Byte(rBCDMIN);
   	t->tm_sec = Bcd2Byte(rBCDSEC);
    rRTCCON = 0x00;
    interrupts_enable(psw);
}


// 初始化实时实钟
static void
bspRtcInit(void) {
	rRTCALM = 0x0;	// disable alarm
    rRTCCON = 0x00; // R/W disable(for power consumption), 1/32768, Normal(merge), No reset
}
void
PwmInit(void){
       
/*设置定时器的预分频值:TIME0/1=255,TIME2/3=0,TIME4/5=255*/
rTCFG0=0X1e1e1e;//参考TCFG0表
/*设置定时器的工作模式;中断模式,设置时频驱动器取值:TIME0、TIME1、TIME2、TIME3、TIME4为1/4*/
rTCFG1=0x01;//参考TCFG1表

     rTCON &= ~(1 << 8);   //关闭PWM1
     	
     rTCON &= ~(1 << 20);  //关闭PWM4
        
     rPDATC |= 1;          //MC33883 GN控制置高,关闭输出
     
}

/****************************************************************************
【功能说明】模数转换初始化
****************************************************************************/
void 
ADC_Init(void)
{
	int i;
	rCLKCON = rCLKCON | (1<<12);		//控制系统主时钟进入ADC单元模块
	rADCCON = 0x1|(0<<2);		//ADC转换使能,选择AIN7
    for(i=0;i<1000;i++);		//最小15uS
	rADCPSR = 10000;		//ADC转换频率为:(int)(MCLK/(2*(rADCPSR+1))/16)

    //printf("ADC Feq = %d(Hz)\n\n",(int)(MCLK_D/(2.*(10+1.))/16.) );
}
//***************************************************************************


// bsp初始化
void
bspInit(void) {
	//配置Cache
   	//rSYSCFG = SYSCFG_8KB;		//使用8K字节的指令缓存
   	//rNCACHBE0=((0x0c000000UL>>12)<<16)|(0x02000000UL>>12);
   	rSYSCFG = (0 << 0)	// stall disable
   		| (3 << 1)		// Full Cache enable (8KB cache)
   		| (1 << 3)		// Enable write buffer operation
   		| (0 << 4)		// read stall disable
   		| (0 << 5)		// Enable data abort
   		;

	//rSYSCFG = 0;

   	// DISABLE CACHE nGCS3(SL811HS) AND LCD VIDEORAM
	rNCACHBE0 = ((0x0C080000UL >> 12) << 16) | (0x200000UL >> 12);
	
	ChangePllValue(52, 3, 1 );	//设置CPU频率为60M
	
	Port_Init();
	
	clrwtd();
	
	// 关闭蜂鸣器
	rPCONB |= 1 << 4;

	// 设置中断向量
	IntConnect(ISR_UNDEF, (uint)UndefHandler);
	IntConnect(ISR_PABORT, (uint)PrefechAbortHandler);
	IntConnect(ISR_DABORT, (uint)DataAbortHandler);
	IntConnect(ISR_SWI,	(uint)SwiHandler);
	
	// 设置EINT0-EINT3中断向量
	IntConnect(ISR_EINT0, (uint)EINT0Handler);
	IntConnect(ISR_EINT1, (uint)EINT1Handler);
	IntConnect(ISR_EINT2, (uint)EINT2Handler);
	IntConnect(ISR_EINT3, (uint)EINT3Handler);

	//设置Timer1中断向量
	IntConnect(ISR_TIMER1,(uint)Timer1Handler);
	// 设置系统时钟中断向量
	IntConnect(ISR_TIMER5, (uint)TickHandler);
	
	// 初始化系统时钟
	bspInitClock();
	
	// 初始化实时时钟
	bspRtcInit();

	// 初始化Pwm
	PwmInit();
	// 初始化AD
	ADC_Init();
	
	//bspInitSio();
	
	// 允许中断
	rINTMSK &= ~(BIT_GLOBAL);
	// 允许EINT0中断
	rINTMSK &= ~(BIT_EINT0);
//	rINTMSK &= ~(BIT_EINT1);
//	rINTMSK &= ~(BIT_EINT2);
//	rINTMSK &= ~(BIT_EINT3);
	// 不允许time中断
	rINTMSK |= BIT_TIMER0;
	rINTMSK |= BIT_TIMER1;
	rINTMSK |= BIT_TIMER2;
	rINTMSK |= BIT_TIMER3;
	rINTMSK |= BIT_TIMER4;

	
}

⌨️ 快捷键说明

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