按项目的要求,在原有的基础上增加了定时器功能 仔细研究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 "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) { //自添加部分 } } |