SDK: wm-sdk-w806
电路板: 合宙 AIR103 demo 板
SDK 中默认的 app, 包括有初始化 PWM 功能, 考虑更换到板子对应的 LED 灯 PB24/PB25/PB26, 对应 PWM2/PWM3/PWM4.
测试时发现 PWM 初始化有顺序要求, 需要按照 PWM4" PWM3" PWM2 顺序执行 [初始化+启动] 方可, 否则会导致 PWM2 不工作.
# PWM2 不工作
PWM_Init (&pwm[0], PWM_CHANNEL_2) ;
HAL_PWM_Start (&pwm[0]) ;
PWM_Init (&pwm[1], PWM_CHANNEL_3) ;
HAL_PWM_Start (&pwm[1]) ;
PWM_Init (&pwm[2], PWM_CHANNEL_4) ;
HAL_PWM_Start (&pwm[2]) ;
# PWM2/3/4 工作正常
PWM_Init (&pwm[0], PWM_CHANNEL_4) ;
HAL_PWM_Start (&pwm[0]) ;
PWM_Init (&pwm[1], PWM_CHANNEL_3) ;
HAL_PWM_Start (&pwm[1]) ;
PWM_Init (&pwm[2], PWM_CHANNEL_2) ;
HAL_PWM_Start (&pwm[2]) ;
# PWM2/3/4 工作正常
PWM_Init (&pwm[0], PWM_CHANNEL_2) ;
PWM_Init (&pwm[1], PWM_CHANNEL_3) ;
PWM_Init (&pwm[2], PWM_CHANNEL_4) ;
HAL_PWM_Start (&pwm[0]) ;
HAL_PWM_Start (&pwm[1]) ;
HAL_PWM_Start (&pwm[2]) ;
参考原例程中, 也是按照 PWM2" PWM1" PWM0 顺序初始化的.
是否其中有特殊的缘由?
for (i = 2; i " = 0; i--)
{
PWM_Init (&pwm[i], PWM_CHANNEL_0 + i) ;
HAL_PWM_Start (&pwm[i]) ;
}
是设置的独立通道.
排查发现是 SDK 中__PWM_CountType_Config 函数的问题.
CR 寄存器中 CNTTYPEx 移位错误, 导致 CNTEN 被覆盖, patch 如下:
diff --git a/platform/drivers/wm_pwm. c b/platform/drivers/wm_pwm. c
index 7674828d3c020f718b0f71b67eb3ce29fd3f8e92. . a88d3e77b1241dccd118d9ce3d64d6ab5f157c72 100644
--- a/platform/drivers/wm_pwm. c
+++ b/platform/drivers/wm_pwm. c
@@ -70, 7 +70, 7 @@ HAL_StatusTypeDef __PWM_CountType_Config (PWM_HandleTypeDef *hpwm, uint32_t Chann
}
else
{
- MODIFY_REG (hpwm-" Instance-" CR, (0x0FF " " (PWM_CR_CNTTYPE0_Pos + Channel * 2) ) ,
+ MODIFY_REG (hpwm-" Instance-" CR, (0x03 " " (PWM_CR_CNTTYPE0_Pos + Channel * 2) ) ,
(CounterMode " " (PWM_CR_CNTTYPE0_Pos + Channel * 2) ) ) ;
}
@isme bug 来了 快来