ARM7周期性间隔定时器简介及实现(C语言)
来源:互联网 发布:java log4j 多线程 编辑:程序博客网 时间:2024/06/05 05:03
在嵌入式开发中,时常会遇到延时函数的调用,比如在协议的制定时需考虑到各个节点之间的数据交互冲突情况。对于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的操作才有效。
以下为使用周期性间隔定时器模块产生定时中断函数。
void ClockHandler(void) __irq{ Display_Received++;*AT91C_AIC_EOICR = *AT91C_PITC_PIVR; //Acknowledge Interruptvoid 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}
(文章原创,转载请声明)
- ARM7周期性间隔定时器简介及实现(C语言)
- ARM7定时器模块简介及实现(C语言)
- ARM7键盘工作原理及中断方式实现(C语言)
- C语言实现定时器
- C语言实现定时器
- Voronoi图简介及C语言实现
- ARM7 C语言嵌入汇编开关中断
- 定时器+工作队列 内核周期性任务的实现机制
- 定时器+工作队列 内核周期性任务的实现机制
- ARM7通过串口实现液晶显示的一种方法(C语言)
- python周期性定时器
- uc/OS-II下ARM7定时器捕获实现红外解码
- C语言--求时间间隔
- ARM7的定时器配置!
- 实现一个所有任务都是按各自自定义的时间间隔周期性执行的线程池
- iOS及C语言的简介
- C语言简介及进制换算
- Objective-c语言的历史及简介
- VC中自画控件的过程和方法(CButton, CEdit, etc) 2010-11-8 23:07
- C语言\r\n和\n区别?
- ZedGraph控件的使用
- MySQL数据库中CHAR与VARCHAR之争
- 如何用java代码写android的jiemian
- ARM7周期性间隔定时器简介及实现(C语言)
- 获取IP地址
- 探究Android的多分辨率支持以及各种类型图标尺寸大小
- 【转载】视觉中国的NoSQL之路:从MySQL到MongoDB
- ScheduledExecutorService定时周期执行指定的任务
- 一个简单的找数方法
- java初始代码块
- js判断浏览器语言
- VRRP协议介绍