PWM

PWM通道初始化順序

發布於 2022-05-24 11:28:02

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]);
}

查看更多

關注者
0
被浏覽
2.4k
2 個回答
kicer
kicer 2022-05-25
這家夥很懶,什麼也沒寫!

是設置的獨立通道。

排查發現是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)));
     }
Mrzhao
Mrzhao 認證專家 2022-05-24
一個嵌入式愛好者。CSDN主頁:https://blog.csdn.net/qq_37280428?spm=1011.2415.3001.5343

是否設置:hpwm.Init.OutMode = PWM_OUT_MODE_INDEPENDENT; //獨立通道輸出

撰寫答案

請登錄後再發布答案,點擊登錄

發布
問題

分享
好友

手機
浏覽

掃碼手機浏覽