手把手教你基于RT-Thread Studio 使用STM32单片机的PWM外设

一、使用说明

目前我使用的是STM32L475系列单片机,是ali当时在PDD 50块钱卖的一个开发板,其他STM32单片机参考即可,这里会手把手教大家基于RTT Studio 来使用PWM。
工程链接奉上,Gitee链接

二、创建工程

1. 创建工程

首先大家打开RT-Thread Studio 来基于单片机创建工程。点击左上角文件,新建 RT-Thread项目
Project name就是项目名称,如果大家想自定义路径保存,就取消掉缺省位置然后自定义路径。
image.png

2. 芯片参数设置

选择基于芯片,下面的参数需要大家根据自己的主板来选择,我这个板子 使用LPUART作为CMD输出,单片机型号,下载器比如JLINK或者STLINK等等都需要自己适配开发板。
image.png

3. 下载设置

创建项目完成后大家可以先编译后下载进开发板测试一下 CMD的输出。
这里可以开启下载后自动软件复位。
image.png

4. 编译 下载

大家在编译后就可以尝试下载。
image.png
我使用的工具是XShell,可以看到复位后有启动log输出,就正常啦。
image.png

三、修改时钟并配置串口

在创建工程的时候,RT-Thread Studio 默认使用的是内部低俗时钟,我们需要更改到外部高速时钟来提高MCU工作性能,后面PWM 的时钟外设也使用的是外部高速时钟。

1. 打开CUBEMX

双击工程中的CUBEMX图标,可以打开cubemx,如果没有安装请自行安装。
image.png

2. 打开高速时钟

打开CUBEmx的 System Core,选择RCC配置,将HSELSE均设置为Crystal/Ceramic Resonator,然后点击左上角文件保存。

image.png

3. 配置时钟树

打开 Clock Configuration
image.png
锁相环PLL选择HSE,然后Clock Mux选择PLLCLK,PLLM数值选择合适的数值,这个一般都有参考,每种单片机时钟频率不同,大家可以搜索对应的时钟树设置。
image.png

4. 打开LPUART

因为在创建工程时,默认打开了LPUART,但是使用cubemx获取代码后,LPUART是关闭的,我们需要重新打开LPUART。
image.png

首先在右侧选择 PB10与PB11 为LPUART外设,然后在左侧 Connectivity -LPUART外设中将Mode选择为Asynchronous 模式,就已经成功打开了。

5. 获取代码

首先点击左上角文件 选择Save Project,然后点击右上角 Generate Code,代码获取完成后就可以关闭CubeMX了。

6. 修改时钟定义

刚才Cubemx已经帮我们生成了时钟代码,但是代码需要我们手动加入到 BSP中,找到cubemx 里的src 然后打开main.c文件。
image.png
然后将 void SystemClock_Config(void) 这个函数内容复制到 drivers里的 drv_clk.c 文件中 void system_clock_config(void)
image.png

7. 编译下载

这时候时钟已经修改完成了,可以编译下载应该是没有错误的。
有一个reboot的调用警告,这是因为目前FINSH_FUNCTION_EXPORT_ALIAS 这个函数已经没有调用了,
image.png

MSH_CMD_EXPORT(reboot, Reboot System);

将这句代码替换掉上面的 FINSH_FUNCTION_EXPORT_ALIAS 即可。

四、配置PWM

1. 使能PWM

首先打开RT-Thread Settings 打开PWM驱动。
image.png

选择组件,设备驱动程序,使能PWM,然后点击左上角保存。
image.png

image.png

2. 配置时钟

配置时钟我们仍然需要使用CUBEMX工具,我目前要使用的PWM是A0引脚,将A0设置为TIM2的通道1

image.png

然后选择Timers 的TIM2 将通道1 设置为 比较输出模式。然后点击左上角保存,右上角获取代码。

3. 修改驱动

这时候 CUBEMX已经帮我们生成了需要使用的代码,我们还需要将它修改到BSP里。
打开 cubemx的src文件夹,打开stm32l4xx_hal_msp.c,将以下三个函数的实现全部剪贴到drivers的board.c的最下面
image.png

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)

image.png

4. 修改调用

打开drivers 里的 drv_pwm.c 找到 stm32_hw_pwm_init这个函数,在TIM初始化之前初始化以下时钟引脚。
在图里所示的位置调用这个函数。

HAL_TIM_OC_MspInit(tim);

image.png

5. 配置PWM通道

这时候PWM的驱动就已经做好了,打开board.h ,打开需要使用的PWM通道
比如你使用的是TIM1,就是 pwm1, 通道同理。

#define BSP_USING_PWM2
#define BSP_USING_PWM2_CH1

image.png

6. 保存编译

这时候我们需要使用的驱动已经全部构建完成了,接下来就使用RT-Thread的接口来完成用户代码吧。

五、用户代码

1. 新建一个.c文件来存放用户代码,名字随便起,我放在了applications里,文件格式一定要加.c

image.png

2. PWM相关API

1. 查找设备

rt_device_t rt_device_find(const char* name);

这个API会返回设备句柄

2. 设置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 <rtthread.h>
#include <rtdevice.h>

//设置log文件
#define DBG_TAG "pwm_test.c"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>


#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 \t\n");
        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
image.png

可以看到help 显示的命令, pwm_test就是我们刚才用户代码的命令,
image.png

输入命令后LOG会提示 PWM Init is ok
image.png

然后我用逻辑分析仪抓一下 PWM波形,应该是50%占空比。
image.png

六、总结

RT-Thread的驱动代码框架用起来非常简单,比标准库开发起来好用很多,外设学习完就继续学习内核,手把手系列教程也会继续更新呦。

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学习DSP(数字信号处理)是一个复杂又有趣的过程,有许多资源可供选择。而其中一种资源是基于TMS320C55x的光盘资料,可以帮助你逐步学习和掌握DSP的技能。下面是我对使用这种资料进行学习的建议: 首先,确保你具备一定的数学基础,特别是在信号处理和算法方面。这将帮助你更好地理解DSP的原理和算法。 光盘资料通常提供了一个系统的学习路径,从基础知识开始逐步深入。按照这样的顺序进行学习可以确保你不会遗漏任何重要的概念。 光盘通常提供了一些示例代码以及对应的解释。通过仔细阅读和理解这些代码,你可以学习到如何使用TMS320C55x的指令集和工具来实现各种信号处理算法。 尝试自己编写一些简单的代码来实现光盘资料中的示例算法。通过自己动手实践,你能更好地掌握这些概念和技能。 如果你遇到困难或者有任何疑问,不要犹豫,寻求帮助。你可以通过光盘资料提供的论坛或者社区向其他学习者和专业人士请。此外,还可以参考其他书籍、程和在线资源,进一步加深理解。 最后,保持耐心和坚持。学习DSP需要时间和努力,不要轻易放弃。通过光盘资料和其他学习资源,你会逐渐掌握TMS320C55x的使用和DSP的核心概念。 总之,通过使用基于TMS320C55x的光盘资料,你可以以系统和有序的方式学习DSP。遵循资料提供的学习路径,尝试编写代码,寻求帮助,并保持耐心和坚持,你将能够掌握这一令人激动的技能。 ### 回答2: 学习DSP (数字信号处理) 需要具备一定的理论基础和实践经验。借助光盘资料上提供的基于TMS320C55x的学内容,我将简要介绍手把手学习DSP的步骤和过程。 首先,根据光盘资料提供的学介绍,了解TMS320C55x的基本原理和架构。该芯片是一种高性能的DSP处理器,具有出色的运算能力和多媒体处理功能。理解其体系结构以及寄存器结构是学习的第一步。 接下来,光盘资料上会提供一些示例代码和实验项目。这些代码和项目是基于TMS320C55x的典型应用案例,可以帮助我们更好地理解和巩固所学知识。通过仔细分析这些代码和项目,我们可以学习如何设计和实现DSP算法。 然后,我们可以开始手动编写程序。光盘资料上应该会提供编程工具和开发环境。使用这些工具和环境,我们可以编写和调试自己的DSP程序。在此过程中,需要逐步学习DSP算法和优化技巧,以提高程序的性能和效率。 此外,光盘资料上可能还包含一些实验指导。通过这些实验,我们可以通过实际操作来加深对DSP原理和应用的理解。在实验过程中,要注意记录和分析实验结果,从而不断优化和改进自己的程序。 最后,持续学习和实践是掌握DSP的关键。光盘资料可能不会涵盖所有的内容,因此我们需要通过阅读材、参考资料和在线资源来持续学习。同时,通过自己的实践和项目经验,我们可以掌握更深入的DSP知识和技能。 总之,学习DSP是一个逐步深入的过程,只有通过理论学习和实践经验的结合,才能真正掌握这一领域的知识和技能。光盘资料提供了一个全面而系统的学习框架,但我们自身的努力和坚持才是学习成功的关键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值