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

📄 target.c

📁 该文件为S3C44B0硬件平台配置具体函数的初始化及其SD卡读写程序
💻 C
字号:
/*
;************************************************************************************************************
;*				        				北京精仪达盛科技有限公司
;*                                     	     研    发    部
;*
;*                                 	     http://www.techshine.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------                                      
;*
;* 文件名称 : target.c	
;* 文件功能 : 该文件为S3C44B0硬件平台配置具体函数的初始化。
;* 补充说明 : 
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : ARM开发小组
;* 修改日期 : 2004/04/25
;* 版本声明 : V1.0.1
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : ARM开发小组
;* 创建日期 : 2004/04/20
;* 版本声明 : v1.0.0
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/

#include "..\INC\44b.h"
#include "..\INC\target.h"
#include "..\INC\44blib.h"
#include "..\..\SDdriver\INC\SD.h"
unsigned int AD_XY;
int xPhys, yPhys;
char flag=0;
/*
*************************************************************************************************************
-  
- 程序段说明 : 以下函数为各异常模式服务子程序。设成死循环是为调试用,一旦发生此类异常,程序便跳入异常模式服务
-              子程序,终止程序运行。
-
*************************************************************************************************************
*/

void HaltUndef(void)  																				 //未定义
{
    Uart_Printf(0,"the programm is haltUndefed");
    while(1);
}

void HaltSwi(void)  																				 //软中断
{
    Uart_Printf(0,"the programm is haltSWI");
    while(1);
}

void HaltPabort(void)  																			  //预取指中止
{
    Uart_Printf(0,"the programm is haltPaborted");
    while(1);
}

void HaltDabort(void)  																			   //数据中止
{
    Uart_Printf(0,"the programm is haltdaborted");
    while(1);
}

void HaltFIQ(void)  																				 //快中断
{
    Uart_Printf(0,"the programm is haltdFIQ");
    while(1);
}

/*
*************************************************************************************************************
-
-                                   程序段说明 : 以下函数均为初始化函数
-            
*************************************************************************************************************
*/

/*
*************************************************************************************************************
- 函数名称 : Exep_S3cint_Init(void)
- 函数说明 : 异常及中断控制器的初始化
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Exep_S3cINT_Init(void)  
{ 
    int rr,qq;
    pISR_UNDEF  = (unsigned)HaltUndef;
    pISR_SWI    = (unsigned)HaltSwi;
    pISR_PABORT = (unsigned)HaltPabort;
    pISR_DABORT = (unsigned)HaltDabort;
    pISR_FIQ    = (unsigned)HaltFIQ;

    rINTCON = 0x1;           									// 所有中断均使用向量中断,打开 IRQ ,禁止 FIQ     
    rINTMOD = 0x00;	  												               // 所有模式配置为 IRQ 模式
    rINTMSK = 0x07ffffff;											                          // 屏蔽所有中断
    
    rr = rI_ISPC;
    rr = rINTPND;
    rr = rEXTINPND;
    rEXTINPND = 1;
    rI_ISPC = 0x3ffffff;
    rr = rEXTINPND;
    qq = rINTPND;
}

/*
*************************************************************************************************************
- 函数名称 : Cache_Init(void)
- 函数说明 : S3C44B0内部缓存的初始化程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/														
void Cache_Init(void)
{
    rSYSCFG = SYSCFG_8KB;
    //rNCACHBE0 = 0x20001c00;								                                      
    rNCACHBE1 = 0xe0003000;
}

/*
*************************************************************************************************************
- 函数名称: void Touch_Init(void)
- 函数功能:初始化触摸屏控制器
- 输入参数:无
- 输出参数:无
*************************************************************************************************************
*/ 
void Touch_Init(void)				
{
    unsigned int i,Con_Word;
 
    Con_Word = 0xd0;  		   // 控制字 S=1;A2 A1 A0 = 101 x_axis; mode=0 12bit; dfr=0 差分; pd0 pd1=00 下电
      	 
    clrsck; 						                                                          // 时钟电平置零
    clrdin;							                                                      // 控制字输入口清零
    Delay1(10);
    clrcs;							                          // 片选置零,有效。接收控制字端口开始接收控制字
    Delay1(10);
    
    for(i=0;i<8;i++)				                                                        // 送入控制字 8位
    {
		if ((Con_Word&0x80)==0x80)
		{
	    	setdin;
		}
        else
        {   
            clrdin;
        }
        setsck;
        Delay1(10);
        Con_Word = Con_Word<<1;
        clrsck; 
        Delay1(10);    
    }
    setcs;							                                                   // 片选置高,访问无效。
}

