270 likes | 499 Views
S3C44B0X 看门狗定时器、 A/D 转换器. 功能及应用开发. S3C44B0X 看门狗定时器. 在嵌入式应用中, CPU 必须可靠工作,即使因为某种原因进入了一个错误状态(运行不稳定、死机或停不了机即程序跑飞等现象),系统也应该可以自动恢复。看门狗的用途就是使微控制器在进入错误状态后的一定时间内复位。 看门狗有 硬件看门狗和软件看门狗 之分,如果用 MCU 芯片外部电路实现,为硬件看门狗;如果用芯片内部定时 / 计数器实现,称为软件看门狗。当看门狗超时后,引起看门狗中断,给系统发出一个复位信号引起系统重启。
E N D
S3C44B0X看门狗定时器、A/D转换器 功能及应用开发
S3C44B0X看门狗定时器 在嵌入式应用中,CPU必须可靠工作,即使因为某种原因进入了一个错误状态(运行不稳定、死机或停不了机即程序跑飞等现象),系统也应该可以自动恢复。看门狗的用途就是使微控制器在进入错误状态后的一定时间内复位。 看门狗有硬件看门狗和软件看门狗之分,如果用MCU芯片外部电路实现,为硬件看门狗;如果用芯片内部定时/计数器实现,称为软件看门狗。当看门狗超时后,引起看门狗中断,给系统发出一个复位信号引起系统重启。 “喂狗”—当一个硬件系统开启了watchdog功能时,运行在这个硬件系统上的软件必须在规定的时间间隔内向看门狗发送一个信号,即复位看门狗计数器的值,以免watchdog计时超时引发系统重启。 • 看门狗定时器概述
S3C44B0X看门狗定时器 • 看门狗定时器工作过程 看门狗定时器使用MCLK为其时钟源,MCLK频率首先预分频,WTCON[15:8]送入预分频值,然后使用再分频因子(16、32、64、128)再分频,由WTCON[4:3]选择,接着WTDAT中存放的计数初值装载到WTCNT中,WTCNT开始递减计数。当计数到0时,由WTCON[2]位控制是否允许看门狗中断产生。若该位为0,不允许中断,进入复位信号产生器。此时,若看门狗输出复位信号的允许位WTCON[0]为1时,允许产生复位信号,复位信号产生器就发出一个复位信号RESET。 注:在看门狗使能之后,WTDAT不能自动装入WTCNT。因此,初值必须在看门狗定时器开始工作前,写到看门狗定时器计数寄存器WTCNT中。
中断允许位 计数初值 再分频 • 看门狗功能框图: 复位信号 系统时钟 预分频 WTCON:看门狗定时计数寄存器 WTDAT:看门狗定时器数据寄存器
看门狗功能框图: 看门狗定时器时间周期:
看门狗寄存器: 一旦使能,WTDAT不能自动装入WTCNT,因此,初值必须在看门狗定时器开始工作前,写到WTCNT中。 WTCON
看门狗寄存器: WTDAT WTCNT
看门狗定时器应用流程 1、设置复位操作功能; 2、对看门狗控制寄存器WTCON设置,包括比例因子、分频值、复位使能等; 3、对看门狗数据寄存器WTDAT和计数寄存器WTCNT进行设置; 4、启动看门狗计数器。
void Test_WDTimer(void) { rINTMSK=~(BIT_GLOBAL|BIT_WDT); pISR_WDT=(unsigned)Wdt_Int; isWdtInt=0; rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1<<2); rWTDAT=8448/4; rWTCNT=8448/4; rWTCON=rWTCON|(1<<5); while(isWdtInt!=10); rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1); // reset enable rWTCNT=8448*2; rWTCON=rWTCON|(1<<5); while(1); rINTMSK|=BIT_GLOBAL; } void Wdt_Int(void) { rI_ISPC=BIT_WDT; Uart_Printf("%d ",++isWdtInt); } 实例 interrupt enable Watch Dog timer enable
A/D转换器 A/D转换器为10位,则其分辨率为:满量程的1/1024的模拟量 A/D转换器为10位,输入5V电压的模拟量,求分辨率 • 主要性能指标 • 分辨率 • 转换时间 • 量程 • 绝对精度 • 相对精度 • 线性误差 • 输入带宽 • 输入电压范围 ——A/D转换器能分辨的最小模拟输入量 ——A/D转换完成一次所需时间 ——所能转换的输入电压范围 ——整个输出数字范围内,任一数码对应模拟量 实际值与理论值之间的最大误差,用差值表示 ——与绝对误差同一含义,用百分比表示 ——1 LSB(最低有效位) ——0~输入信号的最高频率 ——0~2.5V
S3C44B0X A/D转换器 • 特性 • 10位逐次逼近式模数转换器; 分辨率: A/D转换器能分辨的最小模拟输入量 1/1024 A/D转换器转换方法分类 1、计数式 2、逐次逼近式
特性 • 最高转换速率:100ksps • 测量范围:0~2.5V; • 8通道多路模拟输入端; • 具有掉电模式。 • 10位分辨率 • 1 LSB线性误差 • 0~100HZ输入带宽 (kilo samples per second)
S3C44B0X A/D转换器内部结构框图 AMUX:通道选择 SAR:Successive Approximation Register 逐次逼近
A/D控制寄存器 A/D预分频寄存器 ADCCON ADCPSR AD转换时钟 … AIN0 AIN1 A/D 转换控制电路 A/D数据寄存器 … ADCDAT AIN7 A/D转换器 • A/D转换器内部结构
A/D控制寄存器 A/D预分频寄存器 ADCCON ADCPSR AD转换时钟 … AIN0 AIN1 A/D 转换控制电路 A/D数据寄存器 … ADCDAT AIN7 • A/D转换器寄存器描述
A/D预分频寄存器 ADCPSR AD转换时钟 … AIN0 AIN1 A/D 转换控制电路 A/D数据寄存器 … ADCDAT AIN7 • A/D转换器寄存器描述 ——控制寄存器 A/D控制寄存器 ADCCON 注:1、转换期间,FLAG位一直为0,转换结束后为1; 2、SLEEP位为1表示休眠状态,A/D转换操作暂停,退出休眠状态需要等待10ms; 3、通道切换至少有15us的间隔。 4、通过READ_STRAT使能,可以通过DMA通道将AD转换数据存储到内存。
A/D预分频寄存器 ADCPSR AD转换时钟 … AIN0 AIN1 A/D 转换控制电路 A/D数据寄存器 … ADCDAT AIN7 • A/D转换器寄存器描述 ——预分频寄存器 A/D控制寄存器 ADCCON 注:预置比例因子决定转换时间的长短,数据越大,转换时间越长。 A/D转换时间计算:如系统时钟为66MHz,PRESCALER=20: 转换时间=1/(66MHz/(2*(20+1)))*16
S3C44B0X A/D转换器 • 触摸屏分类: • 表面声波触摸屏; • 电容感应触摸屏;-苹果手机 材质很硬 与玻璃相当 支持多点触摸 • 红外线触摸屏; • 电阻式触摸屏;-诺基亚5800手机 材质很软 不支持多点触摸 S3CEV40上采用4线式电阻式触摸屏,点数320*240。 线数越多,坐标定位越精确
S3CEV40触摸屏的接口设计 触摸屏X轴方向接通5V均匀电压场,Y方向同样有5V的均匀电压场。接触点产生后,即产生中断通知CPU进行A/D转换,则导电层将接触点的电压引至控制电路进行A/D转换,得到的电压值和5V相比可以得到触摸点的坐标。 已知触摸屏左上和右下角坐标:Ymax,Ymin,Xmax,Xmin 则转化为象素点坐标(X,Y): X=( Xa - Xmin )*320/( Xmax - Xmin ) Y=( Ya - Ymin )*240/( Ymax - Ymin )
触摸屏的接口设计 修正
触摸屏的接口设计 X:AIN1 Y:AIN0
触摸屏的初始化 void TS_init(void) { /* enable interrupt */ rINTMOD=0x0; //IRQ中断模式 rINTCON=0x1; rI_ISPC |= BIT_EINT2; // clear pending_bit rPUPE = 0x0; // Pull up rPDATE = 0xb8; // should be enabled DelayTime(100); rEXTINT |= 0x200; // falling edge trigger pISR_EINT2=(int)user_irq1; // set interrupt handler rCLKCON = 0x7ff8; // enable clock,时钟和电源管理模块 rADCPSR = 0x1;//0x4; // A/D prescaler rINTMSK =~(BIT_GLOBAL|BIT_EINT2); oneTouch = 0; }
.macro IRQHandle user_handle: stmdb sp!, {r0-r11, ip, lr} /* 保存r0-r11, ip, lr */ ldr r0, =\user_handle mov lr, pc bx r0 /* 调用user中断处理程序 */ ldmia sp!, {r0-r11, ip, lr} /* 恢复r0, ip, lr */ subs pc, r14, #4 /* 中断返回 */ .endm .extern TSInt .global user_irq1 user_irq1: IRQHandle TSInt
触摸屏的中断功能 void TSInt(void) { int i; char fail = 0; ULONG tmp; ULONG Pt[6]; // <X-Position Read> rPDATE=0x68; rADCCON=0x1<<2; // AIN1 DelayTime(1000); // delay to set up the next channel for( i=0; i<5; i++ ) { rADCCON |= 0x1; // Start X-position A/D conversion while( rADCCON & 0x1 ); // Check if Enable_start is low while( !(rADCCON & 0x40) ); // Check ECFLG Pt[i] = (0x3ff&rADCDAT); } // read X-position average value Pt[5] = (Pt[0]+Pt[1]+Pt[2]+Pt[3]+Pt[4])/5; tmp = Pt[5];
// <Y-Position Read> rPDATE=0x98; rADCCON=0x0<<2; // AIN0 DelayTime(1000); // delay to set up the next channel for( i=0; i<5; i++ ) { rADCCON |= 0x1; // Start Y-position conversion while( rADCCON & 0x1 ); // Check if Enable_start is low while( !(rADCCON & 0x40) ); // Check ECFLG Pt[i] = (0x3ff&rADCDAT); } // read Y-position average value Pt[5] = (Pt[0]+Pt[1]+Pt[2]+Pt[3]+Pt[4])/5; if(!(CheckTSP|(tmp < Xmin)|(tmp > Xmax)|(Pt[5] < Ymin)|(Pt[5] > Ymax))) // Is valid value? { tmp = 320*(tmp - Xmin)/(Xmax - Xmin); // X - position Uart_Printf("X-Posion[AIN1] is %04d ", tmp); Pt[5] = 240*(Pt[5] - Xmin)/(Ymax - Ymin); Uart_Printf(" Y-Posion[AIN0] is %04d\n", Pt[5]); }