原创 吐血共享! AT91SAM7S256定时器使用程序

2010-3-26 09:51 3522 7 7 分类: MCU/ 嵌入式
//==========================================================================
//  AT91SAM7S256 定时器 时钟使用例子。比较方式
// 说明: AT91SAM7S256 ARM7 时钟设为48MHZ, 外部晶振为18.432MHZ !
//  netjob @ 2008-6-5
//==========================================================================
//==========================================================================
// 当WAVSEL = 10 时,TC_CV 值由0 增加到RC 值,然后【自动复位】。一旦TC_CV 值复位,它
// 开始【重新循环】
//  TC_VC与RC比较,相等触发中断。
//==========================================================================
//  MCK=48055000  (HZ)
//  下面是TC的时钟源。
//  MCK/2=24,027,500 0.0416us  2.726   ms 中断一次@ 16位溢出中断!
//  MCK/8=6,006,875 0.1665us  10.912  ms 中断一次@ 16位溢出中断!
//  MCK/32=1,501,719 0.6659us  43.640  ms 中断一次@ 16位溢出中断!
//  MCK/128=375,429 2.6636us  174.562 ms 中断一次@ 16位溢出中断!
//  MCK/1024=46,928 21.3089us  1.3965   s 中断一次@ 16位溢出中断!
//
// 下面选择使用 MCK/2 也就是 AT91C_TC_CLKS_TIMER_DIV1_CLOCK 时,TC1 定时长度的数值
//   0.3125ms 比较值为 7512  ( 312.5us/0.0416us )
//   0.3333ms 比较值为 8012  ( 333.3us/0.0416us )
//   0.625ms  比较值为 15024  ( 625.0us/0.0416us )
//   0.833ms  比较值为 20024  ( 833.0us/0.0416us )
//   1.667ms  比较值为 40072  ( 1667 us/0.0416us )
//
//==========================================================================
//
//  TC1 中断初始化函数, 1.667毫秒中断
//==========================================================================
void AT91_TIMER1_Configure(void) 
{
 //打开定时器,设置时钟源为 MCK/2
 AT91F_TC_Open(AT91C_BASE_TC1,AT91C_TC_CLKS_TIMER_DIV1_CLOCK,AT91C_ID_TC1);
 AT91C_BASE_TC1-&gtTC_CMR = AT91C_TC_WAVE |    /*  波形模式 */
    AT91C_TC_WAVESEL_UP_AUTO |   /* WAVESEL=10 UP 模式,有RC 比较自动触发*/
                                AT91C_TC_ACPC_NONE |    /* TIOA 不动作  */
                                AT91C_TC_ACPC_NONE |     /* TIOA 不动作  */
                                AT91C_TC_AEEVT_NONE|     /* AEEVT: TIOA 上外部事件效果 */
                                AT91C_TC_ASWTRG_NONE|     /* TIOA 上软件触发效果 */
                                AT91C_TC_BCPB_NONE|     /* TIOB 上RB 比较效果 */
                                AT91C_TC_BCPC_NONE |    /* TIOB 上RC 比较效果 */
                                AT91C_TC_BEEVT_NONE|   /*TIOB 上外部事件效果*/
                                AT91C_TC_BSWTRG_NONE |   /* TIOB 上软件触发效果 */
                                AT91C_TC_CLKS_TIMER_DIV1_CLOCK |
                                AT91C_TC_EEVT_TIOB;    /*外部事件选择*/
                                
 AT91C_BASE_TC1-&gtTC_RA=40072-30;
 AT91C_BASE_TC1-&gtTC_RB=40072-20;
 AT91C_BASE_TC1-&gtTC_RC=40072; // 1.667ms 定时
    //设置定时中断句柄    
 AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC1,INT_LEVEL_5,
 AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, IRQ_TIMER1); 
 //设置中断触发方式
 AT91C_BASE_TC1-&gtTC_IER = AT91C_TC_CPCS;  // 在此改变中断触发模式,TC_RC 与TC_CV比较中断
 //允许中断
 AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC1);
 //触发一次中断
  AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_TC1) ;
 //开始计时
 AT91C_BASE_TC1-&gtTC_CCR = AT91C_TC_SWTRG ;
}//end timer1
//=========================================================================//
//   TC1 中断函数。1.667毫秒
//=========================================================================//
 void  IRQ_TIMER1(void)
 {   
 int status;   
      status = *AT91C_TC1_SR; // 清标志
     status= status; 
        AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, P23);// ON  LED     
        ADC_XRead((short *)&UVol); // ADC转换
        AT91F_ADC_StartConversion(AT91C_BASE_ADC);       
 AT91F_PIO_SetOutput(AT91C_BASE_PIOA, P23); // OFF LED      
            
  //  AT91F_AIC_ClearIt(AT91C_BASE_AIC, AT91C_ID_TC1);
            
 }
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条