这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】MicrochipMPLABHarmony框架下定时器配置

共5条 1/1 1 跳转至

【换取手持数字示波器】MicrochipMPLABHarmony框架下定时器配置

工程师
2025-05-25 13:07:38     打赏

上一篇文章介绍了PWM的配置,本次介绍Timer定时器的配置,以及相关ISR的代码配置。

MCC图形化配置工具中,首先添加需要使用的TC模块:

image.png


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

image.png

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

image.png

点击生成代码:

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输出一次:

image.png

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



院士
2025-05-30 16:33:22     打赏
2楼

我就有点舍不得使用Timer来做简单的计时之用。


院士
2025-05-31 08:31:09     打赏
3楼

我只会朴素使用。

你们不分享,我就不会用。



专家
2025-06-03 09:53:57     打赏
4楼

定时器的配置参数好多啊,全英文。楼主辛苦!


高工
2025-06-03 15:31:59     打赏
5楼

定时器作为基本外设,用途还是蛮多的


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]