我们为双核设置了系统、并在单独的内核上启用和控制 PWM。 出于某种原因、PWM 仅在 CPU2上输出、而不是 CPU1。 下面是我们在每个内核上使用的 PWM 列表:
PWM (CPU1):
- EPWM2 (通道 A 和 B)
- EPWM3 (通道 A 和 B)-> TI BiSS-C 位置管理器库也使用了 EPWM3 (BiSS-C 库使用的 CLB 需要、我们知道不应发生冲突)
- EPWM4 (通道 A 和 B)-> TI BiSS-C 位置管理器库也使用了 EPWM4 (需要为 BiSS-C 库内部时钟生成启用、不应像我们知道的那样发生冲突)
- EPWM5 (通道 A 和 B)
- EPWM10 (通道 A 和 B)
- EPWM11 (通道 B)
PWM (CPU2):
- EPWM1 (通道 A)
- EPWM11 (通道 A)->目前已禁用、因此 CPU1可以使用 EPWM11通道 B
- EPWM12 (通道 A)
我们使用了为 PWM 初始化提供的 TI 示例。 所有 PWM 在单核(CPU1)上都可以正常工作、但在双核分离后、只有 CPU2 PWM 看起来工作正常。
起初、我认为它可能与 GTBCLKSYNC 问题有关、因此我实现了以下 TI 文章中推荐的 PWM 初始化流程、但它似乎无法解决该问题:
目前、我们的 PWM 初始化流程如下所示:
在 CPU1上:
- 启用 CPU1 PWM 外设(EPWM2、EPWM3、EPWM4、EPWM5、EPWM10、 EPWM11)
- 为任何 CPU2 PWM 外设(EPWM1和 EPWM12)提供对 CPU2的访问权限
- 将 ePWM 时钟分频器设置为 SYSCTL_EPWMCLK_DIV_2
- 禁用 GTBCLKSYNC
- 初始化每个 CPU1 PWM (EPWM4除外):
- 设置时基周期
- 将相移设置为0
- 将时基计数器设置为0
- 将仿真模式设置为 ePWM_EMPY_FREE_RUN
- 将时基计数器模式设置为 ePWM_COUNTER_MODE_UP
- 禁用相移负载
- 将时钟预分频器设置为 ePWM_CLOCK_DEVIDER_1和 ePWM_HSCLOCK_DEVIDER_1
- 对于每个通道、设置计数器比较值为0 (CMPA 或 CMPB)
- 对于每个通道、将操作限定符设置为 ePWM_AQ_OUTPUT ON_TIMEBASE_ZERO 和 ePWM_AQ_OUTPOUT_ON_TIMEBASE_UP_CMPA (或 CMPB)
- 将周期加载事件设置为 EPWM_SHADOK_LOAD_MODE_COUNTER_ZERO
- 初始化 EPWM4 (基于 BiSS-C 位置管理器库示例)
- 设置 TZCTL TZA = 1
- 设置 TZCTL TSB = 1
- 设置 TZFRC OST = 1
- 强制关闭 CPU2 PWM 初始化并等待其完成
- 启用 GTBCLKSYNC
在 CPU2上:
- 将 ePWM 时钟分频器设置为 SYSCTL_EPWMCLK_DIV_2
- 初始化每个 CPU2 PWM (与上面相同的过程)
- 让 CPU1知道 CPU2 PWM 初始化已完成
我在 CPU1上检查过的 PWM 不输出任何内容、但我看到一些寄存器值发生了变化、它们是 EPWM3和 EPWM10。 我在 CPU2上检查的工作 PWM 是 EPWM1。 当我设置占空比(CMPA 和 CMPB 值)时、我是否可以检查任何寄存器以确保至少 PWM 模块本身在 CPU1上正常工作?
是否还需要在两个内核上设置 ePWM 时钟分频器?


