周期性间隔定时器(PIT) - 轩辕赤血的日志- 网易博客

周期性间隔定时器(PIT)

2010-05-26 15:16:55 阅读9 评论0 字号:

//wang@20070606   周期性间隔定时器(PIT)
/*
PIT_MR模式寄存器
[0-19]PIV: 周期性间隔数值   定义了与周期性间隔寄存器20 位计数器CPIV比较的数值。
[24]PITEN: 使能周期性间隔定时器   只有在CPIV 为0时操作PITEN 才有作用
[25]PITIEN: 使能周期性间隔定时器中断

PIT_SR状态寄存器
[0]PITS: 周期性间隔定时器状态   (1 = 自上次读取PIT_PIVR之后周期性间隔定时器已经计数到PIV)

PIT_PIVR数值寄存器 (通过读PIT_PIVR xx中断)
[0-19]CPIV: 当前周期性间隔数值 返回周期性间隔定时器的当前数值
[20-31]PICNT: 周期性间隔计数器 返回自上一次读取PIT_PIVR 之后发生的周期性间隔次数


PIT有一个可编程的溢出计数器和读后即复位的特性。它基于两个计数器:一个20位的CPIV计
数器和一个12位的PICNT计数器。两个计数器的时钟都是主时钟的1/16。

20位的CPIV计数器从0开始计数,直到模式寄存器 PIT_MR的PIV域定义的溢出数值为止。CPIV
计到这个数值后即复位为0,同时周期性间隔计数器PICNT 加一。然后状态寄存器PIT_SR 的
位PITS置位并触发中断,此时中断是使能的(PIT_MR 的位PITIEN)

通过读取周期性间隔映像寄存器PIT_PIIR 获得CPIV 和PICNT 的数值对计数器的CPIV 和
PICNT,以及PITS没有影响。例如,软件剖析工具可以读取PIT_PIIR而不会xx任何已经发生
但还未处理的中断,而定时器中断通过读PIT_PIVR xx中断。
*/

#include "../Startup/Board.h"

const int led_mask[8]= {LED1, LED2, LED3, LED4};
#define PIV_200_MS 200


void Periodic_handler(void)
{
     unsigned int status;
     //* Interrupt Acknowledge
     status = AT91C_BASE_PITC->PITC_PIVR;   //读PIT_PIVRxx中断
status =status;
   // AT91C_BASE_DBGU->DBGU_THR = '*';
//* Read the output state
if ((AT91F_PIO_GetInput(AT91C_BASE_PIOA) & LED1 ) == LED1 )
        {  
    AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LED1 );
        }
        else
        {  
           AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED1 );
        }

}

int main()
{

     // First, enable the clock of the PIO
        AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;

        AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK ) ;

     // Clear the LED's. On the EB55 we must apply a "1" to turn off LEDs
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK ) ;

        //配置中断
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SYS, 0,AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, Periodic_handler);

//设置中断模式
         //PITEN: 使能周期性间隔定时器
         //PITIEN: 使能周期性间隔定时器中断
         //PIV: 周期性间隔数值 (((MCK/16)*PIV_200_MS)/1000-1)   范围20位,溢出时取溢出部份
AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PITEN | AT91C_PITC_PITIEN | (((MCK/16)*PIV_200_MS)/1000-1) ;

//启用中断
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);

         for(;;)
         {
             ;
         }

}//* End


引文来源  
<#--{zx1}日志--> <#--推荐日志--> <#--引用记录--> <#--相关日志--> <#--推荐日志--> <#--推荐阅读--> <#--相关文章 2010.04.29="" by="" yangfan--=""> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构-->
郑重声明:资讯 【周期性间隔定时器(PIT) - 轩辕赤血的日志- 网易博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——