上一篇文章介绍了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模块来实现相同的功能。