/*
*************************************************************************************************************
- 函数名称:void TouchINT_Init(void)
- 函数功能:触摸屏中断初始化
- 输入参数:无
- 输出参数:无
*************************************************************************************************************
*/
void TouchINT_Init(void)													             //触摸屏硬件接口使能
{
     if ((rINTPND & BIT_EINT4567))
    {
    	rI_ISPC = BIT_EINT4567;
    }
    rINTMSK  = ~(BIT_GLOBAL|BIT_EINT4567);
    pISR_EINT4567 = (int)Touch_ISR;
//    rr = rINTPND;
    
}

/*
*************************************************************************************************************
- 函数名称 : TargetInit(void)
- 函数说明 : 目标板初始化程序,主函数中只需调用此函数,即可完成目标板的初始化
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Target_Init(void)
{
    Uart_Init(0,115200,0);
    Port_Init();
    Exep_S3cINT_Init();
    
    Cache_Init();
//    Touch_Init();
//    TouchINT_Init();
    SDINT_Init();
    StartInterrupt(); 		                              //开中断,在此之前都是关中断状态,在44binit.s中定义
}

/*
*************************************************************************************************************
-
-                                   程序段说明 : 以下函数均为服务子程序函数
-            
*************************************************************************************************************
*/
/*
*************************************************************************************************************
- 函数名称 : UART0_RxDINT_ISR(void)
- 函数说明 : 串口0用中断方式接收数据的中断服务子程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
/*void __irq  UART0_RxDINT_ISR(void)  
{
    INT8U ReceivedByte;
    
    if ((rUTRSTAT0 & 0x1))  																	  //有有效数据
    {
		ReceivedByte = RdURXH0();
        //Uart_SendByte(ReceivedByte,0);	
    }

    rI_ISPC = BIT_URXD0;   											                       //清中断  BIT_URXD0
}
*/
/*
*************************************************************************************************************
- 函数名称: void __irq Touch(void)
- 函数功能:触摸屏中断
- 输入参数:无
- 输出参数:无
*************************************************************************************************************
*/ 

void __irq  Touch_ISR(void)
{
   	int rr;
   	rINTMSK  = (BIT_GLOBAL|BIT_EINT4567);   // 关中断	
                                   
  	rr = rEXTINPND;

   	if(rr == 0x1)
   	{
   		
   		AD_XY  = GetTouch_XY_AD();
   	 	flag = 1;
   	 	yPhys = (AD_XY>>4)&0x0fff;
    	xPhys = (AD_XY>>20)&0x0fff;
    	Uart_Printf(0,"x=%x,y=%x\n",xPhys,yPhys);
   
   }
  	rEXTINPND = 0x1; 
  	rI_ISPC = BIT_EINT4567;
  	rINTMSK  = ~(BIT_GLOBAL|BIT_EINT4567);
}

