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

ATtiny204的Timer/Counter B中断频率异常问题排查

问题分析与解决方案:ATtiny204 TCB定时中断频率不符预期

核心错误点分析

1. 时钟预分频设置未生效(最可能根源)

ATtiny204的CLKCTRL.MCLKCTRLB寄存器(外设时钟预分频配置)默认处于锁定状态,直接修改不会生效。你的代码缺少解锁步骤,导致CLK_PER并未被分频为312.5kHz,而是保持与CLK_CPU一致的20MHz,这直接导致中断频率远超预期。

正确的时钟初始化代码需先解锁:

// 解锁时钟控制寄存器,允许修改MCLKCTRLB
CLKCTRL.MCLKLOCK = 0x00;
CLKCTRL.MCLKCTRLA = CLKCTRL_CLKSEL_OSC20M_gc; // 选择20MHz内部振荡器
CLKCTRL.MCLKCTRLB = CLKCTRL_PDIV_64X_gc | CLKCTRL_PEN_bm; // 外设时钟分频64
CLKCTRL.MCLKLOCK = 0x01; // 可选:重新锁定,防止后续误修改

2. TCB周期计算逻辑错误

TCB在周期性中断模式下,计数器从0开始计数,当数值等于CCMP时触发中断,随后重置为0,因此一个完整的中断周期包含CCMP + 1个时钟脉冲,而非CCMP个。正确的MATCH_VALUE计算公式应为:

MATCH_VALUE = (CLK_PER / 目标中断频率) - 1

按你的预期(CLK_PER=312.5kHz,1kHz中断),正确值应为:

MATCH_VALUE = (312500 / 1000) - 1 = 311

3. 中断频率与引脚翻转频率混淆

你的中断处理函数中,每两次中断才翻转一次引脚电平,因此逻辑分析仪测到的引脚频率是中断频率的1/2。若误将引脚频率当作中断频率,会导致对实际时钟速度的误判。

4. 不必要的输入捕获事件干扰

代码中启用了TCB_CAPTEI_bm(输入捕获事件使能)但未连接对应输入信号,引脚噪声可能触发意外的输入捕获,导致TCB计数器被强制重置,打乱周期性中断节奏,引发不可预期的中断频率。应禁用该功能:

TCB0.EVCTRL = 0; // 禁用输入捕获事件,避免干扰

关于实验值3360的安全性

3360仅能临时满足当前单一功能的需求,但存在明显风险:

  • 后续添加UART、ADC等外设时,因底层时钟配置错误会出现功能异常;
  • 更换芯片或重新烧录熔丝后,该值可能完全失效;
  • 温度变化导致时钟漂移时,无可靠校准依据,无法保证长期稳定性。

验证步骤

  1. 修复时钟初始化代码,添加解锁逻辑;
  2. 使用正确的MATCH_VALUE=311测试中断频率;
  3. 修改中断处理函数,每次中断直接翻转引脚(而非每两次翻转一次),用逻辑分析仪验证实际中断频率是否为1kHz;
  4. 若仍有问题,通过简单延时函数(如固定次数循环后翻转GPIO)计算实际时钟频率,确认熔丝设置是否生效。

内容的提问来源于stack exchange,提问作者Willis Hershey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:37:32