ARM9S3C2440—ADC和触摸屏控制详解

发布者:konglingdeyuan最新更新时间:2015-10-14 来源: eefocus关键字:ARM9  S3C2440  ADC  触摸屏控制 手机看文章 扫描二维码
随时随地手机看文章
    S3C2440芯片内部共有8路A/D转换通道,AIN0-AIN7,转换器只有一个,转换精度为10位,最大转换率为2.5MHz A/D 转换器时钟下的500 KSPS。A/D 转换器支持片上采样-保持功能和掉电模式的操作。在常见的设计中,一般AIN4,AIN5,AIN6,AIN7被用作四线电阻触摸屏的YM、YP、XM、XP通道,剩余的AIN0~AIN3被引出,其中AI0外接一个可调电阻。

ADC的配置流程如下:

 

1、ADCDLY(P446)

rADCDLY=50000;      //Normal conversion mode delay about                                                 1/3.6864M)*50000=13.56ms

 ARM9 <wbr>S3C2440—ADC和触摸屏控制详解

2、ADCCON(P444)的设置,选择转换通道和设置转换频率

   ADCCON[0],AD转换开始有效,1转换开始且该位在转换开始后变为0,通过这个特点可以判断是否开始转换。什么意思呢,设为1只是认为地让它转换开始,但是未必开始转换,还必须通过while循环查询方式判断该位是否变为0,变为0表示转换开始。

ADCCON[1],AD转换通过读取有效,1通过读取操作有效;ADCCON[2],备用操作模式选择,0普通操作模式,1,备用操作模式;

ADCCON[5:3]:转换通道选择;

000 AIN 0

001 AIN 1

010 AIN 2

011 AIN 3

100 YM

101 YP

110 XM

111 XP

ADCCON[13:6],AD转换器预分频器值0~255,ADC频率应该小于PCLK的1/5;

ADCCON[14],AD转换器预分频器使能,1使能;

ADCCON[15],AD转换结束标志,0:转化过程中,1:转换结束;

 

ADC初始化程序示例如下:

#define ADC_FREQ 2500000 //希望的ADC转换频率

 

volatile U32 preScaler;

volatile U32 adc_value=0;//在程序开始处声明

 

void adc_init(void)

{

 

//选择输入通道,AIN0,对应开发板上W1可调电阻

int channel=0; 

 

 

preScaler ADC_FREQ;

preScaler 50000000/ADC_FREQ 1; //PCLK=50M

 

 

rADCCON (1<<14)|(preScaler<<6)|(channel<<3); //setup channel

delay(1000);

 

}

    

3、ADCDAT0(ADCDAT1)P447,读取转换值

ADCDAT0[9:0],X坐标转换结果值,包括普通模ADC转换结果值;

(ADCDAT1[9:0],Y坐标转换结果;)

ADC转换程序示例,通过轮询方式

 

void Main(void)

{

    

    Set_Clk();

    

    

    adc_init();

    

    while(1)

    {

    

        adc_value=ReadAdc(0);

 

delay(1000) ;

    }

}

  

int ReadAdc(int channel)

{

   

   rADCCON |= 0x01; //start ADC

 

   while(rADCCON 0x1); //check if Enable_start is low

 

   

   while(!(rADCCON 0x8000)); //check if EC(End of Conversion) flag is high

    

   return (int)rADCDAT0 0x3ff );

 

ADC通过中断方式读取转换值

    注意ADC的中断有两个子中断,INT_ADC_S和INT_TC  需要先处理一下子中断INT_ADC_S ,再处理INT_ADC。

void adc_init(void)

