一、使用說明
目前我使用的是STM32L475系列單片機,是ali當時在PDD 50塊錢賣的一個開發板,其他STM32單片機參考即可,這里會手把手教大家基于RTT Studio 來使用PWM。
二、創建工程
1.創建工程
首先大家打開RT-Thread Studio 來基于單片機創建工程。點擊左上角文件,新建 RT-Thread項目
Project name就是項目名稱,如果大家想自定義路徑保存,就取消掉缺省位置然后自定義路徑。
選擇基于芯片,下面的參數需要大家根據自己的主板來選擇,我這個板子 使用LPUART作為CMD輸出,單片機型號,下載器比如JLINK或者STLINK等等都需要自己適配開發板。
3.下載設置
創建項目完成后大家可以先編譯后下載進開發板測試一下 CMD的輸出。
這里可以開啟下載后自動軟件復位。
4.編譯 下載
大家在編譯后就可以嘗試下載。
我使用的工具是XShell,可以看到復位后有啟動log輸出,就正常啦。
三、修改時鐘并配置串口
在創建工程的時候,RT-Thread Studio 默認使用的是內部低俗時鐘,我們需要更改到外部高速時鐘來提高MCU工作性能,后面PWM 的時鐘外設也使用的是外部高速時鐘。
1.打開CUBEMX
雙擊工程中的CUBEMX圖標,可以打開cubemx,如果沒有安裝請自行安裝。
2.打開高速時鐘
打開CUBEmx的 System Core,選擇RCC配置,將HSE與LSE均設置為Crystal/Ceramic Resonator,然后點擊左上角文件保存。
3.配置時鐘樹
打開 Clock Configuration
鎖相環PLL選擇HSE,然后Clock Mux選擇PLLCLK,PLLM數值選擇合適的數值,這個一般都有參考,每種單片機時鐘頻率不同,大家可以搜索對應的時鐘樹設置。
4.打開LPUART
因為在創建工程時,默認打開了LPUART,但是使用cubemx獲取代碼后,LPUART是關閉的,我們需要重新打開LPUART。
首先在右側選擇 PB10與PB11 為LPUART外設,然后在左側 Connectivity -LPUART外設中將Mode選擇為Asynchronous 模式,就已經成功打開了。
5.獲取代碼
首先點擊左上角文件 選擇Save Project,然后點擊右上角 Generate Code,代碼獲取完成后就可以關閉CubeMX了。
6.修改時鐘定義
剛才Cubemx已經幫我們生成了時鐘代碼,但是代碼需要我們手動加入到 BSP中,找到cubemx 里的src 然后打開main.c文件。
然后將 void SystemClock_Config(void) 這個函數內容復制到 drivers里的 drv_clk.c 文件中 void system_clock_config(void)。
7.編譯下載
這時候時鐘已經修改完成了,可以編譯下載應該是沒有錯誤的。
有一個reboot的調用警告,這是因為目前FINSH_FUNCTION_EXPORT_ALIAS 這個函數已經沒有調用了,
MSH_CMD_EXPORT(reboot, Reboot System);
將這句代碼替換掉上面的 FINSH_FUNCTION_EXPORT_ALIAS 即可。
四、配置PWM
1.使能PWM
首先打開RT-Thread Settings 打開PWM驅動。
選擇組件,設備驅動程序,使能PWM,然后點擊左上角保存。
2.配置時鐘
配置時鐘我們仍然需要使用CUBEMX工具,我目前要使用的PWM是A0引腳,將A0設置為TIM2的通道1
然后選擇Timers 的TIM2 將通道1 設置為 比較輸出模式。然后點擊左上角保存,右上角獲取代碼。
3.修改驅動
這時候 CUBEMX已經幫我們生成了需要使用的代碼,我們還需要將它修改到BSP里。
打開 cubemx的src文件夾,打開stm32l4xx_hal_msp.c,將以下三個函數的實現全部剪貼到drivers的board.c的最下面
void HAL_TIM_OC_MspInit(TIM_HandleTypeDef* htim_oc)
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef* htim_oc)
4.修改調用
打開drivers 里的 drv_pwm.c 找到 stm32_hw_pwm_init這個函數,在TIM初始化之前初始化以下時鐘引腳。
在圖里所示的位置調用這個函數。
HAL_TIM_OC_MspInit(tim);
5.配置PWM通道
這時候PWM的驅動就已經做好了,打開board.h ,打開需要使用的PWM通道
比如你使用的是TIM1,就是 pwm1, 通道同理。
#define BSP_USING_PWM2
#define BSP_USING_PWM2_CH1
6.保存編譯
這時候我們需要使用的驅動已經全部構建完成了,接下來就使用RT-Thread的接口來完成用戶代碼吧。
五、用戶代碼
1.新建一個.c文件來存放用戶代碼,名字隨便起,我放在了applications里,文件格式一定要加.c
2.PWM相關API
3.查找設備
rt_device_t rt_device_find(const char* name);
這個API會返回設備句柄
4.設置PWM參數
rt_err_t rt_pwm_set(struct rt_device_pwm *device,
int channel,rt_uint32_t period,rt_uint32_t pulse);
struct rt_device_pwm *device PWM設備句柄
int channel PWM通道數
rt_uint32_t period PWM周期,單位ns
rt_uint32_t pulse PWM脈沖寬度,單位ns
如果設置成功,會返回RT_EOK,
頻率= 1000000000/period
占空比 = pulse/period
3.使能PWM通道
rt_err_t rt_pwm_enable(struct rt_device_pwm *device, int channel);
struct rt_device_pwm *device 這是設備句柄
int channel PWM通道數
如果使能正常的話會返回RT_EOK,其他錯誤就是使能失敗。
3.PWM用戶Demo
/*
Copyright (c) 2006-2021, RT-Thread Development Team
SPDX-License-Identifier: Apache-2.0
Change Logs:
Date Author Notes
2022-03-13 desktop the first version
/
#include
#include
//設置log文件
#define DBG_TAG "pwm_test.c"
#define DBG_LVL DBG_LOG
#include
#define PWM_DEV_NAME "pwm2" / PWM 設 備 名 稱 */
#define PWM_DEV_CHANNEL 1
struct rt_device_pwm pwm_dev; / PWM 設 備 句 柄 /
static int pwm_test(void)
{
rt_uint32_t period , pulse;
//設置周期及 脈沖長度
period = 200000;
pulse = 100000;
pwm_dev = (struct rt_device_pwm )rt_device_find(PWM_DEV_NAME); //查找PWM設備
//配置PWM
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); //占空比應該是50%
if (rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL) == RT_EOK)
{
LOG_D("PWM Init is ok tn");
return RT_EOK;
}
return RT_EOK;
}
MSH_CMD_EXPORT(pwm_test, pwm device sample);
代碼注釋基本上已經寫清楚啦,我用的是TIM2的通道1,就是pwm2的通道1,大家可以參考這個Demo。
4.命令行調用
完成了代碼,我們編譯下載進單片機,打開命令行 輸入help命令,可以將main中的log日志代碼刪除掉,不然會一直彈 Hello RT-Thread
可以看到help 顯示的命令, pwm_test就是我們剛才用戶代碼的命令,
然后我用邏輯分析儀抓一下 PWM波形,應該是50%占空比。
-
PWM
+關注
關注
114文章
5198瀏覽量
214874 -
RCC
+關注
關注
0文章
93瀏覽量
27060 -
PWM波
+關注
關注
0文章
99瀏覽量
16947 -
STM32單片機
+關注
關注
59文章
549瀏覽量
58818 -
STM32L4
+關注
關注
1文章
42瀏覽量
9435 -
RTThread
+關注
關注
8文章
132瀏覽量
40999
發布評論請先 登錄
相關推薦
評論