本帖最后由 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灯。 由此我的程序介绍就写完了,下图是我的头文件和主函数。 |