{

int channel=0;   /选择输入通道,AIN0,对应开发板上W1可调电阻

    preScaler ADC_FREQ;  //设置分频时钟

preScaler 50000000/ADC_FREQ 1; //PCLK=50M

 

    rADCCON (1<<14)|(preScaler<<6)|(channel<<3);

ClearSubPending(BIT_SUB_ADC);//清子中断处理寄存器                             ClearPending(BIT_ADC);  //清中断处理寄存器
  

pISR_ADC=(U32)adc_ISR;         

EnableSubIrq(BIT_SUB_ADC);  //开AD子中断
    EnableIrq(BIT_ADC);  //开AD中断

delay(1000);

 

void __irq adc_ISR(void)
{
  int adc_value; //adc_value应该设为全局变量,这里放这里以便分析
 ClearSubPending(BIT_SUB_ADC);//清子中断处理寄存器                             ClearPending(BIT_ADC);  //清中断处理寄存器

 adc_value (int)rADCDAT0 0x3ff;
}
触摸屏工作流程以及程序设计流程:

一、触摸屏初始化:
  1、ADCTSC设置(P445),

[1:0]:11设置触摸屏接口为中断等待模式,等待触摸笔按下

[2]: ADC普通转换模式,1自动连续测量X坐标和Y坐标

[3]: XP上拉有效,1 XP上拉无效


  2、ClearSubPending(BIT_SUB_ADC);//清子中断处理寄存器           ClearPending(BIT_ADC);  //清中断处理寄存器

     ClearSubPending(BIT_SUB_TC);

   清除源挂起寄存器(SRCPND)、中断挂起寄存器(INTPND)、子源挂起寄存器(SUBSRCPND)。注意有两个中断,触摸屏中断:当触摸笔按下或抬起产生的中断,ADC中断:触摸屏坐标AD转换结束产生的中断。
  3、EnableSubIrq(BIT_SUB_ADC);  //开AD子中断
     EnableIrq(BIT_ADC);  //开AD中断

     EnableSubIrq(BIT_SUB_TC);  //开AD子中断TC

   关中断屏蔽寄存器和子中断屏蔽寄存器(INTMSK,INTSUBMSK)。 4、pISR_ADC (U32)AdcTsAuto;

程序入口函数,中断模式和中断优先级默认即可。
二、触摸屏中断服务子程序:
   一)触摸笔按下中断
     4、如果中断发生,设置x,y坐标为自动转换模式

        rADCTSC (1<<3)|(1<<2);

    [2]: ADC普通转换模式,1自动连续测量X坐标和Y坐标

[3]: XP上拉有效,1 XP上拉无效
     5、启动AD转换,然后检测AD转换是否启动

  rADCCON|=0x1;                   //start ADC

  while(rADCCON 0x1); //check if Enable_start is low
     6、检测AD转换是否结束,若结束,获取x,y坐标的值

通过轮询方式,也可以是中断方式判断转换结束。

while(!(rADCCON 0x8000));  //check if EC(End of Conversion) flag is high, This line is necessary~!!

while(!(rSRCPND 0x80000000));  //check if ADC is finished with interrupt bit

 

xdata=(rADCDAT0&0x3ff);

ydata=(rADCDAT1&0x3ff);
     7、对几个寄存器写1清零,防止反复发生中断(这里的中断是笔尖按下中断)
   ClearSubPending(BIT_SUB_TC);

   ClearPending(BIT_ADC);

/rSRCPND 0x80000000;rINTPND 0x80000000; 也可以

8、再次允许中断

     允许触摸笔被弹起的中断

EnableSubIrq(BIT_SUB_TC);

EnableIrq(BIT_ADC); // rINTMSK 0x7fffffff;

二)触摸笔抬起中断
     9、设置触摸屏即可为等待中断模式,等待触摸笔抬起(ADCTSC,关键是要设置触摸笔抬起中断信号)

   rADCTSC =0xd3;    //Waiting for interrupt

rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.
     10、如果发生中断,不做任何操作,只打印出一句触摸笔抬起中断信息

while(1) //to check Pen-up state

{

if(rSUBSRCPND (BIT_SUB_TC)) //check if ADC is finished with interrupt bit

{

Uart_Printf("Stylus Up Interrupt~! ");

break; //if Stylus is up(1) state

}

}

 

 

Uart_Printf("count=d  XP=d, YP=d ", count++, xdata, ydata); 
     11、触摸笔抬起之后,把得到的x,y坐标值发送给PC机,显示出具体数值
   三)再次设置触摸屏为等待中断模式,等待下次触摸屏被按下

    rADCTSC =0xd3;    //Waiting for interrupt

    

ClearSubPending(BIT_SUB_TC);  

ClearPending(BIT_ADC);

 

    EnableSubIrq(BIT_SUB_TC);

    EnableIrq(BIT_ADC);

 

示例程序如下:

 #define GLOBAL_CLK 1

#include 

