This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2652P7:PWM_Stop 不会恢复 GPIO 空闲电平(仅在最新的 TI SimpleLink SDK 上)

Guru**** 2473260 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1388994/cc2652p7-pwm_stop-does-not-restore-the-gpio-idle-level-only-on-recent-ti-simplelink-sdk

器件型号:CC2652P7

工具与软件:

您好!

我想我已经发现最新 TI SimpleLink SDK 回归并修复了它。

*在旧的 SDK (例如:5_20_00_52)上、PWMTimerCC26XX_STOP 运行正常。
*在最近的 SDK (例如:7_40_00_77)上、PWMTimerCC26XX_STOP 不会将 GPIO 设置回其空闲级别(例如、它会忽略 PWM_Params.idleLevel)。
*类似的权变措施是 PWM_Stop 之前使用 PWM_setDuty 设置预期的电平
*以下是重现问题和暂时修复的示例代码。

请确认或确认错误。

此致、
——Olivier
____________________________________________

   pwm_init();
   PWM_Handle PWM_Handle;
   PWM_Params PWM_params;
   PWM_Params_init (&PWM_params);

   pwm_params.periodUnit = pwm_period_Hz;
   pwm_params.periodValue = 1e6;
   pwm_params.dutyUnits = PWM_DUTY_分数;
   pwm_params.dutyValue = 0;
   pwm_params.idleLevel = pwm_idle_low;
   PWM_Handle = PWM_open (CONFIG_PWM、&PWM_PARAMS);

   PWM_START (PWM_Handle);
   PWM_setDuty (PWM_Handle、PWM_DUTY_FRACTION_MAX);
   PWM_STOP (PWM_Handle);
   Sleep (3)//在这里、输出为高电平(由于 PWM_setDuty)、而不是 PWM_IDLE_LOW
   PWM_Close (PWM_Handle);

   pwm_params.idleLevel = pwm_idle_high;
   PWM_Handle = PWM_open (CONFIG_PWM、&PWM_PARAMS);

   PWM_START (PWM_Handle);
   PWM_setDuty (PWM_Handle、0);
   PWM_STOP (PWM_Handle);
   Sleep (3)//在这里、输出为低电平(由于 PWM_setDuty)、而不是 PWM_IDLE_HIGH
   PWM_Close (PWM_Handle);

____________________________________________

diff --git a/source/ti/drivers/pwm/PWMTimerCC26XX.c b/source/ti/drivers/pwm/PWMTimerCC26XX.c
Index 1498bbd3e..32387db2b 100644.
---source/ti/drivers/pwm/PWMTimerCC26XX.c
++ b/source/ti/drivers/pwm/PWMTimerCC26XX.c
@@-404、6 +404、10 @@ void PWMTimerCC26XX_STOP (PWM_Handle handle)
 
    /*将 PWM 引脚路由到 GPIO 模块*/
    GPIO_getconfig (hwAttrs->pwmPin、&pinConfig);
+   if (object->idleLevel == pwm_idle_high)
+       pinConfig |= GPIO_CFG_OUT_HIGH;
+ else    
+       pinConfig 并且=~GPIO_CFG_OUT_HIGH;
    GPIO_setConfigAndMux (hwAttrs->pwmPin、pinConfig、GPIO_MUX_GPIO);
 }
 
——
2.34.1.


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Oliver:

    我观察到与您报告和确认的解决方法类似的行为。  感谢您报告此情况、因为这可能是 引脚到 GPIO++ TI 驱动程序迁移的情况。  我已经通知了 TI 驱动程序软件开发团队、以便他们可以在未来的 SDK 版本中实施解决方案。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的确认并将其提供给开发团队。

    与此同时、我注意到 PWM_Start 有一个类似的问题:第二个调用忽略 PWM_params.dutyValue。 下面是要重现的示例代码。 权变措施是 PWM_Start 之前调用 PWM_setDuty

    请确认这个;-)

    此致、
    ——Olivier
    ____________________________________________

    pwm_params.dutyValue = 2147483647;
    pwm_params.idleLevel = pwm_idle_low;
    PWM_Handle = PWM_open (CONFIG_PWM、&PWM_PARAMS);
    PWM_Start();
    Sleep (3);//此处、输出为2147483647 (pwm_params.dutyValue)、符合预期
    PWM_setDuty (PWM_Handle、PWM_DUTY_FRACTION_MAX);
    PWM_STOP (PWM_Handle);
    PWM_Start();
    sleep (3);//此处、输出为0、但应为2147483647
    ____________________________________________

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    出现这种情况可能是因为 PWM_Start 不调用 GPTimerCC26XX_setMatchValue、因为这是在 PWM_Open 期间处理的、因此 GPTimer 自 PWM_Stop 以来保持未配置状态。  我可以将此行为添加到现有票证中、但 TI 驱动程序代码执行可能倾向于保持原样、并使用您在特定情况下所描述的解决方法。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、有关  PWM_Params.dutyValue 的文档中显示"PWM initial Duty"。 即使将其传递到 PWM_Open、其效果也仅在 PWM_Start 后可见、并且只显示一次。

    无论做出任何设计决定、我都建议在文档中添加注释。

    此致、

    ——Olivier