上一篇文章介绍了PWM的配置,本次介绍Timer定时器的配置,以及相关ISR的代码配置。
MCC图形化配置工具中,首先添加需要使用的TC模块:

配置定时器参数,设置周期为10ms:

在NVIC中使能TIMER2中断,配置中断服务回调函数:

点击生成代码:
void TC2_TimerInitialize( void )
{
/* Reset TC */
TC2_REGS->COUNT16.TC_CTRLA = TC_CTRLA_SWRST_Msk;
while((TC2_REGS->COUNT16.TC_SYNCBUSY & TC_SYNCBUSY_SWRST_Msk) == TC_SYNCBUSY_SWRST_Msk)
{
/* Wait for Write Synchronization */
}
/* Configure counter mode & prescaler */
TC2_REGS->COUNT16.TC_CTRLA = TC_CTRLA_MODE_COUNT16 | TC_CTRLA_PRESCALER_DIV16 | TC_CTRLA_PRESCSYNC_PRESC ;
/* Configure in Match Frequency Mode */
TC2_REGS->COUNT16.TC_WAVE = (uint8_t)TC_WAVE_WAVEGEN_MPWM;
/* Configure timer period */
TC2_REGS->COUNT16.TC_CC[0U] = 37499U;
/* Clear all interrupt flags */
TC2_REGS->COUNT16.TC_INTFLAG = (uint8_t)TC_INTFLAG_Msk;
TC2_CallbackObject.callback = NULL;
/* Enable interrupt*/
TC2_REGS->COUNT16.TC_INTENSET = (uint8_t)(TC_INTENSET_OVF_Msk);
while((TC2_REGS->COUNT16.TC_SYNCBUSY) != 0U)
{
/* Wait for Write Synchronization */
}
}添加回调函数:
void MY_TC_TIMER_CALLBACK(TC_TIMER_STATUS status, uintptr_t context) {
static uint32_t cnt = 0;
cnt++;
if (cnt % 100 == 0) {
printf("\r\nInside TC2 WO0 ISR, cnt = %lu", cnt);
}
}注册回调到TIMER 2
TC2_TimerCallbackRegister(MY_TC_TIMER_CALLBACK, 0);
烧录,打开串口,每1s输出一次:

至此,除了使用SysTick,还可以使用SAME51J20A的多个Timer模块来实现相同的功能。

我要赚赏金
