ch1h机型中单个stm32定时器器最大stm32定时器时间是多长

5012人阅读
&&&& 今天在工作时,需要高精度(1ms)的定时器。先是想到SetTimer函数,当定时器周期小于50ms时,很不精确,后面查找SDK,发现timeSetEvent函数,这是一个Windows多媒体高精度定时器(1ms)。下面是写的简单应用例子,希望对需要相关方面的朋友有帮助。
&&&& 1、首先介绍函数的参数说明:
&&&& 原型:
&&&& MMRESULT timeSetEvent(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& UINT&&&&&&&&&& uDelay,&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& UINT&&&&&&&&&& uResolution,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&LPTIMECALLBACK lpTimeProc,&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &DWORD_PTR&&&&& dwUser,&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& UINT&&&&&&&&&& fuEvent&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& );
uDelay: 事件延迟,毫秒。如果这个值不在定时器支持的最小和最大延时之间的话,函数将返回一个错误。
uResolution: 定时器的分辨力,毫秒。小的数值表示高的分辨力;分辨力为0表示周期事件应该以允许的最高精度发生。尽管如此为减小系统开销,你应该使用适合你应用的最大值。
lpTimeProc: 指向回调函数的指针。发生单次事件时它被调用一次,发生周期事件时,它被周期调用。如果fuEvent是TIME_CALLBACK_EVENT_SET或TIME_CALLBACK_EVENT_PULSE标识,这时lpTimeProc被翻译成事件的一个句柄。根据单个事件或周期事件的完成,事件会被设置或触发。对于fuEvent的其它值,lpTimeProc被翻译为一个函数指针,它具有下面的签名:void (CALLBACK)(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
dwUser:用户提供的回调函数数据
fuEvent:定时事件类型。这个参数可能包含以下值的一个:&&& (1) TIME_ONESHOT:事件在uDelay毫秒后发生一次&&& (2) TIME_PERIODIC:事件每隔uDelay毫秒发生一次。
&&&& 2、一般性的回调函数
&&&& 注:用timeSetEvent需要用到下面头文件及库文件:
&&& #include &Windows.h&&&& #include &MMSystem.h&&&& #pragma comment(lib, "winmm.lib")
&&&& // 回调函数&&&& void CALLBACK CallBackFun(UINT wTimerID, UINT msg,DWORD dwUser, DWORD dwl,DWORD dw2)&&&& {&&&&&&&&&&&&&&printf("timeSetEvent test!/n");&&&& }
&&&&& int _tmain(int argc, _TCHAR* argv[])&&&& {&&&&&&&&&&&&&&timeSetEvent(1000, 1, CallBackFun, 0, TIME_PERIODIC);
&&&&&&&&&&&&&&&&&&&&&&&&&&&scanf("%d", &a);&&&&&&&&&&&&& return 0;&&&&& }
&&&& 3、回调函数为类的成员函数
class CTimeTest{&public:&&&&&&& CTimeTest()&&&&&& &{&&&&&&& }&&&&&&&& ~CTimeTest()&&&&&&& {
&&&&&&&&&&&&&&&// 清除定时器&&&&&&&&&&&&&& timeKillEvent(m_mmTimerID);&&&&&&&& }
&&&&&&&& // 回调函数&&&&&&&& static void CALLBACK CallBackFun(UINT wTimerID, UINT msg,DWORD dwUser, DWORD dwl,DWORD dw2);
&&&&&&& &// Time Test&&&&&&&& void TimeTest();private:&&&&&&&&&&static int m_iID;
&&&&&&&&&&// 定时器ID&&&&&&&&& MMRESULT m_mmTimerID;};
// 静态成员变量初始化int CTimeTest::m_iID = 0;
void CALLBACK CTimeTest::CallBackFun(UINT wTimerID, UINT msg,DWORD dwUser, DWORD dwl,DWORD dw2){&&&&&&&&&&& printf("timeSetEvent: %d!/n", m_iID++);}
void CTimeTest::TimeTest(){&&&&&&&&&& timeSetEvent(1000, 1, CallBackFun, (DWORD)this, TIME_PERIODIC);}
int _tmain(int argc, _TCHAR* argv[]){&&&&&&&&&& CTimeTest timeT&&&&&&&&&&& timeTest.TimeTest();
&&&&&&&&&&&&&&&&&&&&&& scanf("%d", &a);&&&&&&&&&&& return 0;}
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:96140次
积分:1430
积分:1430
排名:第11426名
原创:45篇
评论:31条
(2)(11)(5)(4)(2)(6)(5)(8)(2)您现在的位置: >
定时器[浏览次数:约6928次]
定时器的分类
  定时器根据工作原理可以为以下:
  1、 接通延时型定时器:接通延时型定时器是各种PLC中最常见最基本的定时器,这种定时器在 SIEMENS的PLC中,称为SD型定时器
  2、 断开延时型定时器:这种定时器是当输入条件00000为ON时无延时作用,只有在输入条件00000为OFF时产生延时作用。在SIEMENS的PLC中,称为SF型定时器
  3、保持型接通延时定时器:这种定时器是当输入条件00000为ON后,即产生锁存功能,即使输入条件00000又变为OFF,仍视输入条件为ON,当定时器的当前值等于设定值时,定时器动作,这种定时器在SIEMENS的PLC中,称为SS型定时器
  4、脉冲型定时器:这种定时器是当输入条件00000为ON后,定时器即时动作,但经过定时器所设定的时间后,即使输入条件00000仍为ON,定时器却变为OFF状态。即这种定时器ON状态的维持时间是由设定值决定的。如果00000为ON的时续时间小于定时器的设定值,定时器的ON状态维持时间为输入条件00000为ON的持续时间。这种定时器在SIEMENS的PLC中,称为SP型定时器。
  5、扩张型脉冲定时器:这种定时器与脉冲型定时器的区别是,只要输入条件00000出现了ON状态,不管其持续时间多长,均可使定时器为ON的维持的时间与定时器的设定值一致。这种定时器在SIEMENS的PLC中,称为SE型定时器。
  定时器按结构可分为机械式、电动式和电子式:
  1、机械式定时器  以发条为原动力,用擒纵调速器控制走时精度,通过齿轮传动和凸轮,按时间控制机构预置的时段操纵执行机构动作。计时精度要求不高的定时器(如风扇定时器、洗衣机定时器、厨房用定时器、照相暗房用定时器、电视机控制用定时器、电灯开关定时器),一般采用无固有振动周期的调速器。这些定时器都是在手动上发条的同时预置时限,定时精度不高,但结构简单,使用方便。计时精度要求高、定时范围在3~12小时的定时器,一般采用摆轮游丝调速器。
  2、电动式定时器  用交流同步电动机或石英步进电机驱动,通过齿轮传动和凸轮簧片触点机构,按预置的时段或时刻控制执行机构。其中短时段控制的电动式定时器可用于程序控制式洗衣机、洗碗机、微波炉、烘箱及时间继电器等;长时段电动式定时器是一种24小时或7天程序控制的开关装置,可预置开关动作多次,最短时间控制间隔一般为15分钟,可用于用户用电情况监控、照明控制、实验室装置控制、空调器控制和自动生产线上某些设备的定时控制等。
  3、电子式定时器  利用石英振荡器或民用交流电的标准频率,经过分频计数组成时间累加器或数字钟,按照预置的时间编码输出控制信号。这种定时器走时精确,时间设定没有误差,定时精度高,控制程序多。其中长时段定时器最小控制时段一般为1分钟,配上微处理器后能精确地编制一年的时间程序,组成多路可编程序的定时器。电子式定时器在工业自动化控制系统中应用广泛,它也是节约能源管理中一种有效的技术措施。电子定时器类的电子定时开关钟,可用于按高、平、低峰用电收取不同电费制度的场合,它将一天内的用电高峰、平峰、低谷时间在定时开关中设定,并分别接通3种电表进行计费。电子式定时器在科学实验中和在微波炉、电饭锅、洗衣机等电器中也有使用
定时器误差补偿方法
  1 前言单片机内部一般有若干个定时器。如8051单片机内部有定时器0和定时器1。在定时器计数溢出时,便向CPU发出中断请求。当CPU正在执行某指令或某中断服务程序时,它响应定时器溢出中断往往延迟一段时间。这种延时虽对单片机低频控制系统影响甚微,但对单片机高频控制系统的实时控制精度却有较大的影响,有时还可能造成控制事故。为扩大单片机的应用范围,本文介绍它的定时器溢出中断与CPU响应中断的时间误差、补偿误差的方法和实例。
  2 误差原因、大小及特点产生单片机定时器溢出中断与CPU响应中断的时间误差有两个原因。一是定时器溢出中断信号时,CPU正在执行某指令;二是定时器溢出中断信号时,CPU正在执行某中断服务程序。
  2.1. CPU正在执行某指令时的误差及大小由于CPU正在执行某指令,因此它不能及时响应定时器的溢出中断。当CPU执行此指令后再响应中断所延迟的最长时间为该指令的指令周期,即误差的最大值为执行该指令所需的时间。由于各指令都有对应的指令周期,因此这种误差将因CPU正在执行指令的不同而不同。如定时器溢出中断时,CPU正在执行指令MOV A, Rn,其最大误差为1个机器周期。而执行指令MOV Rn, direct时,其最大误差为2个机器周期。当CPU正在执行乘法 或除法指令 时,最大时间误差可达4个机器周期。在8051单片机指令系统中,多数指令的指令周期为1~2个机器周期,因此最大时间误差一般为1~2个机器周期。若振荡器振荡频率为fosc,CPU正在执行指令的机器周期数为Ci,则最大时间误差为Δtmax1=12/fosc×Ci(us)。例如fosc=12MHZ,CPU正在执行乘法指令(Ci=4),此时的最大时间误差为: Δtmax1=12/fosc×Ci=12/(12×106)×4=4×10-6(s)=4(μs)
  2.2 CPU正在执行某中断服务的程序时的误差及大小定时器溢出中断信号时,若CPU正在执行同级或高优先级中断服务程序,则它仍需继续执行这些程序,不能及时响应定时器的溢出中断请求,其延迟时间由中断转移指令周期T1、中断服务程序执行时间T2、中断返回指令的指令周期T3及中断返回原断点后执行下一条指令周期T4(如乘法指令)组成。中断转移指令和中断返回指令的指令周期都分别为2个机器周期。中断服务程序的执行时间为该程序所含指令的指令周期的总和。因此,最大时间误差Δtmax2为: Δtmax2=(T1+T2+T3+T4)12/fosc=(2+T2+2+4)12/ fosc=12(T2+8)/ fosc若设fosc=12MHZ,则最大时间误差为: Δtmax2=12(T2+8)/ fosc =12(T2+8)/12×106=(T2+8)×10-6(s)=T2+8(μs)。由于上式中T2一般大于8,因此,这种时间误差一般取决于正在执行的中断服务程序。当CPU正在执行中断返回指令RETI、或正在读写IE或IP指令时,这种误差在5个机器周期内。
  2.3 误差非固定性特点定时器溢出中断与CPU响应中断的时间误差具有非固定性特点。即这种误差因CPU正在执行指令的不同而有相当大的差异。如CPU正在执行某中断服务程序,这种误差将远远大于执行一条指令时的误差。后者误差可能是前者误差的几倍、几十倍、甚至更大。如同样只执行一条指令,这种误差也有较大的差别。如执行乘法指令MUL AB 比执行MOV A, Rn指令的时间误差增加了3个机器周期。这种误差的非固定不仅给误差分析带来不便,同时也给误差补偿带来困难。
  3 误差补偿方法由于定时器产生溢出中断与CPU响应中断请求的时间误差具有非固定性,因此,这种误差很难用常规方法补偿。为此,本文介绍一种新方法。现介绍该方法的基本思路、定时器新初值及应用情况。
  3.1 基本思路为使定时器溢出中断与CPU响应中断实现同步,该方法针对中断响应与中断请求的时间误差,对定时器原有的计数初值进行修改,以延长定时器计数时间,从而补偿误差。在该方法中,当定时器溢出中断得到响应后,即停止定时器的计数,并读出计数值。该计数值是定时器溢出后,重新从OOH开始每个机器周期继续加1所计的值。然后,将这个值与定时器的停止计数时间求和。若在定时器原计数初值中减去这个和形成新计数初值,则定时器能在新计数初值下使溢出中断与CPU响应中断实现同步,从而达到误差的补偿要求。
  3.2 定时器新计数初值若定时器为计数方式,操作方式为1,则计数器初值X0=216-t0×fosc/12。式中fosc为振荡器的振荡频率。t0为需要定时的时间,也为中断的间隔时间。X0为定时器原计数初值。在对定时器溢出中断与CPU响应中断时间误差进行补偿时,定时器的新计数初值X1为:X1=216-t3× fosc/12t3=t0+t1+t2式中t0为中断间隔时间。t1为定时器停止计数时间,该时间为定时器停止计数到重新启动计数之间所有程序指令周期数的总和。t2为定时器溢出中断后,重新从OOH开始直至计数器停止时计的值。在误差补偿中,若将定时器计数初值X1取代X0,则可使定时器下次的溢出中断与CPU响应中断实现同步。
  3.3 实例要求补偿定时器每1ms产生一次溢出中断时的中断响应延迟的误差。若振荡器振荡频率fosc=12MHZ,定时器工作在计数方式,工作模式为1,则补偿中断响应时间误差时的定时器新初值X1为:X1=216-t3× fosc/12=216-(t0+ t1)- t2=216-(1000+ 13)- t2误差补偿程序为: …… 0 CLR EA ;关CPU中断1 CLR TRi ;停止定时器计数2 MOV R0, #OOH ;R0清零3 MOV R0, #LOW(216) ;定时器最大计数值的低8位送R04 MOV A, R05 SUBB A, #LOW(1000+13) ;216的低8位减去( t0+ t1)的低8位送累加器A6 SUBB A, TLi ;216的低8位减去( t0+ t1+ t2)的低8位送TLi7 MOV TLi, A 8 MOV R0, #OOH ;R0清零9 MOV R0, #HIGH(216) ;216 的高8位送R010 MOV A, R0 11 SUBB A, #HIGH(1000+13) ;216的高8位减去( t0+ t1)的高8位送A12 SUBB A, THi ;216的高8位减去( t0+ t1 +t2)的高8位送A13 MOV THi, A14 SETB TRi ;重新启动定时器 …… 在上式和上段程序中,由于fosc=12MHZ,中断间隔时间为1ms,因此t0的机器周期数为1000。由于第1条指令到第14条指令的指令周期的机器周期数之和为13,因此,t1为13个机器周期。CPU虽在执行第一条指令CLR TRi 后停止定时器计数,但在TLi、THi中分别保存了t2的低位数据和高位数据。 4 结束语由于本文介绍的误差补偿方法能对定时器溢出中断与CPU响应中断的非固定性时间误差进行有效补偿,因此,该方法对于提高高频控制系统实时控制精度和扩大单片机应用范围都有较高的实用价值。
定时器基本操作
  F2810/F2812器件上有3个Q9位CPU定时器(TIMERO/1/2)。只有定时器1和2预留给实时操作系统DSP/BIOS使用,只有定时器0可以在就用程序中使用,定时器的功能如图1所示。
  图1 定时器功能框图
  若处理器采用30 MHz的外部时钟,经过锁相环10/2倍频后,系统的时钟工作在150 MHz。图中的定时器选择SYSCLKOUT作为定时器时钟,工作频率也是150 MHz。一旦定时器被使能(TCR-Bit 4=0),定时器时钟经过预定标计数器(PSCH:PSC)递减计数,预定标计数器产生下溢后向定时器的32位计数器(TIMH:TIM)借位p最后定时器计数器产生溢出使定时器向CPU发送中断。定时器中断结构如图2所示。
  每次预定标计数器产生溢出后使用分频寄存器(TDDRH:TDDR)中的值重新装载。同样,32位周期寄存器(PRDH[_]PRD)为32位计数器提供重新装载值。
  图2 定时器中断结构
定时器的比较操作
  每个通用定时器都有一个比较寄存器TxCMPR和一个PWM输出引脚TxPWM。通用定时器计数器的值一直与相关的比较寄存器的值比较,当定时器计数器的值与比较寄存器的值相等时,就产生比较匹配。可通过TxCON[l]位使能比较操作,产生比较匹配后将会有下列操作(如图所示)。
  ●匹配1个时钟周期后,定时器的比较中断标志位置位。
  ●匹配1个CPU时钟周期后,根据寄存器GPTCONA/B相应位的配置情况,PWM的输出将产生跳变。
  ●如果比较中断标志位已通过设置寄存器GPTCONA/B中的相应位启动A/D转换器,则比较中断位置位的同时产生A/D转换启动信号。
  ●如果比较中断未被屏蔽,将产生一个外设申断申请。
  图 通用定时器比较操作功能框图
定时器相关资讯
维库电子通,电子知识,一查百通!已收录词条7874个
一周热门词条排行
定时器相关技术资料
您最关心的搜索摄像头让人们可以记录下镜头下的一切,同时也拉近了人们的距离。摄像头的应用范围非常广,手机,电脑,汽车51单片机的定时器和计数器分别定时和计数的周期是多长时间,这个脉冲周期有规定吗?_百度知道
51单片机的定时器和计数器分别定时和计数的周期是多长时间,这个脉冲周期有规定吗?
提问者采纳
定时器/计数器本质上都是计数器,只不过数的东西不一样.定时器/计数器做为定时器来用的时候,是数的单片机时钟的脉冲个数,也就是说,单片机的时钟做为定时器/计数器的时钟源,因为单片机的时钟一般比较固定,因此,我们就知道一个脉冲占多长时间,因为根据脉冲的个数,就能推算出时间,就能做定时器用.比如:12MHz的传统51单片机,一个脉冲周期是1us,如果定时器数了10个脉冲周期就中断了,说明10us时间到了. 而作为计数器的时候,数的是来自引脚上的脉冲,也就是说,是引脚上的脉冲做为定时器/计数器的时钟源,如果这个脉冲是规律的,周期是固定的,那么,也可以实现定时,比如,如果引脚的脉冲是10KHz的,那么,一个脉冲周期是100us,如果定时器/计数器数了10个脉冲周期就中断,说明1ms时间到了. 但是,如果引脚上的脉冲频率不固定,时高时低,那么,就没办法根据脉冲个数算出时间来,此时,就只是单纯的计数功能. 总而言之,定时器/计数器本质都是对脉冲计数,只是作为定时器,数的是内部的脉冲,做为计数器,数的是外部的脉冲,如果脉冲固定,外部脉冲也可以用来定时.赞同0|评论
单片机的晶振和机器周期的关系!晶振震 荡12次是否为一个机器周期?
哦,对你正学习的单片机来,是这样的,51,共四种周期振荡周期:也称时钟周期,是指为单片机提供时钟信号的振荡源的周期状态周期:每个状态周期为时钟周期的2倍,是振荡周期经二分频后得到的。机器周期:一个机器周期包含6个状态周期S1~S6,也就是12个时钟周期。
在一个机器周期内, CPU可以完成一个独立的操作。指令周期:它是指CPU完成一条操作的所需的全部时间。每条指令执行时间都是有一个
或几个机器周期组成。MCS-51系统中,有单周期指令、双周期指令和四周期指令振荡*12 = 状态*6 = 机器记住这个概念
百度里找下这个问题,随便回答下就行了,我处理下: 51单片机DPTR存放的是外部RAM的地址? 坐等!!!!
错,DPTR一般是用来做指针,存放地址的,但是,不限于外部RAM地址,还有ROM地址.举例:MOV DPTR #1000H //---把DPTR赋值为1000H,作为地址,但是,这个地址可能是ROM里的,也可能
//----是外部RAM,要看你的使用的指令MOVX
A,@DPTR //---MOVX,是外部RAM里的1000HMOVC A,@DPTR //---MOVC,则是指ROM 里的1000H
嗯知道了,谢谢!!!
其他类似问题
按默认排序
其他3条回答
51单片机不同厂家生产的不同产品是不同的,比如AT89C51是12T的,STC89C52是12T也可以通过设置工作在6T,STC12C5A60S2是1T的但是它默认情况下会对时钟进行12分频,来模拟12T,所谓T就是一个晶振周期,12T就是一个机器周期也就是单片机执行一条语句所对应的晶振周期为12个(不是很严谨,新手可以这么理解),定时器记录一个数对应一个机器周期。由于大多数51单片机的结构比较简单,它的外设总线的时钟不具备独立的分频器,所以外设时钟是以机器周期计算的。比如你外接一个12M晶振,单片机每12个晶振周期才能执行一条基本语句,所以实际工作频率只有1Mhz,定时器等片上外设同理。
具体编程的时候可以用单片机小精灵v1.2这个工具来直接生成代码,不用关心太多。
51的16位定时器设置好初值后,每过一个机器周期的时间,存储值自加1,当达到65536时会溢出,产生一个定时器中断执行相应代码,通过改变定时器的初值,就是设置定时器的溢出率,就可以达到你想要的定时结果。
单片机的晶振和机器周期的关系!晶振震 荡12次是否为一个机器周期?
应该每个定时器都是有TIMRH和TIMRL,最大计数时间就是TIMRH*TIMRL*总线频率(时钟分频后的频率)
单片机的晶振和机器周期的关系!晶振震 荡12次是否为一个机器周期?
与晶振、工作方式、初值有关
有人和我说定时器定时的是一个机器周期的时间,一定是一个机器周期吗?
那人概念不清,如果只定时1个机器周期,那要定别的时长是怎么办呀?定时时每次来的脉冲是定周期的,即机器周期,计数时来的脉冲是随机的,可能有定周期也可能不是,怎么能一概而论呢?
单片机的晶振和机器周期的关系!晶振震 荡12次是否为一个机器周期?
你说得对!!!
51单片机的相关知识
等待您来回答
您可能关注的推广
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 stm32定时器 的文章

 

随机推荐