1个定时器多处复用的问题

发布者:数据探险家最新更新时间:2016-07-15 来源: eefocus关键字:定时器  多处复用 手机看文章 扫描二维码
随时随地手机看文章

问题: 在一个工程中往往需要用到多个定时,然而我们采用的CPU一般也只有2,3个定时器。显然是不够用的,那么应该怎么办呢?

       我想如果使用过系统的人都会知道,在系统中有个时钟节拍,而多个任务都是共同使用这个时钟节拍进行延时或任务切换。那么我们是否可以借鉴一下呢?

1个定时器多处复用的问题(原创) - 我心永恒 - ARM-新的梦想

 

下面我们LPC2131举例说明:

①.  宏定义:             

    #define  T0_CLOCK_TICK  (100)                           // 1S中计数次数  

    #define  T0_TASK_NUM     (3)                               // 3个定时

②.  进行定义一个定时数组:                          

    uint32 T0_Counter[T0_TASK_NUM] = {0};            // NUM 为需要使用的定时个数

③.  在相应的定义一个数组来存储标志位:     

    uint8 T0_Mark[T0_TASK_NUM] = {0};                   // 标志位为1表示定时时间到

④.  编写定时器初始化函数:

/**************************************************************************************
* FunctionName   : Timer0Init()
* Description        : 初始化定时器0
* EntryParameter : NO
* ReturnValue       : NO
**************************************************************************************/
void Timer0Init(void)
{
    /*Fcclk = Fosc x 4 = 11.0592MHz x 4 = 44.2368MHz
      Fpclk = Fcclk / 4 = 44.2368MHz / 4 = 11.0592MHz*/

     T0TC = 0;                                                   // 定时器设置为0
     T0PR = 0;                                                  // 设置定时器0分频为1分频
     T0MCR = 0x03;                                         // 匹配通道0匹配中断并复位T0TC
     T0MR0 = Fpclk/T0_CLOCK_TICK;           // 比较值(1/T0_CLOCK_TICK s定时值) 
     T0TCR = 0x00;                                          // 关闭定时器0
     T0Open();                                                 // 开定时器
 
 /* 设置定时器0中断IRQ*/
     VICIntSelect = 0x00;                                // 所有中断通道设置为IRQ中断
     VICVectCntl4 = 0x20|0x04;                      // 定时器0中断通道分配最高优先级
     VICVectAddr4 = (uint32)IRQ_Time0;      // 设置中断服务程序地址向量
     VICIntEnable = 1 << 0x04;                       // 使能定时器0中断
}

⑤.  编写中断服务函数:                                 

/**************************************************************************************
* FunctionName   : IRQ_Time0()
* Description        : 定时器0中断服务
* EntryParameter : NO
* ReturnValue      : NO
**************************************************************************************/

void __irq IRQ_Time0(void)         // 中断服务函数

    uint8 i;

    for (i=0; i     {
         if (T0_Counter[i] != 0)
         {
              T0_Counter[i]--;               // 计数值减1
              if (T0_Counter[i] == 0)
              {
                    T0_SetMark(i);          // 相应标志位置1
              }
         }
     }

     T0IR = 0x01;                             // 清除中断标志
     VICVectAddr = 0x00;               // 通知VIC中断处理结束

}

⑥. 编写标志位置位函数:

/**************************************************************************************
* FunctionName   : T0_SetMark()
* Description        : 设置相应标准位
* EntryParameter : NO
* ReturnValue      : NO
**************************************************************************************/
void T0_SetMark(uint8 num)
{
    switch (num)
   {
       case 0:  T0_Mark[0] = 1; break;    //  标志位置位
       case 1:  T0_Mark[1] = 1; break;    //
       case 2:  T0_Mark[2] = 1; break;    //

       default: break;
   }
}

⑦. 编写相应的函数,在需要使用的函数中设定计数时间:

void Function1(void)

{

    T0_Mark[0] = 0;                   // 清除标志位

    T0_Counter[0] = 100 ;        // 1s计数器100次

    while (1)

    {

         if (T0_Mark[0] == 1)       // 判断时间是否到

        {

            T0_Mark[0] = 0;         // 清除标志

            ...

        }

    }

}

⑧. 编写其他函数,按照以上方法。

注意事项:

①. 可以根据具体需要更改计数个数。

②. 定时器计数1S的此时可以根据具体需要设定,如果设定计数此时太多,CPU的效率会降低,但是精确度会高一下;反正精确度低,但是CUP效率会高一些。

关键字:定时器  多处复用 引用地址:1个定时器多处复用的问题

上一篇:MDK中变量地址重合问题
下一篇:MDK下怎样才能让变量在复位时不被初始化

推荐阅读最新更新时间:2024-03-16 15:00

