本文描述了如何在搭載了 RT-Thread 操作系統的平臺上使用 PWM 輸出波形,包括 PWM 的應用、配置和驅動的添加等。并給出了在正點原子 STM32L475 pandora 開發板上驗證的代碼示例。
硬件平臺簡介
本文基于正點原子 STM32L475 pandora 開發板,給出了 PWM 的具體應用示例代碼,由于 RT-Thread 上層應用 API 的通用性,因此這些代碼不局限于具體的硬件平臺,用戶可以輕松將它移植到其它平臺上。 STM32L475 pandora 是正點原子推出的一款基于 ARM Cortex-M4 內核的開發板,最高主頻為 80Mhz,該開發板具有豐富的板載資源,可以充分發揮 STM32L475 的芯片性能。
使用 PWM
在 menuconfig 中打開 PWM 通道
打開 Env 工具,使用 menuconfig 工具配置工程,在 Env 命令行中輸入 menuconfig 進入配置界面。在 menuconfig 配置界面依次選擇 Hardware Driver Config ---> On-chip Peripheral Drivers ---> Enable pwm ---> Enable timer2 output pwm 如下圖所示:
選中需要使用的 PWM 通道后保存退出,使用 scons --target=mdk5 生成 mdk5 工程,打開工程進行編譯并下載程序,在終端輸入 list_device 命令可以看到 PWM2 設備已經成功添加了,如下圖所示:
使用 PWM 輸出波形
應用程序可以通過 RT-Thread 提供的設備管理接口來訪問 PWM 設備硬件,相關接口如下所示:
接口參數的具體描述請參考官網PWM 設備
鏈接:
https://www.rt-thread.org/document/site/programming-manual/device/pwm/pwm/
(以上鏈接請復制至外部瀏覽器打開)
PWM 設備使用步驟
PWM 設備的具體使用方式可以參考如下步驟:
初始化 PWM 設備。 使用 rt_device_find 查找指定的 PWM 設備。 使用 rt_pwm_set 設置通道的默認 PWM 周期和脈沖寬度。 使用 rt_pwm_enable 使能需要輸出波形的 PWM 通道。
使用 PWM 設備輸出波形。 使用 rt_pwm_set 輸出特定的波形。
關閉 PWM 輸出通道。 當不再需要使用 PWM 通道輸出波形時,可以調用 rt_pwm_disable 關閉對應的輸出通道。
代碼如下所示:向滑動查看全部
1#definePWM_DEV_NAME"pwm2"/*PWM設備名稱*/ 2#definePWM_DEV_CHANNEL3/*PWM通道*/ 3#defineTHREAD_PRIORITY25/*線程優先級*/ 4#defineTHREAD_STACK_SIZE512/*線程棧大小*/ 5#defineTHREAD_TIMESLICE5/*線程時間片大小*/ 6 7staticrt_thread_ttid1=RT_NULL;/*線程句柄*/ 8structrt_device_pwm*pwm_dev;/*PWM設備句柄*/ 9staticrt_uint32_tperiod=500000;/*周期為0.5ms,單位為納秒ns*/ 10staticrt_uint32_tpulse=0;/*PWM脈沖寬度值的增減方向*/ 11 12/*線程pwm_entry的入口函數*/ 13staticvoidpwm_entry(void*parameter) 14{ 15rt_uint32_tcount=0; 16 17while(count++1000) 18????{ 19????????rt_thread_mdelay(50); 20????????/*?step?2、設置?PWM?周期和脈沖寬度,輸出特定的波形?*/ 21????????rt_pwm_set(pwm_dev,?PWM_DEV_CHANNEL,?period,?pulse++); 22????} 23????/*?step?3、如果不再使用該通道,可以關閉?PWM?通道的輸出?*/ 24????rt_pwm_disable(pwm_dev,?PWM_DEV_CHANNEL); 25} 26 27static?int?pwm_test(int?argc,?char?*argv[]) 28{ 29????/*?step?1.1、查找?PWM?設備?*/ 30????pwm_dev?=?(struct?rt_device_pwm?*)rt_device_find(PWM_DEV_NAME); 31????if?(pwm_dev?==?RT_NULL) 32????{ 33????????rt_kprintf("pwm?sample?run?failed!?can't?find?%s?device! ",?PWM_DEV_NAME); 34????????return?RT_ERROR; 35????} 36 37????/*?step?1.2、設置?PWM?周期和脈沖寬度默認值?*/ 38????rt_pwm_set(pwm_dev,?PWM_DEV_CHANNEL,?period,?pulse); 39????/*?step?1.3、使能?PWM?設備的輸出通道?*/ 40????rt_pwm_enable(pwm_dev,?PWM_DEV_CHANNEL); 41 42????/*?創建線程,名稱是?pwm_thread?,入口是?pwm_entry*/ 43????tid1?=?rt_thread_create("pwm_thread", 44?????????????????????????????pwm_entry, 45?????????????????????????????RT_NULL, 46?????????????????????????????THREAD_STACK_SIZE, 47?????????????????????????????THREAD_PRIORITY, 48?????????????????????????????THREAD_TIMESLICE); 49 50????/*?如果獲得線程控制塊,啟動這個線程?*/ 51????if?(tid1?!=?RT_NULL) 52????????rt_thread_startup(tid1); 53 54????return?RT_EOK; 55} 56/*?導出到?msh?命令列表中?*/ 57MSH_CMD_EXPORT(pwm_test,?pwm?sample);編譯、下載程序,在終端輸入 help 命令可以看到 pwm_test 命令已經成功導出,如下圖所示:
運行 PWM 測試程序
要運行 PWM 測試程序,需要在終端輸入 pwm_test 由于此 BSP 的 PWM2 通道 3 的輸出并沒有連接到外設上,無法直觀的看到現象,所以這里使用邏輯分析儀來抓取 PWM 輸出的波形,波形輸出如下圖所示:
從邏輯分析儀抓取的波形可以看到,PWM 波形已經成功輸出。
添加 PWM 驅動
如果使用的 BSP 在 menuconfig 中沒有給出 PWM 通道的配置項,那么就需要自己添加 PWM 的驅動,下面就如何自己添加 PWM 驅動展開講解。
檢查驅動文件是否支持 PWM
進入 rt-threadspstm32librariesHAL_Drivers 目錄檢查 drv_pwm.c 文件是否支持相應的 PWM 外設輸出。檢查驅動文件是否支持相應的 PWM 外設(PWM1、2、n)
檢查驅動文件是否支持相應的 PWM 輸出通道(1、2、3、4)
初始化 PWM 通道引腳
進入 rt-threadspstm32l475-atk-pandoraoardCubeMX_Config 目錄,雙擊打開 STM32L475VE.ioc 文件初始化 PWM 通道對應的引腳,這里以 PWM2 通道 3 為例,如下圖所示:
點擊 GENERATE CODE 按鈕生成代碼,雖然 STM32CubeMX 生成了多個文件用來初始化外設,但 RT-Thread 只使用了 STM32CubeMX 生成的 stm32fxx_hal_msp.c 文件和 stm32fxx_hal_conf.h 文件,生成的 PWM 代碼如下所示:
配置 Kconfig 文件
進入 rt-threadspstm32l475-atk-pandoraoard 目錄,添加 Kconfig 選項,如下圖所示:
使用 scons --target=mdk5 命令生成 mdk5 工程,打開工程并編譯,如果工程提示 PWMn_CONFIG 未定義。 可以在stm32/libraries/HAL_Drivers/config/f4/pwm_config.h 中進行定義,如下圖所示:
完成以上步驟就可以在 menuconfig 菜單中添加支持的 PWM 輸出通道,至于如何使用 PWM 通道輸出波形請參考上一章節。 到這一步為止,如何在搭載了 RT-Thread 操作系統的平臺上如何使用 PWM 的介紹就結束了。
-
PWM
+關注
關注
114文章
5181瀏覽量
213808 -
輸出波形
+關注
關注
0文章
21瀏覽量
8944
原文標題:STM32 上使用 PWM
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論