📄 global.c
字号:
#define __GLOBAL
#include "global.h"
#undef __GLOBAL
//********************** Global Variable **********************
unsigned long timestamp;
unsigned long lastdec; // 上次所得计数值. 用于换算CPU运行时间.
int timer_load_val ; // 定时器装载值
//*************************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 蜂鸣器响.
// 描述: 蜂鸣器响X微秒.
//
// [参数表]
// Xus: 蜂鸣持续时间.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Beep(unsigned int Xus)
{
BuzzerOn();
udelay(Xus);
BuzzerOff();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: I/O口初始化.
// 描述: 蜂鸣器响X微秒.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void IO_init(void)
{
//CAUTION:Follow the configuration order for setting the ports.
// 1) setting value(GPnDAT)
// 2) setting control register (GPnCON)
// 3) configure pull-up resistor(GPnUP)
//32bit data bus configuration
//*** PORT A GROUP
//Ports : GPA22 GPA21 GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12
//Signal : nFCE nRSTOUT nFRE nFWE ALE CLE nGCS5 nGCS4 nGCS3 nGCS2 nGCS1
//Binary : 1 1 1 , 1 1 1 1 , 1 1 1 1
//Ports : GPA11 GPA10 GPA9 GPA8 GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
//Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0
//Binary : 1 1 1 1 , 1 1 1 1 , 1 1 1 1
rGPACON = 0x007FFFFF; // PORT A(22位): 全部为引脚功能
//**** PORT B GROUP
//Ports : GPB10 GPB9 GPB8 GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0
//Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
//Setting: INPUT OUTPUT INPUT OUTPUT INPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT
//Binary : 00 , 01 00 , 01 00 , 01 01 , 01 01 , 01 01
rGPBCON = 0x00044555; // PORT B(11位): GPB0~5,7,9为输出; GPB6,8,10,11为输入
rGPBUP = 0x000007FF; // PORT B上拉电阻: 全部禁止
//*** PORT C GROUP
//Ports : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8 GPC7 GPC6 GPC5 GPC4 GPC3 GPC2 GPC1 GPC0
//Signal : VD7 VD6 VD5 VD4 VD3 VD2 VD1 VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10
rGPCCON = 0xAAAAAAAA; // PORT C(16位): 全部为引脚功能
rGPCUP = 0x0000FFFF; // PORT C上拉电阻: 全部禁止
//*** PORT D GROUP
//Ports : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
//Signal : VD23 VD22 VD21 VD20 VD19 VD18 VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9 VD8
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 ,10 10
rGPDCON = 0x1100; // PORT D(16位): GPD0~3,5,7~15为输入; GPD4,6为输出
rGPDUP = 0x0000FFFF; // PORT D上拉电阻: 全部禁止
//*** PORT E GROUP
//Ports : GPE15 GPE14 GPE13 GPE12 GPE11 GPE10 GPE9 GPE8 GPE7 GPE6 GPE5 GPE4
//Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK IN
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 00 ,
//-------------------------------------------------------------------------------------------------------
//Ports : GPE3 GPE2 GPE1 GPE0
//Signal : IN IN IN IN
//Binary : 00 00 , 00 00
rGPECON = 0xAAAAA8AA; // PORT E(16位): 全部为引脚功能
rGPEUP = 0x0000FFFF; // PORT E上拉电阻: 全部禁止
//*** PORT F GROUP
//Ports : GPF7 GPF6 GPF5 GPF4 GPF3 GPF2 GPF1 GPF0
//Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
//Setting: Output Output Output Output EINT3 EINT2 EINT1 EINT0
//Binary : 01 01 , 01 01 , 10 10 , 10 10
rGPFCON = 0x140; // PORT F(8位): GPF4~5为输出,其余为输入
rGPFUP = 0x000000FF; // PORT F上拉电阻: 全部禁止
//*** PORT G GROUP
//Ports : GPG15 GPG14 GPG13 GPG12 GPG11 GPG10 GPG9 GPG8 GPG7 GPG6
//Signal : nYPON YMON nXPON XMON EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
//Setting: nYPON YMON nXPON XMON EINT19 Output Output Output SPICLK1 SPIMOSI1
//Binary : 11 11 , 11 11 , 10 01 , 01 01 , 11 11
//-----------------------------------------------------------------------------------------
//Ports : GPG5 GPG4 GPG3 GPG2 GPG1 GPG0
//Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
//Setting: SPIMISO1 LCD_PWRDN EINT11 nSS0 EINT9 EINT8
//Binary : 11 11 , 10 11 , 10 10
rGPGCON = 0xFF95F53A; // PORT G(16位): GPG0~1,11为引脚功能; GPG2,4~7,12~15保留; GPG3为输入; GPG8~10为输出
rGPGUP = 0x0000FFFF; // PORT G上拉电阻: 全部禁止
//*** PORT H GROUP
//Ports : GPH10 GPH9 GPH8 GPH7 GPH6 GPH5 GPH4 GPH3 GPH2 GPH1 GPH0
//Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
//Binary : 10 , 10 10 , 11 11 , 10 10 , 10 10 , 10 10
rGPHCON = 0x002AAAAA; // PORT H(11位): 全部为引脚功能(串口)
rGPHUP = 0x000007FF; // PORT H上拉电阻: 全部禁止
// Added for S3C2440X, DonGo
//*** PORT J GROUP
//Ports : GPJ12 GPJ11 GPJ10 GPJ9 GPJ8 GPJ7 GPJ6 GPJ5 GPJ4 GPJ3 GPJ2 GPJ1 GPJ0
//Signal : CAMRESET CAMPCLKOUT CAMHREF CAMVSYNC CAMPCLKIN CAMDAT[7] CAMDAT[6] CAMDAT[5] CAMDAT[4] CAMDAT[3] CAMDAT[2] CAMDAT[1] CAMDAT[0]
//Binary : 10 10 10 10 10 10 10 10 10 10 10 10 10
// rGPJCON = 0x02aaaaaa;
// rGPJUP = 0x1fff; // The pull up function is disabled GPH[10:0]
}//IO_init()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口初始化.
// 描述: 上电后初始化串口配置.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void UART_init (void)
{
int baud = 115200; // 波特率
int pclk = 152000000 / 4;
/*---------- UART相关寄存器 -----------
ULCONn: UART行控制寄存器
UCONn: UART控制寄存器
UFCONn: UART FIFO控制寄存器
UMCONn: UART Modem控制寄存器
UBRDIVn:UART波特率因子寄存器
---------------------------------------*/
//--- 串口0初始化 ---
rUFCON0 = 0X0; // 关闭FIFO
rUMCON0 = 0X0; // 关闭AFC
rULCON0 = 0x3; // 8位字长, 1个停止位, 无奇偶校验, 正常模式
rUCON0 = 0x5; // 从缓冲区读数据模式:中断请求或查询, 数据写入缓冲区模式:中断请求或查询.
// 无回送, 禁止错误中断, 禁止Rx超时中断,
// 发送中断请求类型: 脉冲, 接收中断请求类型: 脉冲, 时钟: PCLK
rUBRDIV0 = ((int)(pclk/16/baud)-1); //波特率
//--- 串口1初始化 ---
rUFCON1 = 0X0; // 关闭FIFO
rUMCON1 = 0X0; // 关闭AFC
rULCON1 = 0x3; // 8位字长, 1个停止位, 无奇偶校验, 正常模式
rUCON1 = 0x5; // 从缓冲区读数据模式:中断请求或查询, 数据写入缓冲区模式:中断请求或查询.
// 无回送, 禁止错误中断, 禁止Rx超时中断,
// 发送中断请求类型: 脉冲, 接收中断请求类型: 脉冲, 时钟: PCLK
rUBRDIV1 = ((int)(pclk/16/baud)-1); // 波特率换算
//--- 串口2初始化 ---
rUFCON2 = 0X0; // 关闭FIFO
rULCON2 = 0x3; // 8位字长, 1个停止位, 无奇偶校验, 正常模式
rUCON2 = 0x5; // 从缓冲区读数据模式:中断请求或查询, 数据写入缓冲区模式:中断请求或查询.
// 无回送, 禁止错误中断, 禁止Rx超时中断,
// 发送中断请求类型: 脉冲, 接收中断请求类型: 脉冲, 时钟: PCLK
rUBRDIV2 = (int)(pclk/(16*baud))-1; // 波特率换算
}//UART_init()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 系统初始化.
// 描述: 上电执行ROM程序时的系统配置.
//
// 注: [相关寄存器]
// ISR_IRQ: IRQ异常向量
// INTMOD: 中断模式寄存器. 0=IRQ模式, 1=FIQ模式
// INTMSK: 中断屏蔽寄存器. 0=中断允许, 1=中断屏蔽
// INTPND: 中断挂起寄存器. 0=相应中断没有请求, 1=对应中断源发出中断请求
// SRCPND: 中断源挂起寄存器,当中断产生后, 相应位置1
// TCFGn: Timer Configuration Register(定时器配置寄存器).
// TCON: Timer Control Register(定时器控制寄存器).
// TCNTBn: Timer Count Buffer Register(定时器计数缓冲区寄存器).用于存储定时器自动重载值.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void SystemInit (void)
{
DWORD i;
IO_init(); // IO口初始化
UART_init(); // 串口初始化
pISR_IRQ = (int)HandlerpISR_IRQ; // IRQ向量指向中断分发程序
rINTMOD = 0x0; // 中断模式: IRQ
rINTMSK = 0xFFFFFFFF; // 中断允许标志位
rINTMSK &= ~(BIT_TIMER4); // 打开定时器4中断屏蔽
rSRCPND |= BIT_TIMER4;
rINTPND |= BIT_TIMER4;
rTCFG0 = 0x0f00; // 配置定时器0
rTCFG1 = 0x0; // 配置定时器1
// timer_load_val和lastdec用于换算CPU运行时间.
timer_load_val = 152000000/4/(2 * 16 *1000); // 定时器装载值: 定时1ms.
lastdec = timer_load_val; // 上次所得计数值设为定时器装载值
rTCNTB4 = 152000000/4/(2 * 16 *1000); // 计算定时器4自动重载值
rTCON = 0x600000; // 设定时器4为自动重载, 并装入TCNTB4的值
rTCON = 0x500000; // 设定时器4为自动重载, 启动定时器4
//External interrupt will be falling edge triggered.
// rEXTINT0 = 0x22222222; // EINT[7:0]
// rEXTINT1 = 0x22222222; // EINT[15:8]
// rEXTINT2 = 0x22222222; // EINT[23:16]
enable_interrupts(); // 打开中断
for(i=0; i<100; i++); // 延时等待
}//SystemInit()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口中断设置.
// 描述: 设置串口中断相关的寄存器.
//
// [参数表]
// UartBit: UART屏蔽位.
// UartSubBit: UART子屏蔽位.
//
// 注: [相关寄存器]
// SUBSRCPND: 子中断源挂起寄存器
// INTSUBMSK: 中断子屏蔽寄存器
// INTMSK: 中断屏蔽寄存器
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void UartInt_Set (unsigned long UartBit, unsigned short UartSubBit)
{
S3C24X0_INTERRUPT * const inter=S3C24X0_GetBase_INTERRUPT();
inter->eSUBSRCPND=(UartSubBit); // 清除Uart子屏蔽位,如BIT_SUB_RXD0
ClearPending(UartBit); // 清除Uart屏蔽位,如BIT_UART0
inter->eINTSUBMSK &= ~(UartSubBit); // 开串口收子中断屏蔽
inter->eINTMSK &= ~(UartBit); // 开串口中断屏蔽
}//UartInt_Set()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 系统状态初始化.
// 描述: 上电后或程序复位时, 初始化系统状态.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void InitStatus (void)
{
UartInt_Set(BIT_UART0,BIT_SUB_RXD0|BIT_SUB_TXD0); //串口0中断初始化
UartInt_Set(BIT_UART1,BIT_SUB_RXD1|BIT_SUB_TXD1); //串口1中断初始化
UartInt_Set(BIT_UART2,BIT_SUB_RXD2|BIT_SUB_TXD2); //串口2中断初始化
}//InitStatus()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 获取CPU的运行时间.
// 描述: 获取CPU自上次本操作后的运行时间(小于定时器周期).
//
// [参数表]
// t: 需要减去的时间值.
//
// 返回: CPU运行时间-t.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ulong get_timer(int t)
{
unsigned long now;
now = rTCNTO4; // 读出当前定时器计数值
if (lastdec >= now) // 根据上次所得计数值与本次所得计数值之间的大小关系换算出CPU运行时间
{
// normal mode
timestamp += lastdec - now;
}
else
{
// we have an overflow ...
timestamp += lastdec + timer_load_val - now;
}
lastdec = now; // 用本次采用的定时器计数值更新上次所得计数值
return timestamp-t;
}//get_timer()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 微秒延时.
// 描述: 延时tt微秒.
//
// [参数表]
// tt: 微秒数.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void udelay(unsigned long tt)
{
unsigned long tmo;
tmo = tt;
tmo *= (timer_load_val);
tmo /= 1000;
tmo += get_timer(0);
while (get_timer(0) < tmo) // 通过读取当前CPU的运行时间, 间接利用定时器延时.
/*NOP*/;
}//udelay()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 强制跳转命令go.
// 描述: 程序强制跳转至指定的地址.
//
// [参数表]
// addr: 跳转的地址.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int goCommand (unsigned long addr)
{
return ((ulong (*)(int))addr)(1);
}//goCommand()
// 4字节块拷贝
void memcpy_four(int *dst, int *scr, int len)
// 功能: 将源数据块的内容复制到目标存储区域中, 每次拷贝4字节.
// dst: 目标存储区始地址.
// scr: 源数据块始地址.
// len: 数据块长度(按字节算).
{
int i;
for(i=0; i<len/4; i++)
*dst++ = *scr++;
// 由于此处采用int型进行操作, 而len给出的是char型的数据长度, 所以要除以4
}//memcpy_four
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -