[其他产品] 有关于时钟的一些问题

[复制链接]
 楼主| stormwind123 发表于 2025-4-10 15:43 | 显示全部楼层 |阅读模式
我正在使用一个Pic24板来实现我的应用。在我的项目中,我使用定时器中断来启用和禁用一个光学输出。然而,当我通过改变周期来启用或更改定时器时,更改需要几秒钟才能生效。我无法理解这个问题背后的原因。
xixi2017 发表于 2025-4-11 15:46 | 显示全部楼层
定时器周期寄存器的同步机制
问题:PIC24的定时器模块(如Timer1)在运行时,写入周期寄存器(PRx)可能不会立即生效,而是等待当前周期结束。例如,若当前周期还剩较长时间,新值需等待当前周期完成后才加载。

解决:在修改周期寄存器前,尝试以下步骤:

停止定时器:通过清除控制寄存器(T1CONbits.TON = 0)暂停定时器。

写入新周期值:更新PRx寄存器。

重置计数器:将定时器计数器(TMRx)清零,确保从新周期开始。

重启定时器:重新使能定时器(T1CONbits.TON = 1)。
xixi2017 发表于 2025-4-11 15:46 | 显示全部楼层
预分频器(Prescaler)配置过大
问题:若预分频值设置过高(如1:256),即使周期寄存器值较小,实际中断间隔也可能长达数秒。

解决:

检查定时器的预分频配置(如T1CONbits.TCKPS)。

重新计算预分频和周期值,确保实际中断间隔符合预期。

公式:中断间隔 = (PRx + 1) * (Prescaler) / F_osc
xixi2017 发表于 2025-4-11 15:46 | 显示全部楼层
中断服务程序(ISR)中的延迟
问题:若在ISR中执行耗时操作(如复杂计算或阻塞代码),可能导致中断响应延迟,间接影响周期更新的及时性。

解决:

确保ISR尽可能简短,仅执行关键操作(如翻转引脚状态)。

将复杂逻辑移至主循环,通过标志位通信。
xixi2017 发表于 2025-4-11 15:47 | 显示全部楼层
寄存器写入未使用原子操作
问题:在修改定时器寄存器时,若未关闭中断或使用原子操作,可能因中断打断写入过程,导致寄存器值损坏。

解决:

在修改关键寄存器前禁用中断:
  1. __builtin_disable_interrupts(); // 关闭中断
  2. TMR1 = 0;       // 重置计数器
  3. PR1 = new_value; // 更新周期值
  4. __builtin_enable_interrupts();  // 重新启用中断


xixi2017 发表于 2025-4-11 15:47 | 显示全部楼层
定时器模式配置错误
问题:若定时器未配置为预期模式(如自由运行模式),可能导致周期更新异常。

解决:

确认定时器模式(如T1CONbits.TMODEL),设置为“周期性定时器”模式。

参考数据手册,确保其他控制位(如时钟源、同步设置)正确。
xixi2017 发表于 2025-4-11 15:47 | 显示全部楼层
代码逻辑错误
问题:修改周期的代码可能未正确触发,例如条件判断错误或变量未更新。

解决:

使用调试器或IO引脚输出调试信号,确认周期修改代码是否执行。

检查变量传递和计算过程,确保新周期值正确。
xixi2017 发表于 2025-4-11 15:47 | 显示全部楼层
最小化测试代码:仅保留定时器配置和周期修改逻辑,排除其他代码干扰。
  1. // 定时器初始化
  2. T1CON = 0x8000; // 使能定时器,预分频1:1
  3. PR1 = 0xFFFF;   // 初始周期最大值
  4. _T1IF = 0;      // 清除中断标志
  5. _T1IE = 1;      // 使能定时器中断

  6. // 主循环中修改周期
  7. while(1) {
  8.     if (需要修改周期) {
  9.         __builtin_disable_interrupts();
  10.         T1CONbits.TON = 0; // 停止定时器
  11.         TMR1 = 0;          // 重置计数器
  12.         PR1 = new_PR1;     // 写入新周期
  13.         T1CONbits.TON = 1; // 重启定时器
  14.         __builtin_enable_interrupts();
  15.     }
  16. }
wahahaheihei 发表于 2025-4-11 15:48 | 显示全部楼层
示波器/逻辑分析仪观测:直接测量光学输出引脚,观察修改周期后的实际响应时间,确认是否与预期一致。
勇敢的大白菜 发表于 2025-4-11 15:48 | 显示全部楼层
xixi2017 发表于 2025-4-11 15:46
定时器周期寄存器的同步机制
问题:PIC24的定时器模块(如Timer1)在运行时,写入周期寄存器(PRx)可能不 ...

定时器的精准度,完全依赖于时钟晶振的
逆鳞风暴 发表于 2025-4-11 22:22 | 显示全部楼层
可以尝试停止定时器,更新周期寄存器后,再重新启动定时器
不想起床喵星人 发表于 2025-4-12 09:31 | 显示全部楼层
是不是定时器的模式配置错误,没有设置为预期的模式
复古留声机 发表于 2025-4-12 11:23 | 显示全部楼层
是不是定时器的周期寄存器更新机制导致的
暖心小太阳 发表于 2025-4-12 13:23 | 显示全部楼层
是不是中断服务程序(ISR)里有耗时操作,影响了定时器周期更新的及时性
幻想收藏家 发表于 2025-4-12 18:51 | 显示全部楼层
检查一下定时器的预分频器设置
598330983 发表于 2025-4-18 12:24 | 显示全部楼层
时钟可以用MCC配置了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

588

主题

3619

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部