target.c

来自「UC/OS-II移植到s3c2440代码」· C语言 代码 · 共 457 行

C
457
字号
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name:          target.c
** Last modified Date: 2006-01-11 
** Last Version:       v2.0
** Descriptions:       目标板特殊的代码,包括异常处理程序和目标板初始化程序
**
**------------------------------------------------------------------------------------------------------
** Created By:         陈明计
** Created date:       2003-06-05
** Version:            v1.0
** Descriptions:       创建
**
**------------------------------------------------------------------------------------------------------
** Modified by:        甘达
** Modified date:      2006-01-06
** Version:            v2.0
** Descriptions:       升级注释
**
**------------------------------------------------------------------------------------------------------
** Modified by:      
** Modified date:     
** Version:           
** Descriptions:      
**
********************************************************************************************************/
#define IN_TARGET
#include "config.h"

/*********************************************************************************************************
** 函数名称: FIQ_Exception
** 功能描述: 快速中断异常处理程序,用户根据需要自己改变程序
**           
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄绍斌
** 日 期: 2005年11月11日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void  FIQ_Exception(void)
{
    while(1);                   // 这一句替换为自己的代码
}
/*********************************************************************************************************
** 函数名称: Timer0_Exception
** 功能描述: 定时器0中断服务程序
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: OSTimeTick
**
** 作 者: 陈明计
** 日 期: 2004年2月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void Timer0_Exception(void)
{
	rSRCPND = 1 << 10;
	rINTPND = rINTPND;
    OSTimeTick();
}

/*********************************************************************************************************
** 函数名称: Timer0Init
** 功能描述: 定时器0初始化
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2002年4月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void Timer0Init(void)
{
	// 定时器设置
    rTCFG0 = 0;	                        // 预分频器0设置为250,取得200KHz
    rTCFG1 = 1;					        // TIMER0再取1/4分频,取得50KHz
    rTCNTB0 = (PCLK / (4 * OS_TICKS_PER_SEC)) - 1;
    rTCON = (1 << 1);                   // 更新定时器数据		
    rTCON = (1 << 0) | (1 << 3);        // 启动定时器
 }

/*********************************************************************************************************
** 函数名称: VICInit
** 功能描述: 向量中断控制器初始化
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月2日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void VICInit(void)
{
	// 设置中断控制器
	rPRIORITY = 0x00000000;		// 使用默认的固定的优先级
	rINTMOD = 0x00000000;		// 所有中断均为IRQ中断
	VICVectAddr[10] = (uint32) Timer0_Exception;
	rINTMSK = ~(1<<10);			// 打开TIMER0中断允许
 }


// 声明外部图片资源
#if  DISP_BGPIC!=0
extern uint16 gImage_bliss[];			
#endif
/*********************************************************************************************************
** 函数名称: cal_cpu_bus_clk
** 功能描述: 计算系统时钟频率
** 输 入: 分频因子
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈伟峰
** 日 期: 2009年4月30日
********************************************************************************************************/
uint32 SYS_FCLK, SYS_HCLK, SYS_PCLK;  //定义系统时间
static void cal_cpu_bus_clk(void)
{
	uint32 val;
	uint8 m, p, s;
	
	val = rMPLLCON;
	m = (val>>12)&0xff;
	p = (val>>4)&0x3f;
	s = val&3;

	SYS_FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;
	
	val = rCLKDIVN;
	m = (val>>1)&3;
	p = val&1;	
	val = rCAMDIVN;
	s = val>>8;
	
	switch (m) {
	case 0:
		SYS_HCLK = SYS_FCLK;
		break;
	case 1:
		SYS_HCLK = SYS_FCLK>>1;
		break;
	case 2:
		if(s&2)
			SYS_HCLK = SYS_FCLK>>3;
		else
			SYS_HCLK = SYS_FCLK>>2;
		break;
	case 3:
		if(s&1)
			SYS_HCLK = SYS_FCLK/6;
		else
			SYS_HCLK = SYS_FCLK/3;
		break;
	}
	
	if(p)
		SYS_PCLK = SYS_HCLK>>1;
	else
		SYS_PCLK = SYS_HCLK;

	rUPLLCON = (56<<12) | (2<<4) | 2;
}
/*********************************************************************************************************
** 函数名称: ChangeMPllValue
** 功能描述: 修改系统内部时钟FCLK
** 输 入: 分频因子
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈伟峰
** 日 期: 2009年4月30日
********************************************************************************************************/
void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
{
    rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
}
/*********************************************************************************************************
** 函数名称: ChangeClockDivider
** 功能描述: 修改系统内时钟HCLK、PCLK
** 输 入: 分频比
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈伟峰
** 日 期: 2009年4月30日
********************************************************************************************************/
void ChangeClockDivider(int hdivn,int pdivn)
{
     // hdivn,pdivn FCLK:HCLK:PCLK
     //     0,0         1:1:1 
     //     0,1         1:1:2 
     //     1,0         1:2:2
     //     1,1         1:2:4
    rCLKDIVN = (hdivn<<1) | pdivn;
 }
