[原创] atmel sam4s16c教程 之定时器

star_66666   2016-11-21 17:46 楼主
按项目的要求,在原有的基础上增加了定时器功能
仔细研究Datasheet中关于rtt的部分

见附图,rtt框图
首先实时定时计数器的时钟SCLK是32KHz,先进入一个16位的分频器,每来个一个时钟脉冲,32位的计数器自动加1,同时产生中断,为了使能这个中断,必须设置RTTINCIEN、ALMIEN等寄存器位。见附图相关的RTT寄存器。
本文只截取部分视图,详细大家可以可以仔细阅读datasheet。见附件


下面解释一下实时定时计数器中的配置函数。
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) {
                  //此处为自己添加代码部分
         }

由此我的程序介绍就写完了,下图是我的头文件和主函数。

rtt头文件
#ifndef DRV_RTT_H_
#define DRV_RTT_H_



void configure_rtt(void);
void RTT_Handler(void);


#endif /* DRV_RTT_H_ */

rtt.c文件

#include "rtt.h"
#include "drv_rtt.h"

void configure_rtt(void)
{
        uint32_t ul_previous_time;

        /* Configure RTT for a 1 second tick interrupt */
        rtt_init(RTT, 32768);
        ul_previous_time = rtt_read_timer_value(RTT);
        while (ul_previous_time == rtt_read_timer_value(RTT));

        /* Enable RTT interrupt */
        NVIC_DisableIRQ(RTT_IRQn);
        NVIC_ClearPendingIRQ(RTT_IRQn);
        NVIC_SetPriority(RTT_IRQn, 0);
        NVIC_EnableIRQ(RTT_IRQn);
        rtt_enable_interrupt(RTT, RTT_MR_RTTINCIEN);
}
void RTT_Handler(void)
{
        uint32_t ul_status;

        /* Get RTT status */
        ul_status = rtt_get_status(RTT);
        
        /* Time has changed, toggle led1 */
        if ((ul_status & RTT_SR_RTTINC) == RTT_SR_RTTINC) {
                //自添加部分
        }
}




框图
[url=][/url]

寄存器
[url=][/url]


回复评论 (1)

审核通过了
点赞  2016-11-22 10:49
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复