针对你在 CY8C4248LTI-L475 上无法同时生成 100Hz 和 200Hz 时钟,但其他组合(如 400Hz 和 200Hz)可行的问题,这很可能是由于 PSoC4 内部时钟分频器资源(特别是对于低频时钟)的架构限制和分频系数冲突 造成的。以下是对原因的分析和几种解决方案:
? 问题根本原因:级联分频器的限制
- 时钟分频结构: PSoC4 使用 16-bit 计数器作为主要的可配置分频器(UDB 或 DFB 中)。要生成非常低频(如 100Hz、200Hz)的时钟,需要很大的分频系数。
- 24MHz / 100Hz = 240,000
- 24MHz / 200Hz = 120,000
- 分频系数限制:
- 单个 16-bit 分频器的最大分频系数是 65,535 (
2^16 - 1)。120,000 和 240,000 都大于这个值。
- 级联分频: 要得到大于 65,535 的分频系数,必须使用级联分频器。这意味着你需要配置两个或多个连续的分频器(例如,两个 16-bit 分频器级联最大可以达到 65,535 * 65,535,但这会非常慢)。
- HFCLK 到低频时钟的路径: 通常的配置路径是:HFCLK (24MHz) -> 第一级分频器 -> 第二级分频器 -> 你的低频输出时钟 (100Hz/200Hz)。
- 关键限制 - 共享级数:
- PSoC Creator 在优化资源时,会尽量让不同低频时钟路径共享相同的第一级甚至第二级分频器(以节省资源)。
- 问题在于:100Hz 和 200Hz 所需的级联分频系数比例关系 (240,000 vs 120,000 = 2:1) 导致它们对共享的分频器(特别是靠近源头的级数)提出了特定的、可能冲突的要求。
- 当你尝试配置 100Hz 和 200Hz 时,工具很可能无法为它们找到一组共享和专用的分频器分配方案,使得两个最终分频系数都能精确实现且不违反资源或路径约束。一个特别常见的问题是第一个共享分频器的分频系数可能无法同时满足后续两个独立分频器生成所需频率(一个需要 x2,另一个需要 /2)的计算要求。
- 反例可行原因: 400Hz (分频系数 60,000) 和 200Hz (120,000) 组合可能成功,是因为 120,000 = 60,000 * 2。工具可以在第一个分频器(也可能是共享的)之后,让其中一个时钟直接用第一个分频器的输出 (400Hz),而另一个时钟再用一个简单的 2 分频器(非常容易实现,可能不会占用主要的级联资源或者冲突解决)来得到 200Hz。类似地,100Hz (240,000) 和 400Hz (60,000) 虽然比例是 4:1,但工具可能找到了不冲突的共享方案(例如,第一个分频器是 60,000,然后 400Hz 直接输出,100Hz 再用一个 4 分频器)。
?️ 解决方案与建议:
以下是几种解决或规避此限制的方法:
修改分频方案 (推荐首选):
- 思路: 避免让两个目标频率共享同一个低频时钟资源链的开头部分。
- 方法: 选择其中一个频率(例如 200Hz)作为基础,通过额外的简单分频生成另一个频率。
- 具体实现 (例如):
- 使用时钟组件生成 200Hz。
- 对 200Hz 的输出再进行一次 2分频(使用一个额外的分频器组件或自定义数字逻辑 UDB / TCPWM 计数器分频模式)来产生 100Hz。
- 为什么有效: 这完全避开了在生成 200Hz 的级联分频器前端去共享资源以产生 100Hz。工具只需生成一个复杂的低频(200Hz),然后用一个非常简单且独立的分频器(分频系数 2)生成另一个频率。分频系数为 2 是任何计数器(TCPWM、UDB 内部)都极易实现的。
- 操作: 在 PSoC Creator 中,配置一个时钟为 200Hz。然后用一个 TCPWM 组件或 UDB 设计一个简单的分频器(选择计数器类型,设置周期为 1,使能 Compare / Capture 事件在计数值达到 Compare 值时产生中断或信号),将其时钟源设置为 200Hz 输出,并配置为上升沿触发,然后在计数匹配事件时翻转输出,这样就得到精准的 100Hz 方波。
使用独立的低频时钟源:
- 思路: 如果一个低频时钟必须通过级联分频从 HFCLK 生成,而另一个可以直接用更简单的资源生成,则尝试不同路径。
- 方法:
- 方法一:使用 TCPWM 组件(硬件定时器/计数器)。TCPWM 可以直接由 HFCLK (24MHz) 预分频(其预分频器也是 16-bit,最大系数 65,535)后驱动计数器。虽然单个 TCPWM 计数器最大分频系数也是 65,535,但 TCPWM 组件本身提供了独立的计数器资源。你可以配置两个 TCPWM 组件,分别生成 100Hz 和 200Hz。
- TCPWM1:
Period = (24,000,000 / 100) - 1 = 239,999 (小于 16-bit TCPWM 的最大值 65,535? 不,超过!)。所以单靠 TCPWM 也无法直接生成。
- TCPWM1:
Period = 60000 - 1 (对于 400Hz),然后使能 Compare 或 Overflow 中断,在中断处理函数里进行软件计数(如计数到 3 才执行一次操作)来“分频”到 100Hz。这个 100Hz 是软件事件频率,不是硬线信号。
- 方法二:如果一个频率可以通过 ILO(内部低速振荡器,通常 ~32.768kHz,精度低)或其分频器实现(比如 32.768kHz / 327 ≈ 100Hz),另一个使用 HFCLK 分频器实现(200Hz)。但这需要你的应用能接受其中一个低频时钟精度较差,且两种时钟源不同步。
调整主时钟频率:
- 思路: 选择一个能使目标频率成为分频器可接受整数的值。
- 方法:
- 如果你的应用允许,稍微调整 IMO 频率。例如,将 IMO 从 24MHz 改为 20MHz。
- 20MHz / 100Hz = 200,000 (仍需级联)
- 20MHz / 200Hz = 100,000 (仍需级联)
- 或者改为更容易分频的 HFCLK,如 25MHz。注意芯片规格支持的频率范围。
- 25MHz / 100Hz = 250,000
- 25MHz / 200Hz = 125,000
- 理论上这有助于避免分频系数比例冲突,但实践中不一定能解决问题,因为级联资源的结构和共享限制依然存在。
利用备用主时钟分频器:
- 思路: PSoC4 除了 Clock 组件使用的 UDB/DFB 分频器资源外,可能还有其他分频通路。
- 方法:
- 查看
System -> Clocks 配置页面。除了直接使用 Clock 组件外,有时可以通过配置 CLK_LF 或 CLK_PERI 的路径和分频器。尝试将其中一个低频时钟分配到 CLK_PERI 或 CLK_LF,另一个分配给你正在使用的时钟组件使用的总线 (CLK_HF)。这依赖于具体芯片和可用总线分频器资源。查阅特定器件的 TRM (Technical Reference Manual),寻找"Clock System"章节,查看 CLK_PERI 和 CLK_LF 分频器是否独立于你目前使用的路径,这些分频器是否有足够的范围。
? 总结与推荐方案:
- 最可靠、最灵活的解决方案是方案 1:选择一个频率 (200Hz) 通过 Clock 组件生成,另一个频率 (100Hz) 通过对该 200Hz 信号进行简单的硬件分频(使用 TCPWM 分频模式或 UDB)产生。
- 这几乎不增加额外成本(只多用少量数字资源)。
- 完全避免了低频级联时钟资源分配冲突。
- 生成的频率是硬件信号(高精度方波),适合驱动外围设备。
- 方案 2 使用 TCPWM 生成较低精度(软件中断)的 "100Hz" 或 "200Hz" 事件也是一种有效方法,但如果你需要精确的硬件信号,方案 1 是更优选择。
- 方案 3 和 4 值得尝试,特别是在方案 1 实施有困难时,但可能需要更多实验或牺牲时钟精度或频率灵活性。
在你的场景中,既然只需一个低频信号(100Hz)就能通过对另一个已生成的低频信号(200Hz)简单分频获得,那就完全没必要让 PSoC Creator 尝试同时从 HFCLK 生成这两个频率,因为这恰好击中了 PSoC4 时钟资源分配的一个痛点。 选择方案 1 应该能顺利解决问题并实现所需功能。?
|
|
|
2025-7-17 17:47:09
评论
举报
|
|
|
|