定时器0延时程序
本程序主要实现的是用DA指令进行10进制调整,使得两位数码管循环显示0-99,延时1s。 (1):工作方式0下延时1s 查询方式: ORG 0000H JMP MAIN ORG 30H MAIN: MOV TMOD,#00H ;设置TIMER0工作在MODE0 MOV R4,#00H ;设置数码管显示初值 ;SETB EA ;SETB ET0 START: MOV R2,#200 ;延时1s MOV P2,R4 ;计数初值送P2显示 LCALL DELAY XCH A,R4 ADD A,#01H DA A ;R4送A累加,并做十进
[单片机]
<font color='red'>定时器</font>0延时程序
用51单片机定时器中断设计电子钟
把前天设计的时钟的功能补全了一些,贴上来, #include reg52.h #define uchar unsigned char sbit rd=P2^6; sbit wr=P2^5; sbit lcde=P2^7; sbit k1=P1^0; sbit k2=P1^1; sbit k4=P1^3; sbit k8=P1^7; uchar code table1 = 2011-11-05 ; uchar code table2 = 00:00:00 ; uchar code table3 ={{ MON },{ TUE },{ WED },{ THU },{ FRI },{ SAT },{ SUN }};
[单片机]
stm32F4 定时器中断 + 步进电机控制器 控制四线两相步进电机
今天给大家分享一个 初级版本的步进电机的控制方法,用到的步进电机是4线两相的42步进电机 如下图: 步进电机驱动选用的是这款 TB6600 供电选用了12V的稳压电源 最小系统板供电是从Jlink上直接引出 MCU是 stm32F407ZGT6 最小系统板 根据步进电机控制器的资料可以知道 步进电机的速度和转过的角度都是通过 PUL + 和PUL- 来控制的 (这里插一段关于步进电机驱动上的六个控制接线端子的使用,将其中的四个+ 或者是四根 - 接在一起做成共阳接法或者共阴接法,如果 电平是3.3V 或者 5V 可以不串接电阻 ,如果电压大于5V 需要在每一根线上串接相应阻值的电阻) 这里我选择的是共阳
[单片机]
stm32F4 <font color='red'>定时器</font>中断 + 步进电机控制器 控制四线两相步进电机
ARM中断源之定时器中断
实时时钟请求中断。在控制中遇到定时检测和控制,为此常采用一个外部时钟电路(可编程)控制其时间间隔。需要定时时,CPU发出命令使时钟电路开始工作,一旦到达规定时间,时钟电路发出中断请求,由CPU转去完成检测和控制工作。 走到这里,大家肯定对Linux的中断处理有概念了,下面我们通过一个具体的实例,来了解Linux内核处理中断的全过程,那就是定时器中断。在详细分析这个过程之前,我们把Linux时间管理的概念先缕一缕。 在当前的80x86体系结构上,内核显式地与几种时钟和定时器电路打交道,其主要分为了时钟和定时器两大类: - 时钟电路同时用于跟踪当前时间和产生精确的时间度量。 - 定时器电路由内核编程,所以它们以固定的、
[单片机]
十五、S3C2440裸机—系统时钟和定时器
15.1 介绍   CPU 的时钟控制逻辑既可以外接晶振,然后通过内部电路产生时钟源;也可以直接使用外部提供的时钟源,它们通过引脚的设置来选择。S3C2440A有两个锁相环,(MPLL)一个用于FCLK、PCLK和HCLK,(UPLL)另一个用于USB模块(48MHZ)。时钟控制逻辑给整个芯片提供三种时钟: FCLK:用于CPU 核 HCLK:用于 AHB 总线上设备,比如CPU核、存储器控制器、中断控制器、LCD控制器、DMA 和 USB 主机模块等 PCLK:用于 APB 总线上的设备,比如 WATCHDOG、IIS、IIC、PWM 定时器、MMC 接口、ADC、UART、GPIO、RTC 和 SPI   AHB(Ad
[单片机]
十五、S3C2440裸机—系统时钟和<font color='red'>定时器</font>
M20 中断、定时器与程序存储方式
void main() //主程序 不同单片机写法基本一致 { } interrupt() //不同单片机 中断程序写法不同 { } 多个中断类似于多个中断车道的车行进,如果都来抢占红色小车的主车道,会造成红车行进缓慢。 所以中断程序写最简短的代码,尽量少的占用主车道的时间。 以上提到了四个关键名词: 中断 定时器 主程序 中断程序 书籍会给一个名词简短一两句话,作为解释或者定义,实际上大部分名词很难用一句话说明。很多同学学习过程中感觉越学越困难,越来越看不懂,实际上,关键问题就是很多名词需要一本书1000页打底的书来解释才行,我们把自己限定到仅看课本或者一两本关联度很少的书,这样自然是越学越累。因为这
[单片机]
C8051F330定时器功能
摘要: 使用定时器0的16位定时器(方式2)模式,实现100us中断。 系统时钟使用内部高频时钟24.5M 定时器时钟采用系统时钟4分频 宏定义: #define SYSCLK (24500000) #define AUX2 (0xFD91) //100us定时所需要的计数(定时器时钟是系统时钟5分频) #define AUX3 (AUX2&0x00FF) #define AUX4 ((AUX2&0xFF00) 8) #define TIMER0_RELOAD_HIGH (AUX4) // Reload value for Timer0 high byte #define TIMER
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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