/*
***********************************************************************************************************
* 函数名称:  GetTouch_XY_AD(void)
*       					
* 函数功能:  写给触摸屏控制器控制字,把触摸屏控制器转换的AD值放到接收变量AD_XY中
*
* 输入参数:  无
*
* 返回值  :  AD_XY
***********************************************************************************************************
*/
	unsigned int GetTouch_XY_AD(void)
	{
   		unsigned int i,x,y,x_comp,y_comp,AD_XY =0;
   		unsigned char Con_word;
    
    	clrsck; 																		//模拟时钟信号,清零
    	clrdin; 																	//模拟发控制字信号,清零
    	Delay1(1);																			//延时,模拟电平
    	
    	clrcs;  															   //接收控制字的使能信号,低有效
       	Delay1(10);																			 //延时,模拟电平
    //可以不要该判断!
    	//if ((tsbusy) == 0)                 //如果在未发控制字的情况下,转换电平为高,则认为系统初始状态不正常
    	//{
    		do
   			{ 
   				y_comp = y;                 													//设一个比较值
    
     			Con_word=0x93;	//设置控制字 S=1,起始; a2a1a0 = 001, y轴; mode=0 12位; dfr=0,差分; pd0 pd1=11   

    			for(i=0;i<8;i++)												  //在时钟上升沿正确写入控制字
    			{
					if ((Con_word&0x80) == 0x80)  
                 	{
                 		setdin;
                 	}
         			else
         			{
         			    clrdin;
         			}
         		
         			setsck;
	         		Delay1(10);
         		    Con_word = Con_word<<1;
         			clrsck;
         			Delay1(10);    
     			}
          		clrdin;
     			
     			y = 0;
     			Delay1(10);  
     	
     			for(i=0;i<8;i++)  											//在时钟下降沿正确读出y的高8位AD值
    			{
					y = y<<1;
         			setsck;
			        Delay1(10);
         			clrsck;
         			if ((tsout) == 0x80)                    //输出位要改,不是pf3,而是pf7接触摸屏输出
         			{
         				y = y | 1;
         			}
            	    Delay1(10);    
     			}
     	
     			for(i=0;i<8;i++)										//在时钟下降沿正确读出y的低8位AD值
    			{														//低4位自动补零
					y = y<<1;
         			setsck;
					Delay1(10);
          			clrsck;
          			if ((tsout) == 0x80)
            		{
            			y = y | 1;
            		}
            		Delay1(10);    
     			}
    		}while (y_comp != y);
    		
                            // 得到y的AD值
   			do
   			{ 
    			x_comp = x;																	   //设一个比较值
    			Con_word = 0xd3;//设置控制字 S=1,起始; a2a1a0 = 101, x轴; mode=0 12位; dfr=0,差分; pd0 pd1=11  
    	
    			for(i=0;i<8;i++)												   //时钟上升沿正确写入控制字
    			{
					if ((Con_word&0x80) == 0x80)
					{
                 		setdin;
                 	}
         			else
         			{
         			    clrdin;
         			}
         			setsck;
	         		Delay1(10);
         			Con_word = Con_word<<1;
         			clrsck;
          			Delay1(10);    
     			}
     			
     			clrdin;
     			Delay1(10); 
     	
     			x=0;
     
     			for(i=0;i<8;i++)											//时钟下降沿正确读出x的高8位AD值
    			{
					x = x<<1;
         			setsck;
					Delay1(10);
        			clrsck;
        			if ((tsout)==0x80)
        			{
            			x = x | 1;
            		}
        			Delay1(10);    
     			}
      	
      			for(i=0;i<8;i++)											//时钟下降沿正确读出x的低8位AD值
    			{
					x = x<<1;
         			setsck;
			    	Delay1(10);
         			clrsck;
         			if ((tsout) == 0x80)
            		{
            			x =x | 1;
            		}	
         			Delay1(10);    
     			}
     		}while (x!=x_comp);

     		setcs;
     		AD_XY = (x<<16)|y;
     		Delay1(10);
     		Touch_Init();
   		//}	
  		//setcs;
 		return AD_XY;	
	}
/*
*************************************************************************************************************
- 函数名称 : void Delay1(int j)
- 函数功能 : 模拟时钟的电平延时
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
 
void Delay1(int j)                 
{   
	unsigned int  i;
 	for(i=0;i<j*10;i++);
}

/*
*************************************************************************************************************
*-													结束文件                                               -*
*************************************************************************************************************
*/

⌨️ 快捷键说明

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