0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

手把手教你基于RT-Thread Studio使用STM32單片機(jī)的PWM外設(shè)

冬至配餃子 ? 來源:樂樂愛學(xué)習(xí) ? 作者:樂樂愛學(xué)習(xí) ? 2023-09-28 15:12 ? 次閱讀

一、使用說明

目前我使用的是STM32L475系列單片機(jī),是ali當(dāng)時(shí)在PDD 50塊錢賣的一個(gè)開發(fā)板,其他STM32單片機(jī)參考即可,這里會(huì)手把手教大家基于RTT Studio 來使用PWM。

二、創(chuàng)建工程

1.創(chuàng)建工程

首先大家打開RT-Thread Studio 來基于單片機(jī)創(chuàng)建工程。點(diǎn)擊左上角文件,新建 RT-Thread項(xiàng)目
Project name就是項(xiàng)目名稱,如果大家想自定義路徑保存,就取消掉缺省位置然后自定義路徑。

1.jpg

2.芯片參數(shù)設(shè)置

選擇基于芯片,下面的參數(shù)需要大家根據(jù)自己的主板來選擇,我這個(gè)板子 使用LPUART作為CMD輸出,單片機(jī)型號(hào),下載器比如JLINK或者STLINK等等都需要自己適配開發(fā)板。

1.jpg

3.下載設(shè)置

創(chuàng)建項(xiàng)目完成后大家可以先編譯后下載進(jìn)開發(fā)板測(cè)試一下 CMD的輸出。
這里可以開啟下載后自動(dòng)軟件復(fù)位。

1.jpg

4.編譯 下載

大家在編譯后就可以嘗試下載。

1.jpg

我使用的工具是XShell,可以看到復(fù)位后有啟動(dòng)log輸出,就正常啦。

1.jpg

三、修改時(shí)鐘并配置串口

在創(chuàng)建工程的時(shí)候,RT-Thread Studio 默認(rèn)使用的是內(nèi)部低俗時(shí)鐘,我們需要更改到外部高速時(shí)鐘來提高MCU工作性能,后面PWM 的時(shí)鐘外設(shè)也使用的是外部高速時(shí)鐘。

1.打開CUBEMX

雙擊工程中的CUBEMX圖標(biāo),可以打開cubemx,如果沒有安裝請(qǐng)自行安裝。

1.jpg

2.打開高速時(shí)鐘

打開CUBEmx的 System Core,選擇RCC配置,將HSE與LSE均設(shè)置為Crystal/Ceramic Resonator,然后點(diǎn)擊左上角文件保存。

1.jpg

3.配置時(shí)鐘樹

打開 Clock Configuration

1.jpg

鎖相環(huán)PLL選擇HSE,然后Clock Mux選擇PLLCLK,PLLM數(shù)值選擇合適的數(shù)值,這個(gè)一般都有參考,每種單片機(jī)時(shí)鐘頻率不同,大家可以搜索對(duì)應(yīng)的時(shí)鐘樹設(shè)置。

1.jpg

4.打開LPUART

因?yàn)樵趧?chuàng)建工程時(shí),默認(rèn)打開了LPUART,但是使用cubemx獲取代碼后,LPUART是關(guān)閉的,我們需要重新打開LPUART。

1.jpg

首先在右側(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文件。

1.jpg

然后將 void SystemClock_Config(void) 這個(gè)函數(shù)內(nèi)容復(fù)制到 drivers里的 drv_clk.c 文件中 void system_clock_config(void)。

1.jpg

7.編譯下載

這時(shí)候時(shí)鐘已經(jīng)修改完成了,可以編譯下載應(yīng)該是沒有錯(cuò)誤的。
有一個(gè)reboot的調(diào)用警告,這是因?yàn)槟壳癋INSH_FUNCTION_EXPORT_ALIAS 這個(gè)函數(shù)已經(jīng)沒有調(diào)用了,

1.jpg

MSH_CMD_EXPORT(reboot, Reboot System);
將這句代碼替換掉上面的 FINSH_FUNCTION_EXPORT_ALIAS 即可。

四、配置PWM

1.使能PWM

首先打開RT-Thread Settings 打開PWM驅(qū)動(dòng)。

1.jpg

選擇組件,設(shè)備驅(qū)動(dòng)程序,使能PWM,然后點(diǎn)擊左上角保存。

1.jpg

2.配置時(shí)鐘

配置時(shí)鐘我們?nèi)匀恍枰褂肅UBEMX工具,我目前要使用的PWM是A0引腳,將A0設(shè)置為TIM2的通道1

1.jpg

然后選擇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的最下面

1.jpg

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)

1.jpg

4.修改調(diào)用

打開drivers 里的 drv_pwm.c 找到 stm32_hw_pwm_init這個(gè)函數(shù),在TIM初始化之前初始化以下時(shí)鐘引腳。

在圖里所示的位置調(diào)用這個(gè)函數(shù)。

HAL_TIM_OC_MspInit(tim);

1.jpg

5.配置PWM通道

這時(shí)候PWM的驅(qū)動(dòng)就已經(jīng)做好了,打開board.h ,打開需要使用的PWM通道
比如你使用的是TIM1,就是 pwm1, 通道同理。

#define BSP_USING_PWM2
#define BSP_USING_PWM2_CH1

1.jpg

6.保存編譯

這時(shí)候我們需要使用的驅(qū)動(dòng)已經(jīng)全部構(gòu)建完成了,接下來就使用RT-Thread的接口來完成用戶代碼吧。

五、用戶代碼

