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

📄 global.c

📁 基于S3C2410和SM501的彩屏控制器程序
💻 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 + -