Chinaunix首页 | 论坛 | 博客
  • 博客访问: 161226
  • 博文数量: 171
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 1990
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-05 10:49
文章分类

全部博文(171)

文章存档

2011年(9)

2010年(162)

我的朋友

分类: 嵌入式

2010-09-16 16:49:57

//==========================================================================
//   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->TC_CMR = AT91C_TC_WAVE |    
     AT91C_TC_WAVESEL_UP_AUTO |   
                                 AT91C_TC_ACPC_NONE |    
                                 AT91C_TC_ACPC_NONE |     
                                 AT91C_TC_AEEVT_NONE|     
                                 AT91C_TC_ASWTRG_NONE|     
                                 AT91C_TC_BCPB_NONE|     
                                 AT91C_TC_BCPC_NONE |    
                                 AT91C_TC_BEEVT_NONE|   
                                 AT91C_TC_BSWTRG_NONE |   
                                 AT91C_TC_CLKS_TIMER_DIV1_CLOCK |
                                 AT91C_TC_EEVT_TIOB;    
                                
AT91C_BASE_TC1->TC_RA=40072-30;
AT91C_BASE_TC1->TC_RB=40072-20;
AT91C_BASE_TC1->TC_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->TC_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->TC_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);

阅读(879) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~