1.新建一個(gè).c文件來存放用戶代碼,名字隨便起,我放在了applications里,文件格式一定要加.c

1.jpg

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

1.jpg

可以看到help 顯示的命令, pwm_test就是我們剛才用戶代碼的命令,

1.jpg

然后我用邏輯分析儀抓一下 PWM波形,應(yīng)該是50%占空比。

1.jpg

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5057

    瀏覽量

    212170
  • RCC
    RCC
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

    26806
  • PWM波
    +關(guān)注

    關(guān)注

    0

    文章

    99

    瀏覽量

    16791
  • STM32單片機(jī)
    +關(guān)注

    關(guān)注

    58

    文章

    549

    瀏覽量

    58465
  • STM32L4
    +關(guān)注

    關(guān)注

    1

    文章

    42

    瀏覽量

    9350
  • RTThread
    +關(guān)注

    關(guān)注

    7

    文章

    132

    瀏覽量

    40683
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    手把手教你學(xué)單片機(jī)之AVR入門視頻教程

    `手把手教你學(xué)單片機(jī)之AVR入門視頻教程AVR單片機(jī)軟硬件設(shè)計(jì)視頻教程-入門篇本視頻是 力天電子 尹延輝 錄制的 詳情請(qǐng)登 力天電子第01講-單片機(jī)
    發(fā)表于 03-02 11:04

    手把手教你學(xué)單片機(jī)c語言》視頻教程

    `《手把手教你學(xué)單片機(jī)C語言》視頻教程電驢、優(yōu)酷、迅雷等下載地址《手把手教你學(xué)單片機(jī)c語言》視頻
    發(fā)表于 10-26 14:14

    力天手把手教你學(xué)單片機(jī)視頻全集下載

    .rarhttp://115.com/file/e7fv6828#17.第九講.輸出型外設(shè)與51的IO口上--力天手把手教你學(xué)單片機(jī)之實(shí)戰(zhàn)篇.rarhttp://115.com/fil
    發(fā)表于 02-14 17:06

    手把手教你單片機(jī)

    小宋老師單片機(jī)教程手把手教你單片機(jī) 鏈接: http://pan.baidu.com/s/1kTvEOo3 密碼: vzox
    發(fā)表于 12-07 17:59

    手把手教你學(xué)CPLD/FPGA與單片機(jī)聯(lián)合設(shè)計(jì)》-周興華

    作者從2009年1月起,在《電子世界》雜志上連載了《手把手教你學(xué)CPLD/FPGA設(shè)計(jì)》講座。《手把手教你學(xué)CPLD/FPGA與單片機(jī)聯(lián)合設(shè)
    發(fā)表于 12-29 17:10

    手把手教你實(shí)戰(zhàn)RT-Thread Nano,不信都這樣了你還不會(huì)

    手把手教你實(shí)戰(zhàn)RT-Thread Nano,不信都這樣了你還不會(huì)
    發(fā)表于 11-23 10:30

    手把手教你學(xué)STM32單片機(jī)

    整理資料來源【正點(diǎn)原子】 手把手教你學(xué)STM32單片機(jī)教學(xué)視頻 嵌入式 之 F103-基于新戰(zhàn)艦V]NANO_STM32F103開發(fā)指南-H
    發(fā)表于 08-19 07:08

    手把手教你學(xué)習(xí)FPGA—LED篇

    電子專業(yè)單片機(jī)相關(guān)知識(shí)學(xué)習(xí)教材資料——手把手教你學(xué)習(xí)FPGA—LED篇
    發(fā)表于 08-08 17:19 ?0次下載

    手把手教你學(xué)LabVIEW視覺設(shè)計(jì)

    手把手教你學(xué)LabVIEW視覺設(shè)計(jì)手把手教你學(xué)LabVIEW視覺設(shè)計(jì)手把手教你學(xué)LabVIEW視
    發(fā)表于 03-06 01:41 ?2991次閱讀

    手把手教你學(xué)會(huì)AVR單片機(jī)pdf.01

    手把手教你學(xué)會(huì)AVR單片機(jī)pdf.01
    發(fā)表于 09-30 17:33 ?0次下載

    手把手教你學(xué)會(huì)AVR單片機(jī)pdf.02

    手把手教你學(xué)會(huì)AVR單片機(jī)pdf.02
    發(fā)表于 09-30 17:34 ?0次下載

    手把手教你學(xué)會(huì)AVR單片機(jī)pdf.03

    手把手教你學(xué)會(huì)AVR單片機(jī)pdf.03
    發(fā)表于 09-30 17:36 ?0次下載

    手把手教你學(xué)會(huì)AVR單片機(jī)pdf.04

    手把手教你學(xué)會(huì)AVR單片機(jī)pdf.04
    發(fā)表于 09-30 17:37 ?0次下載

    手把手教你學(xué)會(huì)AVR單片機(jī)pdf.05

    手把手教你學(xué)會(huì)AVR單片機(jī)pdf.05
    發(fā)表于 09-30 18:19 ?0次下載

    手把手教你開發(fā)基于單片機(jī)的wifi通信的物聯(lián)網(wǎng)項(xiàng)目(遠(yuǎn)程燈控制)

    手把手教你開發(fā)基于單片機(jī)的wifi通信的物聯(lián)網(wǎng)項(xiàng)目(遠(yuǎn)程燈控制)
    發(fā)表于 11-12 19:36 ?18次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>開發(fā)基于<b class='flag-5'>單片機(jī)</b>的wifi通信的物聯(lián)網(wǎng)項(xiàng)目(遠(yuǎn)程燈控制)