精华内容
下载资源
问答
  • 555定时器芯片工作原理.doc
  • 555定时器芯片资料,PDF格式,内有详细的解释和常用电路图
  • pit定时器128芯片

    2014-09-23 16:39:08
    //现象:PB灯闪动,周期是INTVERAL*(0.01)ms,可用来记时. //demo by whut_wj #include <hidef.h> /* common defines and macros */ #include <MC9S12XS128.h> /* derivative information */ #pragma LINK_INFO ...
  • 用8254计数器_定时器接口芯片测量直流电机转数.pdf
  • 可编程定时器计数器芯片8253的工作原理
  • 我在这使用的时HC32L130E8PA的芯片,采用定时器3实现计时器计数功能。 代码如下: /* 定时器3初始化 用于计数 u16Period * (1/4M) * 16 12500 * (1 / 4 M) * 16 = 50000us = 50ms */ void Time3Init(u16 u16...

    HC32L130E8PA实现定时器计数功能

    在芯片资源紧缺的情况下,尝试了使用华大国产芯片,
    对于该芯片来说,有些功能确实不完善,但还是能够满足基本需求的。

    我在这使用的时HC32L130E8PA的芯片,采用定时器3实现计时器计数功能。

    代码如下:

    /*
    	定时器3初始化 用于计数
    
    	u16Period * (1/4M) * 16
    	12500 * (1 / 4 M) * 16 = 50000us = 50ms
    */
    void Time3Init(u16 u16Period)
    {
    	uint16_t u16Value;
    	stc_tim3_mode0_cfg_t stcTim3BaseCfg;
    	//结构体初始化清零
    	DDL_ZERO_STRUCT(stcTim3BaseCfg);
    
    	stcTim3BaseCfg.enWorkMode = Tim3WorkMode0;//定时器模式
    	stcTim3BaseCfg.enCT = Tim3Timer;//定时器功能,计数时钟为内部PCLK
    	stcTim3BaseCfg.enPRS = Tim3PCLKDiv64;//16分频
    	stcTim3BaseCfg.enCntMode = Tim316bitArrMode;//自动重装载16位计数器
    	stcTim3BaseCfg.bEnGate = FALSE;
    	stcTim3BaseCfg.bEnTog = FALSE;
    	stcTim3BaseCfg.enGateP = Tim3GatePositive;
    	//TIM3 的模式0功能初始化
    	Tim3_Mode0_Init(&stcTim3BaseCfg);
    	u16Value = 0x10000 - u16Period;
    	//设置重装载值
    	Tim3_M0_ARRSet(u16Value);
    	//设置计数值
    	Tim3_M0_Cnt16Set(u16Value);
    	Tim3_ClearIntFlag(Tim3UevIrq);//清楚中断标志
    	Tim3_Mode0_EnableIrq();//使能TIM3中断
    	
    	EnableNvic(TIM3_IRQn,IrqLevel1,TRUE);
    }
    

    以上程序只是进行初始化 但没有启动,启动如下:

    /*
    	开始定时器计数
    */
    void TimeCntStart(void)
    {
    	Tim3_M0_Run();
    }
    

    中断如下:

    /*
    	定时器中断
    */
    void TIM3_IRQHandler(void)
    {
    	//计时溢出
    	if(TRUE == Tim3_GetIntFlag(Tim3UevIrq))
    	{
    		RepCnt++;
    		if(RepCnt >= 1200 * DevInfo.RepCycle)
    		{
    			RepCnt = 0;
    		}
    		//清除中断标志位
    		Tim3_ClearIntFlag(Tim3UevIrq);
    	}
    }
    

    在实际操作中,按公式去计算重装载值 实现定时计数,貌似时间不准确,我是不断的更改重装载值,才找到计时的那个标准,这个不知道时硬件原因还是芯片原因,具体情况还是得在使用时,进行调试,定时要久一点,值就要设大,要小,值就设小。

    展开全文
  • DM642芯片定时器使用,对于你想学习DM642来说 值得拥有
  • c51单片机 ch452芯片 数码管显示 定时器00-99显示
  • 基于硬件定时器的软件定时器

    千次阅读 2020-05-14 21:17:51
    1.一般硬件定时器集成在CPU的内部,有的可以使用外置的硬件定时器芯片,可以人为通过编程来设置硬件定时器的工作频率,硬件定时器一旦设定好了工作频率,只要上电,那么硬件定时器就会周期性的给CPU输出一

    概括

    硬件定时器很精确,软件定时器无论如何都有延迟,主要用在不需要精确定时的地方,而且软件定时比较浪费单片机资源。
    梳理
    讲到定时器,大家多多少少都会接触到硬件定时器,但是由于有时候资源的限制,又难免会出现使用软件定时器的情况,但是讲定时器需要从硬件定时器开始讲,软件定时器是在其基础之上延伸出来的。

    硬件定时器

    1.一般硬件定时器集成在CPU的内部,有的可以使用外置的硬件定时器芯片,可以人为通过编程来设置硬件定时器的工作频率,硬件定时器一旦设定好了工作频率,只要上电,那么硬件定时器就会周期性的给CPU输出一个中断信号,称这个中断信号为时钟中断,linux内核已经实现好了时钟中断对应的服务程序,这个服务程序也称之为时钟中断服务函数,既然硬件定时器周期性的给CPU产生时钟中断,那么对应的中断服务程序就会被内核周期性的调用;

    2.硬件延时利用定时器/计数器芯片,或用微控制器内部的定时器/计数器,实际上,它就是对晶振的分频(分频系数可编程设置),得到一个精确的低频的周期信号,用这个周期信号(比如10ms)去触发中断,每10ms调用一次定时中断服务程序。在定时中断服务程序中加入计数变量,就可以得到任意的定时了。在10ms没有到时,微控制器可以运行其它程序,10ms到时再自动进去中断服务程序以处理定时任务,不会像软件延时阻塞了。

    软件定时器

    软件定时器是在硬件定时器基础之上出来的定时器,可以由一个硬件定时器模拟出成千上万个软件定时器,这样程序在需要使用较多定时器的时候就不会受限于硬件资源的不足,这是软件定时器的一个优点,即数量不受限制。但由于软件定时器是通过程序实现的,其运行和维护都需要耗费一定的CPU资源,同时精度也相对硬件定时器要差一些。
    实现方法
    典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件定时器中断到,就对一个全局的时间标记加一,每个软件定时器都保存着到期时间,程序需要定期扫描所有运行中的软件定时器,将各个到期时间与全局时钟标记做比较,以判断对应软件定时器是否到期,到期则执行相应的回调函数,并关闭该定时器。
    注意
    因为是在内核态中进行的中断服务,我们定义全局变量需要使用volatile,前面的博客也有讲到他的用法,明确有三种情况,否则造成定时器失败。如:

    volatile uint32_t whiole_cnt;
    void tickCnt_Update(void)
    {
        whiole_cnt++;
    }
    

    定一个我们需要的回调函数:argv,argc为其参数:

    typedef void callback(void *argv ,uint16_t argc);
    

    一旦开始运行,whiole_cnt将不停地加一,而每个软件定时器都记录着一个到期时间,只要whiole_cnt大于该到期时间,就代表定时器到期了。
    上面的代码都能理解,这时如果我们需要一个定时,需要确定哪些东西呢?

    typedef struct time
    {
    	unsigned char state;//此软件定时的状态
    	unsigned char mode;//单次计时还是循环计时
    	uint32_t timer_cnt;//此软件计时值与whiole_cnt比较
    	uint32_t period;//循环计时时时间间隔
    	callback *cb;//回调函数指针
    	void *argv;//回调函数参数,根据实际情况可增可减
    	uint16_t argc;//回调函数参数,根据实际情况可增可减
    }_timer;
    

    这是单个软件定时器的基本情况,如果需要多个,可以这样:
    定义两个定时器数组

    #define NUM 2
    _timer TIME[NUM];
    

    如上只是一个框架,我们需要先对他初始化,以免影响到后期使用,
    初始化函数:

    void TIME_NUM_INIT(void)
    {
    	int i=0; 
    	for( i ;i<NUM;i++)//循环初始化结构体
    	{
    		TIME[i].timer_cnt=0;
    		TIME[i].period=0;
    		TIME[i].state=stop;
    		TIME[i].mode=once;
    		TIME[i].cb=NULL;
    		TIME[i].argv=NULL;
    		TIME[i].argc=0;
    	}
    }
    

    TIME[i].state有三种状态:

    typedef enum state
    {
    	stop=1,
    	runing,
    	time_out
    }timer_status;
    

    TIME[i].mode有两种状态:

    typedef enum mode
    {
    	once=1,
    	on_once
    }timer_mode;
    

    初始化完,实际上还没有真正的定时器出现,下一步做的就是,封装结构体,构造单独的定时器:

    void TIME_START(uint8_t id,uint32_t timer,uint32_t delay,unsigned char mode,void *cb,void *argv,uint16_t argc)
    {
    	TIME[id].timer_cnt=timer;
    	TIME[id].period=delay;
    	TIME[id].mode=mode;
    	TIME[id].cb=cb;
    	TIME[id].argv=argv;
    	TIME[id].argc=argc;
    	TIME[id].state=runing;
    }
    

    根据定义的NUM值,分别初始化,初始化后就可以跑了,如:想要定时一个500ms的软件定时器,且此时定时器中断的时间为10ms,则需要50个中断即可:

    TIME_START(0,50,0,once,Time ,"12345",15);
    

    Time是回调函数指针:
    argv,argc为其参数

    int *Time(void *argv,uint16_t argc)
    {
    	printf("运行状态:%d",time_state(0));
    	printf("%s,%d\r\n",argv,argc);
    	
    }
    

    初始化完成后,我们需要一直扫描软件定时器,主要的原因就是跟定时器中断的变量作比较,判断是否定时时间到!被扫描的函数是这样的:

    void check_time(void)
    {
    	uint16_t i=0;
    	  for(i;i<NUM;i++)
    			{
    				switch(TIME[i].state)
    				{
    					case stop:
    						break;
    						
    					case runing:	
    						if(TIME[i].timer_cnt<=whiole_cnt)
    						{
    							TIME[i].state=time_out;
    							TIME[i].cb(TIME[i].argv,TIME[i].argc);
    						}
    						break;
    						
    					case time_out:
    						if(TIME[i].mode==once)
    						{
    							TIME[i].state=stop;
    						}
    						else
    						{
    							TIME[i].timer_cnt=whiole_cnt+TIME[i].period;
    							TIME[i].state=runing;
    						}
    						break;
    					default:break;		
    				}
    			}
    }
    

    我们在主函数中定义一个while(1),一直扫描,方可达到效果。
    主函数main.c

    int main(void)
    {
    	
    	LED_Init();
    	delay_init();
    	timer_init();
    	usart_init(115200);
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
    	TIME_NUM_INIT();//初始化
    
    	TIME_START(0,2,2,on_once,Time ,"12345",15);//定时器1
    	TIME_START(1,4,2,once,Time ,"6789",30);//定时器2初始化
    	
    	 while(1)
    	 { 
    		 check_time();
    		 if(TIME[1].state==stop)//如果软件定时器1定时时间到,LED0反转
    		 {
    			  LED0=!LED0;
    		 }
    	 }
    }
    

    别忘记了回调函数!

    总结

    不管哪种模式,定时器到期后,都将执行回调函数,以下是该函数的定义,参数指针argv为void指针类型,便于传入不同类型的参数。

    展开全文
  • NE555芯片 555定时器

    2011-08-09 22:01:28
    对NE555芯片的功能原理进行介绍,555定时器
  • 对那些初学128芯片的童鞋们非常有帮助,看来后就可以用128的PIT 模块了,而却非常的熟悉
  • DSP2812芯片定时器

    2013-04-21 11:11:41
    DSP2812原理及应用部分关于定时器的详细程序及内容讲解
  • 实验十四 8253 可编程计数器/定时器实验要求 一实验目的 1掌握8253的主要性能及其初始化编程 2学会根据实验要求设计8253的接口电路 二实验技术准备 8253主要功能有 1一片上有三个独立的16位计数器通道 2每个计数器都...
  • ASIC芯片中BFD定时器协商机制改进设计与实现.pdf
  • 用于基带芯片的GSM硬件高精度休眠定时器.pdf
  • 基于74系列数字电路芯片实现的倒计时定时器Multisim仿真源文件,multisim10及以上版本可以正常打开仿真
  • arm硬件定时器

    千次阅读 2018-07-29 16:57:02
    硬件定时器:一般硬件定时器集成在CPU的内部,有的可以使用外置的硬件定时器芯片; 特点: 可以人为通过编程来设置硬件定时器的工作频率; 硬件定时器一旦设定好了工作频率,只要上电,那么硬件定时器就会周期性的给...

    **********************************************************
    硬件定时器:一般硬件定时器集成在CPU的内部,有的可以使用外置的硬件定时器芯片;
    特点:
    可以人为通过编程来设置硬件定时器的工作频率;
    硬件定时器一旦设定好了工作频率,只要上电,那么硬件定时器就会周期性的给CPU输出一个中断信号,称这个中断信号为时钟中断;
    linux内核已经实现好了时钟中断对应的服务程序,这个服务程序也称之为时钟中断服务函数;
    既然硬件定时器周期性的给CPU产生时钟中断,那么对应的中断服务程序就会被内核周期性的调用;
    时钟中断服务函数做如下内容:
    1.更新系统的运行时间,更新jiffies_64(jiffies)
    2.更新实际时间
    3.检查进程的时间片是否用完,决定是否需要重新调度新进程
    4.检查是否有超时的软件定时器,如果有处理这个超时的软件定时器
    5...

    概念:
    HZ:常数,最终会将这个常数设置为硬件定时器的工作频率,对于ARM平台,HZ=100,表明一秒钟产生100次的时钟中断;
    tick:1/HZ,表明产生一次时钟中断的时间间隔为10ms
    jiffies:是linux内核的全局变量,在内核任何一个文件中都能访问这个变量(unsigned long),它用来记录自开机以来发生了多少次时钟中断,没发生一次时钟中断,jiffies加1;一般linux内核用jiffies来表示时间!例如:
    unsigned long timeout = jiffies + HZ/2;
    jiffies:表示当前系统运行时间;
    HZ/2:表示时间间隔为500ms
    timeout:表示500ms以后的系统运行时间;

    注意:
    jiffies是一个32位的变量,如果HZ=100,497天以后就会发生溢出(回绕)问题,一般内核使用jiffies_64(64位的变量)用来记录系统运行时间,而jiffies用来描述时间间隔。
    jiffies = jiffies_64 & 0xFFFFFFFF;

    linux内核解决jiffies回绕问题使用:
    time_after/time_before

    切记:硬件定时器处理的最小时间为10ms,那么jiffies它能处理的时间也就是10ms。

    展开全文
  • 10.定时器的使用

    2020-02-11 16:12:33
    利用定时器,解决软件延迟不精准问题。 实现定时功能的几种方法: 1.软件定时:软件定时不占用硬件资源,但占用了CPU...4.单片机定时器、扩展定时器芯片。(单片机内部集成有定时器的芯片) IAP15F2K60S2:定时器...

    目的:利用定时器,解决软件延迟不精准问题。
    实现定时功能的几种方法:
    1.软件定时:软件定时不占用硬件资源,但占用了CPU时间,降低了CPU利用率。
    2.采用时基电路定时:例如采用555电路。
    3.采用可编程芯片定时:这种定时芯片的定时值及定时范围很容易用软件来确定和修改,此时芯片定时功能强,使用灵活。
    4.单片机定时器、扩展定时器芯片。(单片机内部集成有定时器的芯片)
    IAP15F2K60S2:定时器0、1、2与89C52系列单片机一致
    IAP15W4K58S4:定时器0、1、2、3、4
    STC8A8K64S4A2:定时器0、1、2、3、4
    定时器/计数器实质是加1的16位计数器,由高8位和低8位两个寄存器组成。

    定时器/计数器的使用:
    1.配置AUXR辅助寄存器;2.配置TMOD工作方式寄存器;3.装载计数初值,高八位装载在TH0,低八位装载在TL0;4.配置TCON控制寄存器;5.配置中断允许寄存器IE

    具体每位所代表的内容见说明书:
    AUXR辅助寄存器:用于是否兼容传统8051单片机,不可位寻址
    在这里插入图片描述
    TMOD工作方式寄存器:确定工作方式和功能,低四位用于T0,高四位用于T1,不可位寻址
    在这里插入图片描述
    计数器/定时器-计数(定时)寄存器:用于计数器/定时器的计数或者定时。定时器0:TL0定时器低八位寄存器,TH0定时器0高八位寄存器。
    模式0:16位自动重装载模式(一般使用模式0)
    定时器模式时有:N=t/Tcy(Tcy为机器周期)(t为所需计时时间)
    计数初值计算的公式为:X=2的16次方(即65536)-N
    即每次给定时器的计数初值为X,从X往上依次计数,直到计数到65536时计满溢出,向CPU发送信息,定时结束,重新装载计数初值X再次计数。其中X的值要化作二进制,装载在TH0(高八位)和TL0(低八位)中。

    TCON控制寄存器:控制T0、T1的启动和停止及设置溢出标志,可位寻址
    在这里插入图片描述
    IE中断允许寄存器:是否允许中断,可位寻址
    在这里插入图片描述
    15系列单片机的晶振周期等于机器周期
    注:可位寻址,是说在单片机头文件中对该寄存器的位有定义,否则则是不可位寻址。说明书与头文件是相对应的,参照说明书即可。

    定时器的配置方法:
    1.根据说明书进行配置,注意区分可位寻址和不可位寻址的寄存器。
    2.使用下载器进行生成,具体如下图:
    在这里插入图片描述
    注:无论使用哪种方法,都需要再配置中断允许寄存器EA=1;ET0=1;
    示例程序如下:
    1.使用定时器0(以5ms为例,根据说明书配置),LED1 1s闪烁1次

    #include<STC15F2K60S2.H>
    
    unsigned char tt=0;
    
    void main(void)
    {
    	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;	//初始化程序
    	//以下配置程序为对照说明书进行,定时时间以5ms为例
    	AUXR=0X80;		//对照说明书,定时器0速度控制位置1,速度是传统8051的12倍,不分频
    	TMOD=0XF0;		//选择使用定时器0,16位自动重装载模式
    	TH0=0X28;			//装载计数初值对应的二进制数的高八位
    	TL0=0x00;			//装载计数初值对应的二进制数的低八位
    	TF0=0;				//清零定时器0的溢出中断标志位,一般使用前先进行清零操作
    	TR0=1;				//定时器0开始计数,若TR0=0则禁止T0计数
    	
    	EA=1;ET0=1;		//允许中断
    	
    	while(1)
    	{
    	}
    }
    
    void Timer0(void) interrupt 1			//定时器0一定使用中断1
    {
    	tt++;
    	if(tt==200)							//200次也就是1s
    	{
    		tt=0;
    		P00=~P00;
    	}
    }
    

    2.使用定时器0(以5ms为例,使用下载器配置)数码管正计时1s变化1次)

    #include<STC15F2K60S2.H>
    unsigned char tt=0;
    unsigned char num=0;
    unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};
    
    void Timer0Init(void);
    
    void main(void)
    {
    	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;   //初始化程序
    	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;   //数码管初始化程序,打开第一个数码管
    	Timer0Init();
    	EA=1;ET0=1;
    	
    	while(1)
    	{
    	}
    }
    //下面这个函数由下载器生成,只需要在前面调用即可
    void Timer0Init(void)		//5毫秒@11.0592MHz
    {
    	AUXR |= 0x80;		//定时器时钟1T模式
    	TMOD &= 0xF0;		//设置定时器模式
    	TL0 = 0x00;		//设置定时初值
    	TH0 = 0x28;		//设置定时初值
    	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0开始计时
    }
    
    void Timer0(void) interrupt 1
    {
    	tt++;
    	if(tt==200)
    	{
    		tt=0;
    		P0=tab[num];
    		num++;
    		if(num==16)num=0;				//num=16后,超出数组范围,归0重计时
    	}
    }
    

    两个程序中while循环内部均为空,程序只执行中断1中的命令。定时器0对应的是中断1。

    展开全文
  • 定时器

    2019-09-14 02:49:10
    有4类,这4类可以同时存在,一般需要更高精度才使用外部,内部定时器芯片温度影响精度,但有些片上资源只能通过内部时钟驱动 HSI 内部高速 LSI 内部低速 HSE 外部高速 LSE 外部低速 用来驱动CPU的时钟(主...
  • 定时器/计数器 41定时器/计数器T0和T1 411定时器/计数器T0和T的结构及功能 412定时器计数器T0和T1的...42,1定时器/数器T2的操作模式 41定时器/计数器T0和T1 对于定时器/计数器来说,不管是独立的定时器 芯片还是单片机内
  • 三五资料:555定时器是一种集成电路芯片,常被用于定时器、脉冲产生器和震荡电路。555可被作为电路中的延时器件、触发器或起振元件。 555定时器于1971年由西格尼蒂克公司推出,由于其易用性、低廉的价格和良好的可靠...
  • 从SYD8811/SYD8810/SYD8801芯片的规格书上我们知道协议栈占用了Timer3这个定时器,SYD8821的协议栈占用了Timer0这个定时器!如果使用了SystemTimer的lib的话SYD8811/SYD8810的SystemTimer占用了Timer0,SYD8821占用了...
  • 定时器是嵌入式软件开发最长接触的事物,本篇文章主要介绍了在某些极端情况下对于硬件定时器精度的校准方式。阅读本文之前,您需要了解的一些前置技能有: 技能名称 技能熟练度 技能教程链接 单片机外设 ...
  • 52832的定时器的值保存在counter中,在instance里没有这个寄存器,无法读取。 可以使用函数 nrfx_timer_capture(nrfx_timer_t const * const p_instance, nrf_timer_cc_channel_t cc_channel); 其中第一个参数是...
  • 低功耗系列芯片 STM32L15x_通用定时器TIM
  • STM32系列不同芯片之间程序移植问题以及系统定时器(滴答定时器或者叫Sys tick)的配置,中断使用
  • 我们中的许多人使用 LM555 定时器芯片来生成时钟、火车模型的音调以及各种其他用途。 在计算器上计算时序链中电阻器和电容器的值以及非稳态操作的占空比有点乏味,因此我构建了这个基于小表格的工具以使其更容易。 ...
  • 可编程计数器/定时器的工作原理 计数器:设置好技术初值后,便开始减1计数,减为0时,输出一个信号 定时器:设置好定时常数后,便进行减1计数,按定时常数不断地输出为时钟周期整数倍的定时间隔 差别:计数器减到0后...
  • Linux定时器

    2021-05-23 20:46:04
    像UCOS 或 FreeRTOS 一般使用 Systick 作为系统时钟源(systick 是cortex-m 内核提供的定时器芯片厂商在使用cortex-m内核制作芯片时为了通用性也会选择它作为芯片的硬件定时器)。 同样Linux 也需要一个定时器来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,006
精华内容 9,602
关键字:

定时器芯片