You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

以下两段C语言代码中,哪部分实现定时器每60秒触发?

两段TCA0定时器代码中60秒触发逻辑的对应部分

第一段代码(通过溢出次数累加实现)

1. 定时器基础配置(确定单次溢出周期)

这段代码先配置定时器的分频与周期,让单次溢出时长约为0.5秒,后续通过累计溢出次数达到60秒:

// 配置分频为256并使能定时器
TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV256_gc| TCA_SINGLE_ENABLE_bm;
// 设置定时器为正常模式
TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_NORMAL_gc;
// 初始化定时器计数值
TCA0.SINGLE.CNT = 0;
// 使能定时器溢出中断
TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm;
// 计算单次溢出对应的计数值,对应约0.5秒(3.33MHz*60/256=781250,减1后写入PER)
uint16_t ticks = 781249;                       //3.33MHZ*60/256
TCA0.SINGLE.PER = ticks - 1;

2. 中断服务函数中的计数触发逻辑

通过累加溢出次数,当计数到120次时执行60秒触发动作:

ISR(TCA0_OVF_vect)
{ 
    timerCount++;
    
    if (timerCount == 120)  // 累计120次溢出,总时长60秒
    {
        // 60秒触发的动作代码
        PORTB.OUT &= ~PIN2_bm;
        _delay_ms(125);
        
        PORTB.OUT |= PIN2_bm;
        _delay_ms(125);
        
        PORTB.OUT &= ~PIN3_bm;
        
        timerCount = 0;  // 重置计数
    }
    
    TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm; // 清除中断标志位
}

注:单次溢出周期约0.5秒,120次累加后刚好是60秒。

第二段代码(直接通过定时器周期配置实现)

这段代码直接将定时器溢出周期设置为60秒,每次溢出就执行触发动作:

1. 定时器周期配置(直接对应60秒)

// 配置分频为256并使能定时器
TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV256_gc| TCA_SINGLE_ENABLE_bm;
// 设置定时器为正常模式
TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_NORMAL_gc;
// 初始化定时器计数值
TCA0.SINGLE.CNT = 0;
// 使能定时器溢出中断
TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm;
// 直接计算60秒对应的计数值:3.33MHz*60秒/256分频 = 781250,减1后写入PER
uint16_t ticks = 781249;                       //3.33MHZ*60/256
TCA0.SINGLE.PER = ticks - 1;

2. 中断服务函数中的触发逻辑

每次定时器溢出(即每60秒)直接执行动作:

ISR(TCA0_OVF_vect)
{ 
    // 每60秒触发的动作代码
    PORTB.OUT &= ~PIN2_bm;
    _delay_ms(125);
    
    PORTB.OUT |= PIN2_bm;
    _delay_ms(125);
    
    PORTB.OUT &= ~PIN3_bm;
    
    TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm; // 清除中断标志位
}

注:这段代码无需额外计数,定时器自身的溢出周期就是60秒,触发逻辑更直接。


内容的提问来源于stack exchange,提问作者jackrussel fernandis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:05:06