#include 

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "mmu.h"

#include "profile.h"

#include "memtest.h"

 

 

#define ADC_FREQ 2500000

 

int count 0;

volatile U32 preScaler;

 

int xdata,ydata;

void Test_Touchpanel(void);

 

static void __irq AdcTsAuto(void);

 

static void cal_cpu_bus_clk(void);

void Set_Clk(void);

 

 

void delay(int times)

{

    int i,j;

    for(i=0;i

       for(j=0;j<400;j++);

}

 

 

int Main(void)

{

    int Scom=0;

 

    Set_Clk();

    Uart_Init(0,115200);

    Uart_Select(Scom);

    

    Test_Touchpanel();

    

    while(1);

    return 0;

}

 

 [page]

void Test_Touchpanel(void)

{

   

    rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms

    

    

    preScaler ADC_FREQ;

    preScaler 50000000/ADC_FREQ 1; //PCLK=50M

    rADCCON (1<<14)|(preScaler<<6); //ADCPRS En,PRSCVL

 

 

    

    rADCTSC=0xd3;  //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En

    

    

    rSRCPND 0x80000000;

    rINTPND 0x80000000;

    ClearSubPending(BIT_SUB_TC);  

 

    pISR_ADC (U32)AdcTsAuto;

 

    

    rINTMSK 0x7fffffff;     

    EnableSubIrq(BIT_SUB_TC);

}

 

 

static void __irq AdcTsAuto(void)

{

 

    U32  saveAdcdly;

 

    

    

    if(rSUBSRCPND (BIT_SUB_TC))

    {

if( !(rADCDAT0&0x8000))

    Uart_Printf(" Stylus down ");

else 

            Uart_Printf(" Stylus up ");

    }

 

    

    rADCTSC (1<<3)|(1<<2);

    saveAdcdly=rADCDLY;

    rADCDLY=40000;    //Normal conversion mode delay about (1/50M)*40000=0.8ms

 

 

rADCCON|=0x1;                   //start ADC

    while(rADCCON 0x1); //check if Enable_start is low

    

while(!(rADCCON 0x8000));  //check if EC(End of Conversion) flag is high, This line is necessary~!!

 

while(!(rSRCPND 0x80000000));  //check if ADC is finished with interrupt bit

 

 

xdata=(rADCDAT0&0x3ff);

    ydata=(rADCDAT1&0x3ff);

    

    ClearSubPending(BIT_SUB_TC);

    //ClearPending(BIT_ADC);

    rSRCPND 0x80000000;

rINTPND 0x80000000;  

 

 

    EnableSubIrq(BIT_SUB_TC);

    //EnableIrq(BIT_ADC);

    rINTMSK 0x7fffffff;

    

    

    

    

 

 

    rADCTSC =0xd3;    //Waiting for interrupt

rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.

 

while(1) //to check Pen-up state

{

if(rSUBSRCPND (BIT_SUB_TC)) //check if ADC is finished with interrupt bit

{

Uart_Printf("Stylus Up Interrupt~! ");

break; //if Stylus is up(1) state

}

}

 

 

Uart_Printf("count=d  XP=d, YP=d ", count++, xdata, ydata);  

 

rADCDLY=saveAdcdly; 

 

    rADCTSC =0xd3;    //Waiting for interrupt

    

ClearSubPending(BIT_SUB_TC);  

    //ClearPending(BIT_ADC);

    rSRCPND 0x80000000;

rINTPND 0x80000000;

 

    EnableSubIrq(BIT_SUB_TC);

    //EnableIrq(BIT_ADC);

    rINTMSK 0x7fffffff;

}

 

 

 

void Set_Clk(void)

{

int i;

U8 key;

U32 mpll_val ;

;              //don't use 100M!

                 //boot_params.cpu_clk.val 3;

switch {

case 0: //200

key 12;

mpll_val (92<<12)|(4<<4)|(1);

break;

case 1: //300

key 13;

mpll_val (67<<12)|(1<<4)|(1);

break;

case 2: //400

key 14;

mpll_val (92<<12)|(1<<4)|(1);

break;

case 3: //440!!!

key 14;

mpll_val (102<<12)|(1<<4)|(1);

break;

default:

key 14;

mpll_val (92<<12)|(1<<4)|(1);

break;

}

 

//init FCLK=400M, so change MPLL first

ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);   //set the register--rMPLLCON

ChangeClockDivider(key, 12);    //the result of rCLKDIVN [0:1:0:1] 3-0 bit

cal_cpu_bus_clk();    //HCLK=100M   PCLK=50M

}

 

