原创
吐血共享! AT91SAM7S256定时器使用程序
//==========================================================================
// 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 | /* 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->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);
}
文章评论(0条评论)
登录后参与讨论