一、使用說(shuō)明
目前我使用的是STM32L475系列單片機(jī),是ali當(dāng)時(shí)在PDD 50塊錢賣的一個(gè)開發(fā)板,其他STM32單片機(jī)參考即可,這里會(huì)手把手教大家基于RTT Studio 來(lái)使用PWM。
二、創(chuàng)建工程
1.創(chuàng)建工程
首先大家打開RT-Thread Studio 來(lái)基于單片機(jī)創(chuàng)建工程。點(diǎn)擊左上角文件,新建 RT-Thread項(xiàng)目
Project name就是項(xiàng)目名稱,如果大家想自定義路徑保存,就取消掉缺省位置然后自定義路徑。
2.芯片參數(shù)設(shè)置
選擇基于芯片,下面的參數(shù)需要大家根據(jù)自己的主板來(lái)選擇,我這個(gè)板子 使用LPUART作為CMD輸出,單片機(jī)型號(hào),下載器比如JLINK或者STLINK等等都需要自己適配開發(fā)板。
3.下載設(shè)置
創(chuàng)建項(xiàng)目完成后大家可以先編譯后下載進(jìn)開發(fā)板測(cè)試一下 CMD的輸出。
這里可以開啟下載后自動(dòng)軟件復(fù)位。
4.編譯 下載
大家在編譯后就可以嘗試下載。
我使用的工具是XShell,可以看到復(fù)位后有啟動(dòng)log輸出,就正常啦。
三、修改時(shí)鐘并配置串口
在創(chuàng)建工程的時(shí)候,RT-Thread Studio 默認(rèn)使用的是內(nèi)部低俗時(shí)鐘,我們需要更改到外部高速時(shí)鐘來(lái)提高MCU工作性能,后面PWM 的時(shí)鐘外設(shè)也使用的是外部高速時(shí)鐘。
1.打開CUBEMX
雙擊工程中的CUBEMX圖標(biāo),可以打開cubemx,如果沒(méi)有安裝請(qǐng)自行安裝。
2.打開高速時(shí)鐘
打開CUBEmx的 System Core,選擇RCC配置,將HSE與LSE均設(shè)置為Crystal/Ceramic Resonator,然后點(diǎn)擊左上角文件保存。
3.配置時(shí)鐘樹
打開 Clock Configuration
鎖相環(huán)PLL選擇HSE,然后Clock Mux選擇PLLCLK,PLLM數(shù)值選擇合適的數(shù)值,這個(gè)一般都有參考,每種單片機(jī)時(shí)鐘頻率不同,大家可以搜索對(duì)應(yīng)的時(shí)鐘樹設(shè)置。
4.打開LPUART
因?yàn)樵趧?chuàng)建工程時(shí),默認(rèn)打開了LPUART,但是使用cubemx獲取代碼后,LPUART是關(guān)閉的,我們需要重新打開LPUART。
首先在右側(cè)選擇 PB10與PB11 為L(zhǎng)PUART外設(shè),然后在左側(cè) Connectivity -LPUART外設(shè)中將Mode選擇為Asynchronous 模式,就已經(jīng)成功打開了。
5.獲取代碼
首先點(diǎn)擊左上角文件 選擇Save Project,然后點(diǎn)擊右上角 Generate Code,代碼獲取完成后就可以關(guān)閉CubeMX了。
6.修改時(shí)鐘定義
剛才Cubemx已經(jīng)幫我們生成了時(shí)鐘代碼,但是代碼需要我們手動(dòng)加入到 BSP中,找到cubemx 里的src 然后打開main.c文件。
然后將 void SystemClock_Config(void) 這個(gè)函數(shù)內(nèi)容復(fù)制到 drivers里的 drv_clk.c 文件中 void system_clock_config(void)。
7.編譯下載
這時(shí)候時(shí)鐘已經(jīng)修改完成了,可以編譯下載應(yīng)該是沒(méi)有錯(cuò)誤的。
有一個(gè)reboot的調(diào)用警告,這是因?yàn)槟壳癋INSH_FUNCTION_EXPORT_ALIAS 這個(gè)函數(shù)已經(jīng)沒(méi)有調(diào)用了,
MSH_CMD_EXPORT(reboot, Reboot System);
將這句代碼替換掉上面的 FINSH_FUNCTION_EXPORT_ALIAS 即可。
四、配置PWM
1.使能PWM
首先打開RT-Thread Settings 打開PWM驅(qū)動(dòng)。
選擇組件,設(shè)備驅(qū)動(dòng)程序,使能PWM,然后點(diǎn)擊左上角保存。
2.配置時(shí)鐘
配置時(shí)鐘我們?nèi)匀恍枰褂肅UBEMX工具,我目前要使用的PWM是A0引腳,將A0設(shè)置為TIM2的通道1
然后選擇Timers 的TIM2 將通道1 設(shè)置為 比較輸出模式。然后點(diǎn)擊左上角保存,右上角獲取代碼。
3.修改驅(qū)動(dòng)
這時(shí)候 CUBEMX已經(jīng)幫我們生成了需要使用的代碼,我們還需要將它修改到BSP里。
打開 cubemx的src文件夾,打開stm32l4xx_hal_msp.c,將以下三個(gè)函數(shù)的實(shí)現(xiàn)全部剪貼到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.修改調(diào)用
打開drivers 里的 drv_pwm.c 找到 stm32_hw_pwm_init這個(gè)函數(shù),在TIM初始化之前初始化以下時(shí)鐘引腳。
在圖里所示的位置調(diào)用這個(gè)函數(shù)。
HAL_TIM_OC_MspInit(tim);
5.配置PWM通道
這時(shí)候PWM的驅(qū)動(dòng)就已經(jīng)做好了,打開board.h ,打開需要使用的PWM通道
比如你使用的是TIM1,就是 pwm1, 通道同理。
#define BSP_USING_PWM2
#define BSP_USING_PWM2_CH1
6.保存編譯
這時(shí)候我們需要使用的驅(qū)動(dòng)已經(jīng)全部構(gòu)建完成了,接下來(lái)就使用RT-Thread的接口來(lái)完成用戶代碼吧。
五、用戶代碼
1.新建一個(gè).c文件來(lái)存放用戶代碼,名字隨便起,我放在了applications里,文件格式一定要加.c
2.PWM相關(guān)API
3.查找設(shè)備
rt_device_t rt_device_find(const char* name);
這個(gè)API會(huì)返回設(shè)備句柄
4.設(shè)置PWM參數(shù)
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設(shè)備句柄
int channel PWM通道數(shù)
rt_uint32_t period PWM周期,單位ns
rt_uint32_t pulse PWM脈沖寬度,單位ns
如果設(shè)置成功,會(huì)返回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 這是設(shè)備句柄
int channel PWM通道數(shù)
如果使能正常的話會(huì)返回RT_EOK,其他錯(cuò)誤就是使能失敗。
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
//設(shè)置log文件
#define DBG_TAG "pwm_test.c"
#define DBG_LVL DBG_LOG
#include
#define PWM_DEV_NAME "pwm2" / PWM 設(shè) 備 名 稱 */
#define PWM_DEV_CHANNEL 1
struct rt_device_pwm pwm_dev; / PWM 設(shè) 備 句 柄 /
static int pwm_test(void)
{
rt_uint32_t period , pulse;
//設(shè)置周期及 脈沖長(zhǎng)度
period = 200000;
pulse = 100000;
pwm_dev = (struct rt_device_pwm )rt_device_find(PWM_DEV_NAME); //查找PWM設(shè)備
//配置PWM
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); //占空比應(yīng)該是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);
代碼注釋基本上已經(jīng)寫清楚啦,我用的是TIM2的通道1,就是pwm2的通道1,大家可以參考這個(gè)Demo。
4.命令行調(diào)用
完成了代碼,我們編譯下載進(jìn)單片機(jī),打開命令行 輸入help命令,可以將main中的log日志代碼刪除掉,不然會(huì)一直彈 Hello RT-Thread
可以看到help 顯示的命令, pwm_test就是我們剛才用戶代碼的命令,
然后我用邏輯分析儀抓一下 PWM波形,應(yīng)該是50%占空比。
-
PWM
+關(guān)注
關(guān)注
116文章
5324瀏覽量
217577 -
RCC
+關(guān)注
關(guān)注
0文章
94瀏覽量
27353 -
PWM波
+關(guān)注
關(guān)注
0文章
100瀏覽量
17223 -
STM32單片機(jī)
+關(guān)注
關(guān)注
59文章
549瀏覽量
59319 -
STM32L4
+關(guān)注
關(guān)注
1文章
42瀏覽量
9577 -
RTThread
+關(guān)注
關(guān)注
8文章
132瀏覽量
41475
發(fā)布評(píng)論請(qǐng)先 登錄
手把手教你學(xué)單片機(jī)之AVR入門視頻教程
《手把手教你學(xué)單片機(jī)c語(yǔ)言》視頻教程
力天手把手教你學(xué)單片機(jī)視頻全集下載
手把手教你單片機(jī)
《手把手教你學(xué)CPLD/FPGA與單片機(jī)聯(lián)合設(shè)計(jì)》-周興華
手把手教你實(shí)戰(zhàn)RT-Thread Nano,不信都這樣了你還不會(huì)
手把手教你學(xué)STM32單片機(jī)
手把手教你學(xué)LabVIEW視覺(jué)設(shè)計(jì)
手把手教你開發(fā)基于單片機(jī)的wifi通信的物聯(lián)網(wǎng)項(xiàng)目(遠(yuǎn)程燈控制)

評(píng)論