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

在嵌入式开发中,时常会遇到延时函数的调用,比如在协议的制定时需考虑到各个节点之间的数据交互冲突情况。对于51系列单片机由于每条指令执行所耗费的时间可知,因此精确延时较为容易实现。在ARM7系列的处理器中由于指令的执行采用流水线技术,加上应用层程序的编写方面编译器所解析的机器周期未知,因此难以实现精确延时。一般应用中往往使用定时器解决此类问题。ARM7处理器中除定时器模块之外,还有周期性间隔定时器模块。周期性间隔定时器一般为操作系统的调度程序提供时间间隔中断,PIT的设计提供了程序时间管理上的精确度。图示为周期性间隔定时器的方框图。

ARM7周期性间隔定时器简介及实现(C语言)_第1张图片

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的操作才有效。

以下为使用周期性间隔定时器模块产生定时中断函数。

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;	//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,c,定时器,周期,间隔,ARM7,ARM7)