📄 target.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 + -