1回答

0收藏

实时定时计数器中断

其他 其他 4971 人阅读 | 1 人回复 | 2013-01-18

本帖最后由 shenwen2011 于 2013-1-19 01:25 编辑

本实验运用了实时定时计数器产生中断,来点亮LED1,一秒钟点亮,一秒钟熄灭!
首先本人运用Atmel Studio6.0建立新项目,如图所示。



填好solution和project名字以及存放的路径,之后点击OK,完成项目的建立,建立完工程如下图所示。

Atmel studio替你准备好了#include <asf.h>,这个asf.h里面是所有用到的asf组件的头文件,有了它就不需要手工添加了。只是此建立的项目中,默认只配置了gpio组件,如图:

为了完成定时计数器中断实验,需添加必要组件,选择菜单Project->ASF Wizard,如图所示。

打开后,左边显示了所有组件,右边是项目中已经存在的组件。

下图是项目组件添加完成后的情况,添加了实时定时计数器有关的组件:RTT、Standard serial I/O(stdio)、System Clock Control。

然后点击Finish。之后就是程序的书写了!下图为我的主要函数。

主要的函数有两个,就是实时定时计数器配置函数和中断函数。
为了很好了解这个两个函数,首先要对SAM4S Xplained使用的atsam4s16c的实时定时计数器有一定了解,下图定时计数器的框图。

首先实时定时计数器的时钟SCLK是32KHz,先进入一个16位的分频器,每来个一个时钟脉冲,32位的计数器自动加1,同时产生中断,为了使能这个中断,必须设置RTTINCIEN、ALMIEN等寄存器位。下图为相关的RTT寄存器。





下面解释一下实时定时计数器中的配置函数。
rtt_init(RTT, 32768)这函数设置了分频器分频数,这样产生1Hz的脉冲值,这样每一秒钟产生中断,并且计数器的计数最大值是232秒,这样可以计时超过136年。
NVIC_DisableIRQ(RTT_IRQn);
       NVIC_ClearPendingIRQ(RTT_IRQn);
RTT_IRQn是RTT的中断号,此值为3。这两个函数作用是清除NVIC(嵌入中断向量控制器)中的RTT和待处理的RTT,以前的RTT不对现在的RTT产生干扰。
NVIC_SetPriority(RTT_IRQn, 0);
设置RTT的中断优先级,atsam4s16c中有0~15个优先级,0是最高级。
NVIC_EnableIRQ(RTT_IRQn);
在NVIC中使能RTT。
rtt_enable_interrupt(RTT, RTT_MR_RTTINCIEN);
使能RTT中的MR寄存器中的RTTINCIEN位,定时计数器加1使能。
由此实时定时计数器的初始化配置完成。
在中断函数中,
if ((ul_status & RTT_SR_RTTINC) == RTT_SR_RTTINC) {
                   gpio_toggle_pin(LED0_GPIO);
         }
当计数器值加1了,点亮或者熄灭了一个LED灯。
由此我的程序介绍就写完了,下图是我的头文件和主函数。


就写到这里吧,有些东东本人也在摸索中,以后在后续的帖子中将补上,中间有不对的地方,还希望有关的高手指点!
下面网址是实验结果视频!

http://u.youku.com/申爱丁

rtt_led.rar

2.87 MB, 下载次数: 36

源代码

实时定时计数器中断.pdf

837.33 KB, 下载次数: 41

分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

jwdxu2009_3001060

发表于 2013-1-18 22:51:01 | 只看该作者

参考,学习一下,
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条