static void cal_cpu_bus_clk(void)

{

static U32 cpu_freq;

    static U32 UPLL;

 

U32 val;

U8 m, p, s;

 

val rMPLLCON;

(val>>12)&0xff;

(val>>4)&0x3f;

val&3;

 

//(m+8)*FIN*2 不要超出32位数!

FCLK ((m+8)*(FIN/100)*2)/((p+2)*(1<    //FCLK=400M  FIN=12000000

 

val rCLKDIVN;

(val>>1)&3;

val&1;

val rCAMDIVN;

val>>8;

 

switch (m) {

case 0:

HCLK FCLK;

break;

case 1:

HCLK FCLK>>1;

break;

case 2:

if(s&2)

HCLK FCLK>>3;

else

HCLK FCLK>>2;

break;

case 3:

if(s&1)

HCLK FCLK/6;

else

HCLK FCLK/3;

break;

}

 

if(p)

PCLK HCLK>>1;

else

PCLK HCLK;

 

if(s&0x10)

cpu_freq HCLK;

else

cpu_freq FCLK;

 

val rUPLLCON;

(val>>12)&0xff;

(val>>4)&0x3f;

val&3;

UPLL ((m+8)*FIN)/((p+2)*(1<

UCLK (rCLKDIVN&8)?(UPLL>>1):UPLL;

关键字:ARM9  S3C2440  ADC  触摸屏控制 引用地址:ARM9S3C2440—ADC和触摸屏控制详解

上一篇:嵌入式linux内核制作方法
下一篇:STM32F103 FSMC同步模式学习笔记2

推荐阅读最新更新时间:2024-03-16 14:35

U-Boot移植(3)增加对S3C2440的支持
6、S3C2440是S3C2410的改进版,它们的操作基本相似,只是在系统时钟的设置、NAND Flash控制器的操作等方面有一些小差别。。而下面我要做的就是令一个U-Boot二进制代码既可以在S3C2410上运行,也可以在S3C2440上运行。 虽说我的板也是S3C2410的,但是增加S3C2440的U-Boot练习,可以提高我们的能力,为后面的学习打下基础。 GSTATUS1寄存器的值:0x32410000表示S3C2410,0x32410002表示S3C2440。 S3C2410:FCLK=200MHZ;S3C2440:FCLK=400MHZ,UCLK=48MHZ; 搞清楚之
[单片机]
U-Boot移植(3)增加对<font color='red'>S3C2440</font>的支持
S3C2440 网卡驱动介绍以及制作虚拟网卡驱动(二十五)
1、描述 网卡的驱动其实很简单,它还是与硬件相关,主要是负责收发网络的数据包,它将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送,并将接受到的数据包传递给上层协议。 网卡设备与字符设备和块设备不同,网络设备并不对应于/dev/目录下的文件,不过会存放在/sys/class/net目录下 2、Linux系统对网络设备驱动定义了4个层次,这4个层次有到下分为: 1)网络协议接口层: 实现统一的数据包收发的协议,该层主要负责调用dev_queue_xmit()函数发送数据,netif_rx()函数接收数据 2)网络设备接口层: 通过net_device结构体来描述一个具体的网络设备的信息,实现不同的
[单片机]
<font color='red'>S3C2440</font> 网卡驱动介绍以及制作虚拟网卡驱动(二十五)
S3C2440学习之GPIO按键控制LED灯
/* 名称:S3C2440学习之GPIO按键控制LED灯 说明:这是实验2440GPIO的输入功能。基本的流程和51单片机开发的差不多。都是对GPIO端口寄存器的控制不同的是,51单片机可以直接对进行位控制,而2440中GPIO只能对32位的寄存器进行写入或者读出。这样的话,对于有些逻辑操作要稍微复杂点。还有个不同的是,无论是STM32还是51在进行IO按键输入的时候,都需要进行按键消抖,在这里却没又体现出来按键消抖,这是为什么呢?据我了解是这样,在进行51和STM32实验的时候,按键控制的是数码管(数字增加,降低),所以按键的机械抖动会给数码管数字的变化带来显著的影响。在这里是按键控制led灯的亮和灭,虽然仍然存在机械抖动,
[单片机]
MSP430学习笔记11-八路ADC采集诺基亚5110液晶显示
本程序采用的是八路ADC单次采集的模式,根据配置,在单次的模式下转换完成后ADC12SC会自动复位,因此需要在循环中进行ADC12CTL0 |= ADC12SC;操作,而如果配置成连续采集的模式,只需要在程序开始将ADC12SC置位一次就可以,但是就需要注意当进入中断后如果不手动禁止中断会一直停留在循环中,因此在采集到需要的数据后需要将ADC关闭或者中断使能禁止才能重新回到主函数,这一点需要注意。 八路单次采集的程序如下: /*************************************** 八路AD多路单次采集基亚5110液晶显示 采集模式:多路单次 *****************************
[单片机]
ARM7、ARM9、ARM11、ARM-Cortex系列的关系
ARM公司自2004年推出ARMv7内核架构时,摒弃了以往 ARM+数字 这种处理器命名方法(ARM11之前的处理器统称经典处理器系列),重新启用Cortex来命名,并将Cortex系列细分为三大类: Cortex-A系列:面向性能密集型系统的应用处理器内核 Cortex-R系列:面向实时应用的高性能内核 Cortex-M系列:面向各类嵌入式应用的微控制器内核 Cortex-M系列主要是用来取代经典处理器ARM7系列(比如基于ARMv4架构的ARM7TDMI),Cortex-M比ARM7的架构高了3代,性能也有较大提升,所以新的设计推荐使用Cortex-M,关于从ARM7到Cortex-M的移植详见ARM官网指导 ARM7
[单片机]
ARM7、<font color='red'>ARM9</font>、ARM11、ARM-Cortex系列的关系
基于MSC1201微处理器的温度控制系统的实现
1 引言   随着现代控制技术的发展,在工业控制领域需要对现场数据进行实时采集,在一些重要场合对数据采集的要求更高,例如在电厂、钢铁厂、化工领域的生产中都需要对大量数据进行现场采集,而温度采集又是其中极为重要的部分,因此,需要一种高精度、低成本的数据采集与控制系统。    为了方便地实现温度采集与控制系统,笔者选用 MSC1201 作为系统 的 MCU 。 MSC1201 是的德州仪器 ( TI ) 新推出的一款低噪声、低成本数据采集微处理器,它具有的增强型 8051 内核,执行速度比标准 8051 内核快 3 倍,而功耗却更低, MSC1201 中的 ADC
[工业控制]
S3C2416替代S3C2440项目数据比对
S3C2440芯片已经停产,多年累积下来基于S3C2440而设计的产品定不在少数。为了使广大2440用户摆脱该mcu停产带来的麻烦,完美过渡升级,飞凌特推出FL2416开发板。该板采用核心板加底板的架构设计,方便学习的同时也方便产品开发。在这里笔者先就2416开发板和2440开发板,从芯片级、核心板级、底板级对两种开发板进行一下比对,使大家对FL2416开发板有一个初步的了解。 一、 S3C2416芯片与S3C2440芯片对比 S3C2416与S3C2440芯片对比 比对项目 S3C2416芯片 S3C2440芯片 备注 A RM
[单片机]
DSP芯片与触摸屏的接口控制
    摘要: 简述了液晶触屏控制产品的工作原理以及用于触摸屏控制的专用芯征ADS7843的工作原理。无线数字扩频通信平台是无线扩频通信的一种开放式平台,在此基础上增加液晶触摸屏控制,可实现文字和图形的编辑无线传送,使该产品用途更加广泛。     关键词: 电阻式触摸屏  DSP  ADS7843 以DSP(数字信号处理)芯征和FPGA(现场可编程逻辑门阵列)为核心的无线数字扩频通信平台是无线扩频通信的一个开放式平台,可用于无线接入、无线图像和音频传送、移动INTERNET、精确区域定位LPS、智能遥控探测等高科技领域。我们在此基础上增加了液晶显示和触摸控制,从而实现文字和图形信息的编辑和无线传送,使该产品用
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved