您的位置 首页 电源

ARM开发步步深化之把握ADC和触摸屏

实验目的:通过串口显示输入的电压值及采集按下触摸屏的(x,y)坐标值借此掌握S3C2410的ADC和触摸屏的使用。实验环境及说明:恒颐S3C2410开发板H2410。H24X0E扩展板上AIN

  试验意图:经过串口显现输入的电压值及收集按下触摸屏的(x,y)坐标值借此把握S3C2410的ADC和触摸屏的运用。

  试验环境及阐明:恒颐S3C2410开发板H2410。H24X0E扩展板上AIN0~AIN1输出悬空,经过外接可变电阻电路采样电压值;外接的触摸屏接口完结扩展触摸屏完结相应操作本试验根据夏普3.5英寸LQ035Q7DB02。

  实 验思路:开发板上电发动后,主动将NandFlash开端的4K数据仿制到SRAM中,然后跳转到0地址开端履行。封闭看门狗、初始化SDRAM及 NandFlash控制器、设置MPLL来改动FCLK、HCLK、PCLK的值,设置仓库,仿制4KB后的16KB数据到SDRAM,之后进入main 函数中进行ADC及触摸屏的测验。

  常识把握:ADC(模数转化器)和Touch Screen(触摸屏)。

  ★S3C2410 ADC和TouchScreen概述:S3C2410内置1个8信道的10bit模数转化器,该ADC能以500KSPS的采样速率将外部的模仿信号转化 为10位的二进制数字量。一起ADC部分能与CPU的触摸屏控制器协同作业,完结对触摸屏肯定地址的丈量。ADC和TouchScreen共用一个A/D 转化器,ADC可一起采样8路模仿输入信号,运用触摸屏时,AIN[7]、AIN[5]被用来丈量XP/YP的电平,剩下的六个引脚可用来做一般ADC输 入。2410ADC和触摸屏功用框图如下:

  ★ADC和TouchScreen控制器的作业形式:

  ●ADC一般转化形式(Normal Converson Mode)—一般转化形式(AUTO_PST=0,XY_PST=0)是用来进行一般的ADC转化之用的,例如经过ADC丈量电池电压等等。

  ● 独立X/Y轴坐标转化形式(Separate X/Y Position Conversion Mode)—独立X/Y轴坐标转化形式其实包含了X轴形式和Y轴形式2种形式。 首要进行X轴的坐标转化(AUTO_PST=0,XY_PST=1),X轴的转化材料会写到ADCDAT0寄存器的XPDAT中,等候转化完结后,触摸屏 控制器会发生相应的中止。 然后进行Y轴的坐标转化(AUTO_PST=0,XY_PST=2),Y轴的转化材料会写到ADCDAT1寄存器的YPDAT中,等候转化完结后,触摸屏 控制器会发生相应的中止。

  ●主动X/Y轴坐标转化形式(Auto X/Y Position Conversion Mode)—主动X/Y轴坐标转化形式(AUTO_PST=1,XY_PST=0)将会主动地进行X轴和Y轴的转化操作,随后发生相应的中止。

  ● 中止等候形式(Wait for InterruptMode)—在体系等候"Pen Down",即触摸屏按下的时分,其实是处于中止等候形式。一旦被按下,实时发生"INT_TC"中止信号。每次发生此中止都,X轴和Y轴坐标转化材料都 能够从相应的材料寄存器中读出。

  ●搁置形式(Standby Mode)—在该形式下转化材料寄存器中的值都被保存为前次转化时的材料。

  ★ADC两种发动方法:以手艺发动和读成果时就主动地发动下一次转化;以查询状况位和发中止方法获悉转化是否完毕。ADC的操作只触及3个寄存器:

  ●ADCCON— 设置ADCCON寄存器,挑选输入信号通道,设置A/D转化器的时钟(A/D时钟=PCLK/(PRSCVL+1))。A/D时钟最大为2.5MHz,且 应小于PCLK的1/5;设置ADCCON寄存器,发动转化(设置READ_START位则读转化数据(读ADCDAT0寄存器)时即发动下一次转化;否 则可经过设置ENABLE_START位来发动A/D转化);ADCCON各位意义(ENABLE_START—置1发动ADC转化,置0无操作; RESR_START—置1答应读操作发动ADC转化,置0制止读操作发动ADC转化; STDBM—置1将ADC置为搁置状况(形式),置0将ADC置为正常操作状况;SEL_MUX—挑选需求进行转化的ADC信道; PRSCV—ADC转化时钟预分频参数;PRSCEN—ADC转化时钟使能; ECFLG—ADC转化完结标志位(只读)。为1ADC转化完毕,为0ADC转化进行中)。

  ●ADCTSC—设置ADCTSC寄存器,使 用设为一般转化形式,不运用触摸屏功用;ADCTSC各位意义(XY_PST—对X/Y轴手动丈量形式进行挑选;AUTO_PST—X/Y轴的自 动转化形式使能位;PULL_UP—XP端的上拉电阻使能位;XP_SEN—设置nXPON输出状况;XM_SEN—设置XMON输出状 态;YP_SEN—设置nYPON输出状况;YM_SEN—设置YMON输出状况)。

  ●ADCDAT0—完结ADC转化后,读取 ADCDAT0寄存器取得数值(假如运用查询方法,则可不断读取ADCCON寄存器的ECFLG位来确认是否转化完毕;不然能够运用INT_ADC中止, 发生INT_ADC中止时表明转化完毕);ADCDAT0各位意义(XPDATA—X轴转化材料寄存器;XY_PST—挑选X/Y轴主动转化模 式;AUTO_PST—X/Y轴主动转化使能位;UPDOWN—挑选中止等候形式的类型。为0按下发生中止,为1开释发生中止)。

  ★触摸屏操作还触及到以下两个寄存器:

  ●ADCDLY—ADC转化周期等候定时器。

  ●ADCDAT1—同ADCDAT0。

  要害代码解析:

  ★head.S头文件来初始化,设置SDRAM,将程序仿制到SDRAM,然后跳到SDRAM持续履行

  .equ MEM_CTL_BASE, 0x48000000

  .text

  .global _start

  _start:

  @中止向量表处理函数,只给出复位和一般中止形式的处理函数,其它反常未运用

  b Reset

  …

  b HandleIRQ

  @0x1c: 快中止形式的向量地址

  HandleFIQ:

  b HandleFIQ

  Reset: @复位处理

  bl disable_watch_dog @关门喂狗

  bl mem_control_setup @设置存储控制器

  ldr sp, =4096 @设置栈指针,以下C函数调用前需求设好栈

  bl init_clock @设置MPLL,改动FCLK、HCLK、PCLK

  bl init_nand @初始化NandFlash

  @将NandFlash中地址4096开端的代码仿制到SDRAM中

  ldr r0, =0x30000000 @方针地址=0x30000000,SDRAM开端地址

  mov r1, #4096 @源地址=4096,衔接时代码在4096开端处

  mov r2, #16*1024 @仿制长度=16K,关于本试验满足

  bl read_nand @调用C函数read_nand

  bl clean_bss @铲除bss段

  msr cpsr_c, #0xd2 @进入中止形式

  ldr sp, =0x31000000 @设置中止形式栈指针

  msr cpsr_c, #0xdf @进入体系形式

  ldr sp, =0x34000000 @设置体系形式栈指针

  ldr lr, =ret_initirq @设置回来地址

  ldr pc, =init_irq @初始化中止

  ret_initirq:

  msr cpsr_c, #0x5f @设置I-bit=0,开IRQ中止

  ldr lr, =halt_loop @设置回来地址

  ldr pc, =main @调用main函数

  halt_loop:

  b halt_loop

  ★main.c文件完结完结串口挑选ADC和TouchScreen操作,首要代码:

  #include

  #include

  #include 

  int main()

  {

  char c;

  init_uart0(); //波特率115200,8N1(8个数据位,无校验位,1个中止位)

  while (1)

  {

  printf("\r\n~~~~~~ Test ADC and Touch Screem ~~~~~~\r\n");

  printf("[A] Test ADC\n\r");

  printf("[T] Test Touch Screem\n\r");

  printf("Enter your selection: ");

  c = getc();

  putc(c);

  switch (c)

  {

  case 'a':

  case 'A':

  {

  Test_Adc();//操作ADC

  break;

  }

  case 't':

  case 'T':

  {

  Test_Ts();//操作TouchScreen

  break;

  …

  }

  ★adc_ts.c ADC和触摸屏的测验函数,首要代码:

  …

  /*

  * 运用查询方法读取A/D转化值。

  * 输入参数ch: 模仿信号通道,取值为0~7

  */

  static int ReadAdc(int ch)

  {

  //挑选模仿通道,使能预分频功用,设置A/D转化器的时钟 = PCLK/(49+1)

  ADCCON = PRESCALE_EN | PRSCVL(49) | ADC_INPUT(ch);

  //铲除位[2],设为一般转化形式

  ADCTSC &= ~(1<<2);

  //设置位[0]为1,发动A/D转化

  ADCCON |= ADC_START;

  //当A/D转化真实开端时,位[0]会主动清0

  while (ADCCON & ADC_START);

  //检测位[15],当它为1时表明转化完毕

  while (!(ADCCON & ADC_ENDCVT));

  //读取数据

  return (ADCDAT0 & 0x3ff);

  }

  /*

  * 测验ADC。经过A/D转化,丈量可变电阻器的电压值

  */

  void Test_Adc(void)

  {

  int vol0, vol1;

  printf("Measuring the voltage of AIN0 and AIN1, press any key to exit\n\r");

  while (!awaitkey(0)) // 串口无输入,则不断测验

  {

  vol0 = (ReadAdc(0)*3)/1024; // 核算电压值

  vol1 = (ReadAdc(1)*3)/1024; // 核算电压值

  printf("AIN0 = %d AIN1 = %d\r", vol0,vol1);

  }

  printf("\n");

  }

  static void Isr_Tc(void)

  {

  if (ADCDAT0 & 0x8000) //ADCDAT0[15]为1表明触摸屏被松开

  {

  printf("\r\nStylus Up!!\n\r");

  //wait_down_int(); //进入"等候中止形式",等候触摸屏被按下

  }

  else

  {

  printf("\r\nStylus Down: ");

  mode_auto_xy(); //进入主动(接连)X/Y轴坐标转化形式

  ADCCON |= ADC_START; //设置位[0]为1,发动A/D转化

  }

  // 清INT_TC中止

  …

  }

  static void Isr_Adc(void)

  {

  printf("xdata = %4d, ydata = %4d\r\n",(int)(ADCDAT0 & 0x3ff),(int)(ADCDAT1 & 0x3ff));

  //wait_down_int(); //进入"等候中止形式",等候触摸屏被松开

  //清INT_ADC中止

  …

  }

  void AdcTsIntHandle(void)

  {

  if (SUBSRCPND & BIT_SUB_TC)

  Isr_Tc();

  if (SUBSRCPND & BIT_SUB_ADC)

  Isr_Adc();

  }

  /*

  *测验触摸屏,打印触点坐标

  */

  void Test_Ts(void)

  {

  isr_handle_array[ISR_ADC_OFT] = AdcTsIntHandle; // 设置ADC中止服务程序

  INTMSK &= ~BIT_ADC; //敞开ADC总中止

  INTSUBMSK &= ~BIT_SUB_TC; //敞开INT_TC中止,即触摸屏被按下或松开时发生中止

  INTSUBMSK &= ~BIT_SUB_ADC; //敞开INT_ADC中止,即A/D转化完毕时发生中止

  //使能预分频功用,设置A/D转化器的时钟 = PCLK/(49+1)

  ADCCON = PRESCALE_EN | PRSCVL(49);

  /*

  *采样延时时刻 = (1/3.6864M)*50000 = 13.56ms

  *即按下触摸屏后,再过13.56ms才采样

  */

  ADCDLY = 50000;

  wait_down_int();/*进入“等候中止形式”,等候触摸屏被按下*/

  printf("Touch the screem to test, press any key to exit!\n\r");

  getc();

  // 屏蔽ADC中止

  …

  }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/241523.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部