【Rt-Thread】STM32输出PWM

1 实验目标

STM32输出不同频率的占空比为50%的PWM信号,控制蜂鸣器音调

2 硬件部分

2.1 模块介绍

(1)主控芯片 F405RGT6
(2)蜂鸣器 低电平触发

【Rt-Thread】STM32输出PWM

2.2 接线方式

STM32F405RGT6 蜂鸣器 JLINK下载器
3.3V VCC(或不接) 3.3V
GND GND GND
PA11(输出PWM信号) I/O(或蜂鸣器正极)
PA14 SWCK
PA13 SWIO

3 软件部分

3.1 软件介绍

(1)Rt-Thread Studio

【Rt-Thread】STM32输出PWM

(2) STM32CubeMX

【Rt-Thread】STM32输出PWM

4 实验步骤

4.1 新建Rt-Thread工程

(1)依次选择文件-------新建----------RT-Thread 项目
【Rt-Thread】STM32输出PWM

(2)按要求选择自己的芯片型号,这里使用STM32F405RG,其余默认

【Rt-Thread】STM32输出PWM

(3)在applications鼠标右键新建文件夹,命名为pwm_output,并选中文件夹鼠标右键新增pwm_output.c文件

【Rt-Thread】STM32输出PWM

(4) 在pwm_output.c文件中插入以下源码

/*
 * Copyright (c) 2006-2020, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2020-11-12     BROSY       the first version
 */


#include <rtdevice.h>
#include <rtthread.h>
#include <drv_common.h>
// #define DBG_ENABLE
#define DBG_TAG     "pwm"
#define DBG_LEVEL            DBG_LOG
#define DBG_COLOR
#include <rtdbg.h>
#define T (1000000000) /* 输出周期(1s), 频率1 */

#define PWM_DEV_NAME        "pwm1"  /* PWM设备名称 */
#define PWM_DEV_CHANNEL     4       /* PWM通道 */

#define LED GET_PIN(C, 9)

struct rt_device_pwm *pwm_dev;      /* PWM设备句柄 */

static rt_thread_t tid1 = RT_NULL;  /* PWM输出线程 */

/**
 * @brief 初始化PWM
 */
static void pwm_init()
{
    rt_pin_mode(LED, PIN_MODE_OUTPUT);

    /* 查找设备 */
    pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
    if (pwm_dev == RT_NULL)
    {
        rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
    }

    rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
}


/**
 * @brief 循环输出1.11kHz、1.25kHz、1.67kHz、5kHz脉冲信号
 * @brief 周期为400ms,每个频率的信号的持续时间为100ms
 */
static void pwm_output_entry(void *parameter)
{
    rt_uint32_t freq1 = 1111;
    rt_uint32_t freq2 = 1250;
    rt_uint32_t freq3 = 1666;
    rt_uint32_t freq4 = 5000;
    rt_uint32_t period = 0;
    rt_uint32_t pulse  = 0;

    pwm_init();

    while(1)
    {
        period = T/freq1;    /* 周期 */
        pulse  = period*0.5; /* 占空比 */
        rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); /* 输出PWM */
        rt_thread_mdelay(100);

        period = T/freq2;
        pulse  = period*0.5;
        rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
        rt_thread_mdelay(100);

        period = T/freq3;
        pulse  = period*0.5;
        rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
        rt_thread_mdelay(100);

        period = T/freq4;
        pulse  = period*0.5;
        rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
        rt_thread_mdelay(100);
    }

}


static int pwm_output_sample(void)
{
    tid1 = rt_thread_create("pwm_out",
            pwm_output_entry, RT_NULL,
            1024, 25, 10);

    if (tid1 != RT_NULL)
        rt_thread_startup(tid1);

        return 0;
}

/* 初始化 */
INIT_APP_EXPORT(pwm_output_sample);


(5)打开CubeMX新建工程,配置TIM1 CH4 输出PWM,并配置输出工程属性,生成代码。

【Rt-Thread】STM32输出PWM
【Rt-Thread】STM32输出PWM
【Rt-Thread】STM32输出PWM

(6)打开stm32f4xx_hal_msp.c,复制下面几个函数

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm)

【Rt-Thread】STM32输出PWM

打开Rt-Thread studio drivers文件夹下面的drv_pwm.c文件,将函数粘贴在extern下面
【Rt-Thread】STM32输出PWM

(7)在board.h中加入如下代码

#define BSP_USING_PWM1
#define BSP_USING_PWM1_CH4

【Rt-Thread】STM32输出PWM

(8)在pwm_config.h中加入如下代码

#ifdef BSP_USING_PWM1
#ifndef PWM1_CONFIG
#define PWM1_CONFIG                             \
    {                                           \
       .tim_handle.Instance     = TIM1,         \
       .name                    = "pwm1",       \
       .channel                 = 0             \
    }
#endif /* PWM1_CONFIG */
#endif /* BSP_USING_PWM1 */

【Rt-Thread】STM32输出PWM
(9)启用PWM设备驱动,勾选使用PWM设备驱动ctrl+s保存
【Rt-Thread】STM32输出PWM
【Rt-Thread】STM32输出PWM

(10)打开stm32f4xx_hal_conf.h文件,取消HAL_TIM_MODULE_ENABLED注释
【Rt-Thread】STM32输出PWM

(11)连接开发板,先编译成功后下载
【Rt-Thread】STM32输出PWM

5 实验现象

蜂鸣器循环发出四种不同音调

6 总结

  • 主要记录了Rt-Thread 中STM32 输出PWM配置过程
  • 主要函数:
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);

period控制信号周期(频率),周期单位为纳秒(ns)
pulse为每个周期输出高电平的时间,控制PWM占空比,大小为0~period

上一篇:【数据与封装格式】YUV和RGB


下一篇:第1年8月1日 ios yuv pixelbuffer