单片机/MCU论坛
直播中

kasdlak

9年用户 1312经验值
擅长:光电显示
私信 关注
[问答]

使用CCU4产生3个PWM信号,在引脚 P0.8 上看不到任何 PWM 输出,为什么?

您好,我想使用 CCU4 产生 3 个 PWM 信号。一切都已配置,引脚 P0.4,P0.6 和 P0.8 用作CCU40.OUT1、 CCU40.OUT0 和CCU40.OUT2,但我在引脚 P0.8 上看不到任何 PWM 输出。
我还尝试使用 P0.8 作为XMC_GPIO_MODE_OUTPUT_PUSH_PULL 的数字输出,但这也不起作用。
使用 P0.8 作为数字输出有什么限制吗?这和RTC_XTAL1有关系吗?
聚苯乙烯我不使用 RTC,也不在我的代码中执行任何 RTC 配置。

回帖(1)

h1654155216.9102

2025-7-17 17:47:02

针对您在引脚 P0.8 上无法观测到 PWM 信号的问题,以下是系统性的原因分析和解决方案:


根本原因分析:




  1. RTC 低频晶振默认占用(关键因素)  



    • P0.8 引脚与 RTC_XTAL1 功能复用,即使您未主动配置 RTC,XMC 芯片上电后默认会启用低频晶振驱动电路,导致 P0.8 被强制锁定为晶振输入模式。

    • 此时无论配置为 PWM 输出或普通 GPIO 均无效,因为硬件逻辑会覆盖软件设置。




  2. 软件配置遗漏  



    • 未在代码中显式禁用 RTC 低频晶振功能,导致引脚控制权未被释放。




  3. 硬件设计注意事项  



    • 当 P0.8 用作 PWM 时,需确保硬件上未连接外部低频晶振(避免信号冲突)。






解决方案:


步骤 1:禁用 RTC 低频晶振


在初始化代码中(如 main() 函数开头)添加以下寄存器操作:


// 重要:禁止低频晶振驱动电路(解锁 P0.8 引脚)
SCU_ANALOG->ANACTRL |= SCU_ANALOG_ANACTRL_DISABLE_LP_OSC_Msk;  // 写入使能位
SCU_ANALOG->ANACTRL |= (1UL << 3);  // 置位 DISABLE_LP_OSC 控制位

此操作:



  • 通过 SCU_ANALOG->ANACTRL 寄存器关闭晶振驱动电路。

  • 必须在 GPIO 和 CCU4 初始化前执行


步骤 2:验证引脚配置


检查 PWM 和 GPIO 配置代码:


// PWM 引脚配置(ALT5 = CCU40.OUT2)
XMC_GPIO_SetMode(P0_8, XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT5);

// CCU4 输出通道激活(以通道2为例)
XMC_CCU4_SLICE_EnablePwmOutput(XMC_CCU4_SHADOW_TRANSFER_SLICE_2, XMC_CCU4_SLICE_OUTPUT_2); // 确保使能 OUT2

步骤 3:硬件检查



  • 确认电路板 P0.8 未连接外部晶振元件(否则需移除)。

  • 使用万用表测量 P0.8 对地阻抗,排除短路/损坏。




完整代码结构示例:


#include 
#include

int main(void) {
  // 步骤 1: 禁用 RTC 晶振电路
  SCU_ANALOG->ANACTRL |= SCU_ANALOG_ANACTRL_DISABLE_LP_OSC_Msk | (1UL << 3);

  // 步骤 2: 配置引脚为 PWM 输出
  XMC_GPIO_SetMode(P0_8, XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT5); // ALT5 = CCU40.OUT2

  // 步骤 3: 初始化 CCU4 模块及 PWM 参数(省略详细 CCU4 配置)
  XMC_CCU4_Init(...);
  XMC_CCU4_SLICE_SetPwmConfig(...);

  // 步骤 4: 激活 PWM 输出通道
  XMC_CCU4_EnableShadowTransfer(...); // 传输周期配置
  XMC_CCU4_SLICE_StartTimer(...);     // 启动定时器
  XMC_CCU4_SLICE_EnablePwmOutput(XMC_CCU4_SHADOW_TRANSFER_SLICE_2, XMC_CCU4_SLICE_OUTPUT_2); // 关键:使能 OUT2

  while(1) { /* 主循环 */ }
}

补充说明:



  • 寄存器位操作依据ANACTRL 寄存器的 DISABLE_LP_OSC (bit3) 直接控制晶振驱动电路开关,手册中明确说明其优先级高于引脚复用器。

  • 调试建议

    使用调试器在运行时检查寄存器:
    if (SCU_ANALOG->ANACTRL & (1UL << 3)) {
    // 确认 DISABLE_LP_OSC 已生效
    }


通过上述操作,P0.8 将被成功释放并输出 PWM 信号。此问题与 RTC 功能是否使用无关,仅取决于晶振电路的默认状态。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分