当前位置:编程学习 > C/C++ >>

ARM7周期性间隔定时器简介及实现(C语言)

在嵌入式开发中,时常会遇到延时函数的调用,比如在协议的制定时需考虑到各个节点之间的数据交互冲突情况。对于51系列单片机由于每条指令执行所耗费的时间可知,因此精确延时较为容易实现。在ARM7系列的处理器中由于指令的执行采用流水线技术,加上应用层程序的编写方面编译器所解析的机器周期未知,因此难以实现精确延时。一般应用中往往使用定时器解决此类问题。ARM7处理器中除定时器模块之外,还有周期性间隔定时器模块。周期性间隔定时器一般为操作系统的调度程序提供时间间隔中断,PIT的设计提供了程序时间管理上的精确度。图示为周期性间隔定时器的方框图。
PIT有一个可编程的溢出计数器,它具有溢出后自动复位的特性。PIT基于两个计数器:一个20位的CPIV计数器及一个12位的PICNT计数器。两个计数器的时钟都是主时钟的1/16。通过PIT_MR模式寄存器的PITIEN位设置中断使能后,CPIV计数器从0开始计数,一直到模式寄存器PIT_MR的PIV域所定义的溢出数值为止。CPIV计数器溢出后立即复位为0,同时PICNT寄存器累加,状态寄存器PIT_SR的PITS被置位从而触发中断。
通过读取周期性间隔数值寄存器PIT_PIVR获得CPIV和PICNT的数值后,溢出计数器(PICNT)复位,PITS清零,从而确认中断。继而使得周期性间隔定时器中断模式继续进行。周期性间隔定时器的使能与关闭通过寄存器PIT_MR的PITEN位实现。注意,只有在CPIV为0时对PITEN的操作才有效。
以下为使用周期性间隔定时器模块产生定时中断函数。
[html]  www.zzzyk.com
void ClockHandler(void)  __irq  
{  
     Display_Received++;  
    *AT91C_AIC_EOICR = *AT91C_PITC_PIVR;         //Acknowledge Interrupt  
  
void PIT_Init(void)  
{  
    *AT91C_PITC_PIMR = AT91C_PITC_PITIEN | AT91C_PITC_PITEN | 784741;<span style="white-space:pre"> </span>//PIT使能及定时周期配置  
     AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SYS,1,AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE,(void (*)())ClockHandler);//中断触发方式及函数入口地址   
    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SYS);   //Enable Interrupt  
}  
 
补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,