📄 board.c
字号:
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 + -