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

 
					
				
 
			
			
			
						
			 
					
				
 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

