📄 sysutils.c
字号:
/****************************************************************************/
/*
文 件 名: SysUtil.c
说 明: 简单的系统程序
作 者: 郭天祥
日 期: 2008.9
*/
/*****************************************************************************/
#include "..\inc\44b0x.h"
#include "..\inc\uTypes.h"
#include "..\inc\sysUtils.h"
#include "..\inc\console.h"
#define EXT_OSC_CLK 10000000 //外部晶振频率大小
U32 g_dwMCLK = 20000000; //初始值20MHz
/******************************************
函数名称: sysUtilsUSecDelay
功 能: 延迟指定的us数
参 数: dwUs - 延迟的us数
*******************************************/
void sysUtilsUSecDelay (U32 dwUs)
{
U32 dwCnt;
dwCnt = dwUs * (g_dwMCLK/4000000);
while(dwCnt--)
{
// if (dwCnt == 1) //校准延时使用
// printf ("hello World");
}
}
/*****************************************
函数名称: sysUtilsDelay
功 能: 延迟指定CPU cycle
参 数: dwTime - 延迟的CPU周期数
******************************************/
void sysUtilsDelay (U32 dwTime)
{
while (dwTime --);
}
/*****************************************
功能 :设置系统的锁相环
参数 :nMDiv ----
:nPDiv ----
:nSDiv ----
******************************************/
STATUS sysUtilsSetPllValue (int nMDiv, int nPDiv, int nSDiv)
{
int i = 1;
rPLLCON = (nMDiv<<12)|(nPDiv<<4)|nSDiv;
while(nSDiv--)
i *= 2;
g_dwMCLK = (EXT_OSC_CLK*(nMDiv+8))/((nPDiv+2)*i);
return STATUS_OK;
}
/*设置主要的时钟*/
STATUS sysUtilsSetMainClk (U32 nMCLK)
{
if (0 == nMCLK)
{
return STATUS_ERR;
}
g_dwMCLK = nMCLK;
return STATUS_OK;
}
/*定时器的初始化*/
void InitSysTimer(U8 Freq)
{
rTCON &= 0xf0ffffff; //clear manual update bit, stop Timer 5
rTCFG0 &= 0xff00ffff; //定时器4/5的预分频为16
rTCFG0 |= (16-1)<<16;
rTCFG1 &= 0xff0fffff; //定时器5的MUX为1/8
rTCFG1 |= 2<<20;
rTCNTB5 = g_dwMCLK/(Freq*16*8); //定时器5的重装值,在ENABLE之前设定
rTCON |= 0x02000000; //定时器5的MANUAL UPDATE BIT设为1
rTCON &= 0xf0ffffff; //MANUAL UPDATE BIT清零
rTCON |= 0x05000000; //定时器5 start, 设为INTERVAL模式
}
#define MaxBeepFreq 20000
#define MinBeepFreq 20
/*pwm控制*/
void SetBeepPwm(U16 Freq, U8 HiRatio)
{
if(Freq>MaxBeepFreq)
Freq = MaxBeepFreq;
if(HiRatio>100)
HiRatio = 100;
rTCON &= 0xffff0fff; // clear manual update bit, stop Timer2
rTCFG0 &= 0xffff00ff; // set Timer 2&3 prescaler 0
rTCFG1 &= 0xfffff0ff; // set Timer 2 MUX 1/16
rTCFG1 |= 0x00000300;
rTCNTB2 = g_dwMCLK/(Freq*16); //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
rTCMPB2 = (rTCNTB2*(100-HiRatio))/100; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high
rTCON |= 0x00002000; // manual update
rTCON &= 0xffff0fff; // clear manal update bit
rTCON |= 0x0000d000; // auto reload, inverter on, start Timer 5
}
/***************************
函数名称: IoConfig
功 能: 初始化IO口
****************************/
void IoConfig (void)
{
// PORT A GROUP
/* BIT 9 8 7 6 5 4 3 2 1 0 */
/* A24 A23 A22 A21 A20 A19 A18 A17 A16 A0 */
/* 0 1 1 1 1 1 1 1 1 1 */
rPCONA = 0x1ff;
// PORT B GROUP
/* BIT 10 9 8 7 6 5 4 3 2 1 0 */
/* /CS5 /CS4 /CS3 /CS2 /CS1 nWBE3 nWBE2 /SRAS /SCAS SCLK SCKE */
/* EXT NIC 8019 IDE D12 NC NC Sdram Sdram Sdram Sdram */
/* 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 */
rPDATB = 0x04f;
rPCONB = 0x7cf;
//PORT C GROUP
//BUSWIDTH=16 */
/* PC15 14 13 12 11 10 9 8 */
/* o o RXD1 TXD1 o o o o */
/* NC NC Uart1 Uart1 NC NC NC NC */
/* 01 01 11 11 01 01 01 01 */
/* PC7 6 5 4 3 2 1 0 */
/* o o o o o o o o */
/* NC NC NC NC LED LED LED LED */
/* 01 01 01 01 01 01 01 01 */
rPDATC = (1<<13)|(1<<3); //All IO is low
rPCONC = 0x55555555;
rPUPC = 0x0; //PULL UP RESISTOR should be enabled to I/O
//PORT D GROUP
/* PORT D GROUP(I/O OR LCD) */
/* BIT7 6 5 4 3 2 1 0 */
/* VF VM VLINE VCLK VD3 VD2 VD1 VD0 */
/* 01 01 01 01 01 01 01 01 */
rPDATD = 0xffff;
rPCOND = 0x5555;
rPUPD = 0x0; //PULL UP RESISTOR should be enabled to I/O
//These pins must be set only after CPU's internal LCD controller is enable
/////////////////////////////////////////////////////
//PORT E GROUP
/* Bit 8 7 6 5 4 3 2 1 0 */
/* ENDLAN o o TOU2 o o RXD0 TXD0 FOUT */
/* 00 01 01 10 01 01 10 10 11 */
rPDATE = ~(1<<5); //Beep = 10
rPCONE = 0x5569;
rPUPE = 0xff;
//PORT F GROUP
/* Bit8 7 6 5 4 3 2 1 0 */
/* IISCLK IISDI IISDO IISLRCK Input Input Input IICSDA IICSCL */
/* 100 100 100 100 00 00 00 10 10 */
rPDATF = 0xfffff;
rPCONF = 0x50;
rPUPF = 0x0; //PULL UP RESISTOR should be enabled to I/O
//PORT G GROUP
/* BIT7 6 5 4 3 2 1 0 */
/* EINT7 EINT6 EINT5 EINT4 EINT3 EINT2 EINT1 EINT0 */
/* KEY3 KEY2 KEY1 KEY0 NIC EXT IDE USB */
/* 11 11 11 11 11 11 11 11 */
rPDATG = 0x0f;
rPCONG = 0x5500;
rPUPG = 0x0; //should be enabled
rSPUCR= 0x4;//0x7; //D15-D0 pull-up disable
//rSPUCR= 0x6; //D15-D0 pull-up enable
rSYSCFG = 0x0e; //使用8K字节的指令缓存,write buffer disable
rNCACHBE0 = 0xc0002000; //定义非Cache区,从0x2000000到0xbffffff,中断时进入ROM,若不允许CACHE不正常
rEXTINT = 0x0; //所有的外部硬件中断为低电平触发
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -