0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32L475使用PWM输出波形

GReq_mcu168 来源:CSDN技术社区 作者:CSDN技术社区 2020-10-09 14:14 次阅读

本文描述了如何在搭载了 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
    PWM
    +关注

    关注

    114

    文章

    4888

    浏览量

    209864
  • 输出波形
    +关注

    关注

    0

    文章

    16

    浏览量

    8887

原文标题:STM32 上使用 PWM

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    stm32l475 ADC采集失效的原因有哪些?

    stm32l475 ADC采集失效问题求助
    发表于 04-11 07:38

    STM32L475开发指南-RT-Thread例程_V1.1

    STM32L475开发指南-RT-Thread例程_V1.1
    发表于 05-05 09:07

    STM32L475开发指南-裸机例程_V1.1

    STM32L475开发指南-裸机例程_V1.1
    发表于 05-05 09:08

    STM32L475开发指南-裸机例程_V1.1

    STM32L475开发指南-裸机例程_V1.1
    发表于 07-22 19:11

    如何在搭载了RT-Thread操作系统的平台上使用PWM输出波形

    本文描述了如何在搭载了 RT-Thread 操作系统的平台上使用 PWM 输出波形,包括 PWM 的应用、配置和驱动的添加等。并给出了在正点原子 S
    发表于 03-30 07:07

    如何在搭载RT-Thread操作系统的平台上使用PWM输出波形

    本文描述了如何在搭载了 RT-Thread 操作系统的平台上使用 PWM 输出波形,包括 PWM 的应用、配置和驱动的添加等。并给出了在正点原子 S
    发表于 08-24 07:33

    STM32L475开发板支持的串口模式及特征是什么?

    STM32L475开发板支持的串口模式及特征是什么?UART初始化结构体的定义是什么?
    发表于 12-13 07:25

    STM32L475低功耗实例分享

    1.项目背景MCU:STM32L475外部AD:ADS1220外部RTC:DS3231扩展Flash:sst25vf016b外部SDUSB温湿度计4852.目标MCU运行在低功耗模式,每1小时读取
    发表于 02-11 07:17

    stm32l475多个串口的中断优先级大小在哪里设置?

    使用了stm32l475多个串口,是在哪里配置的各个串口的中断优先级大小呀?默认是设置的什么呀,可以改吗?
    发表于 03-23 14:27

    请问目前是否增加了对stm32L475低功耗串口的驱动代码呢

    背景我使用的mcu 为stm32L475,其中有一组串口为低功耗串口lpuart1。bug在stm32l475中,低功耗串口lpuart1和uart1 是两组不同的串口,目前无法根绝串口名称成功打开低功耗串口lpuart1。请问目前是否增加了对低功耗串口的驱动代码呢?
    发表于 08-05 10:15

    如何利用STM32L475开发板去处理定时器捕获模块应用程序

    我想在捕获模块上进行测试,以找出实际应用中定时器引脚处到达脉冲的脉冲宽度。所以,在这里我想要一个 STM32L475 的开发板来处理这个应用程序,比如从一个定时器 PWM 生成脉冲并循环回另一个定时器捕获模块。你能帮我们找到开发板吗?我在网上找不到更好的东西。
    发表于 12-23 09:08

    如何设置STM32L475中的EOC标志呢?

    附图中显示了stm32L475参考手册的描述。这里,它显示 EOC 标志被 SW 设置为清除。我们可以清除标志,但 SW 如何设置 EOC 标志。我怀疑这是文档中的错误。任何人都可以帮助我,不管我是对还是错?
    发表于 12-28 08:23

    STM32L475物联网套件编译错误是何原因?如何解决呢?

    我刚得到一个 stm32L475 物联网套件。编译后,我得到了这个错误。st-flash 1.7.0-23-ga9adf9c2021-05-21T22:17:24 INFO common.c
    发表于 01-03 11:05

    使用X-CUBE-NFC3与STM32L475定制板和SPI2而不是SPI1?

    在我第一次涉足 STM32 世界时,我一直在尝试使用 STM32L475 和 ST25R95 定制板读取 nfc 标签。我花了一段时间才习惯 CUBE IDE,因为多次包含库会导致错误,特别是因为我
    发表于 02-06 06:52

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南
    发表于 02-22 18:23 7次下载
    RT-Thread文档_RT-Thread 潘多拉 <b class='flag-5'>STM32L475</b> 上手指南