/*********************************************************************************************************
** 函数名称: TargetInit
** 功能描述: 目标板初始化代码,在需要的地方调用,根据需要改变
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TargetInit(void)
{
    uint32 temp;

    OS_ENTER_CRITICAL();
    srand((uint32) TargetInit);					//C语言伪随机数函数
    
    ChangeMPllValue(92,1,1);					//FCLK=400Mhz
    ChangeClockDivider(2,1);					//FCLK:HCLK:PCLK=1:4:8
    
    cal_cpu_bus_clk();
    
    VICInit();
    Timer0Init();
	
	UART_Select(0);								//初始化串口
	UART_Init(115200);
	
//	KeyPortInit();								//初始化按键
	TsInit();

    GUI_Initialize();							// 初始化LCD显示	
    			
#if  DISP_BGPIC!=0
    GUI_DispPic(0,0, 240,320, gImage_bliss);	// 显示桌面   
#endif   
/*
    rRTCCON = 0x00;								// 禁止RTC接口(只允许RTC计数和读数)	
    temp = rBCDYEAR & 0xff;
    if(temp > 0x99)								// 年判断
    {
        goto ChangeRTC;
    }
    if (temp == 0)
    {
        goto ChangeRTC;
    }
    temp = rBCDMON & 0x1F;
    if (temp > 0x12)							// 月判断		
    {
        goto ChangeRTC;
    }
    if (temp == 0)
    {
        goto ChangeRTC;
    }
    temp = rBCDDATE & 0x3F;
    if (temp > 0x31)							// 日判断		
    {
        goto ChangeRTC;
    }
    if (temp == 0)
    {
        goto ChangeRTC;
    }
    temp = rBCDHOUR & 0x3F;
    if (temp > 0x24)							// 时判断		
    {
        goto ChangeRTC;
    }
    temp = rBCDMIN & 0x7F;
    if (temp > 0x59)							// 分判断		
    {
        goto ChangeRTC;
    }
    temp = rBCDSEC & 0x7F;
    if (temp > 0x59)							// 秒判断
    {
        goto ChangeRTC;
    }
*/
    OS_EXIT_CRITICAL();

    return;
    
ChangeRTC:	
	rRTCCON = 0x01;             // 标准模式,RTC接口使能(允许写)
	
   	rBCDYEAR = 0x05;
    rBCDMON  = 0x11;
    rBCDDATE = 0x28;         
    rBCDDAY  = 0x01;            // 星期,MON:1  TUE:2  WED:3  THU:4  FRI:5  SAT:6  SUN:7
    rBCDHOUR = 0x17;
    rBCDMIN  = 0x01;
    rBCDSEC  = 0x00;
    
    rRTCCON  = 0x00;            // 禁止RTC接口(只允许RTC计数和读数)	
    
}

/*********************************************************************************************************
**                  以下为一些与系统相关的库函数的实现
**                  具体作用请ads的参考编译器与库函数手册
**                  用户可以根据自己的要求修改        
********************************************************************************************************/
/*********************************************************************************************************
**                  The implementations for some library functions
**                  For more details, please refer to the ADS compiler handbook and The library 
**                  function manual
**                  User could change it as needed       
********************************************************************************************************/

#include "rt_sys.h"
#include "stdio.h"

#pragma import(__use_no_semihosting_swi)

        int __rt_div0(int a)
{
    a = a;
    return 0;
}

        int fputc(int ch,FILE *f)
{
    ch = ch;
    f = f;
    return 0;
}

    int fgetc(FILE *f)
{
    f = f;
    return 0;
}


        int _sys_close(FILEHANDLE fh)
{
    fh = fh;
    return 0;
}

        int _sys_write(FILEHANDLE fh, const unsigned char * buf,
                      unsigned len, int mode)
{
    fh = fh;
    buf = buf;
    len =len;
    mode = mode;
    return 0;
}
        int _sys_read(FILEHANDLE fh, unsigned char * buf,
                     unsigned len, int mode)
{
    fh = fh;
    buf = buf;
    len =len;
    mode = mode;
    
    return 0;
}

       void _ttywrch(int ch)
{
    ch = ch;
}

        int _sys_istty(FILEHANDLE fh)
{
    fh = fh;
    return 0;
}
        int _sys_seek(FILEHANDLE fh, long pos)
{
    fh = fh;
    pos = pos;
    return 0;
}
        int _sys_ensure(FILEHANDLE fh)
{
    fh = fh;
    return 0;
}

        long _sys_flen(FILEHANDLE fh)
{
    fh = fh;
    return 0;
}
       int _sys_tmpnam(char * name, int sig, unsigned maxlen)
{
    name = name;
    sig = sig;
    maxlen = maxlen;
    return 0;
}


        void _sys_exit(int returncode)
{
    returncode = returncode;
}

        char *_sys_command_string(char * cmd, int len)
{
    cmd = cmd;
    len = len;
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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