RT thread studio ---PWM应用呼吸灯(4)

目录

1、前言

2、PWM代码

3、结论


1、前言

本文目的:在RT Thread Studio中 PWM使用之呼吸灯

RT Thread Studio 版本:2.1.0 

原理图:

2、PWM代码

关于RT thread 的pwm介绍可以参考官网的手册:https://www.rt-thread.org/document/site/programming-manual/device/pwm/pwm/#pwm_1

大部分RT Thread设备的驱动在工程的drivers文件夹下board.h中可以找到它的调用说明,然后我们找到pwm的按照操作一步一步来。这里我led灯引脚为PA6,对应的是TIM3时钟的通道1,因此代码中设备名称"pwm3"对应的就是“TIM3”。

step1.在RT-Thread Settings中打开PWM设备驱动支持

step2.在board.h中定义#define BSP_USING_PWM3,同时这里还需要定义#define BSP_USING_PWM3_CH1(为什么要加,可以看drv_pwm.c文件中stm32_pwm_init函数中的pwm_get_channel,这里是向PWM结构体中添加TIM的通道 )

step3.在Cubmx中生成TIM3相应的代码,然后添加到board.c中

在生成的代码函数中找不到官方给的说明中的HAL_TIM_Base_MspInit函数,估计这里官方搞错了,我添加了如下两个函数HAL_TIM_PWM_MspInitHAL_TIM_MspPostInit

step4.在drivers文件夹下的stm32f1xx_hal_config.h中添加#define HAL_TIM_MODULE_ENABLED

到这里基本上就完成50%了,新建一个.c文件,单独开一个线程来点灯,这里的代码可以参考官网给的,下面是我参考之后改了一下。

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-05-09     35166       the first version
 */
#include <rtthread.h>
#include "board.h"
#include <rtdevice.h>

#define DBG_TAG "BLED"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

/**********线程优先级*********/
#define BLED_THREAD_PRIORITY     12

/**********PWM定义*********/
#define PWM_DEV_NAME        "pwm3"  /* PWM设备名称 */
#define PWM_DEV_CHANNEL      1      /* PWM通道 */

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

static void BLED_thread_entry(void *parameter)
{
    rt_uint32_t period, pulse, dir;

    period = 500000;    /* 周期为500000ns,频率为2kHz, 单位为纳秒ns */
    dir = 1;            /* PWM脉冲宽度值的增减方向 */
    pulse = 0;          /* PWM脉冲宽度值,单位为纳秒ns */

    /* 查找设备 */
    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);
        return RT_ERROR;
    }

    /* 设置PWM周期和脉冲宽度默认值 */
    rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
    /* 使能设备 */
    rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);

    while (1)
    {
        rt_thread_mdelay(10);
        if (dir)
        {
            pulse += 1000;      /* 从0值开始每次增加1000 */
        }
        else
        {
            pulse -= 1000;      /* 从最大值开始每次减少1000 */
        }

        if (pulse >= period)
        {
            dir = 0;
        }
        if (0 >= pulse)
        {
            dir = 1;
        }

        /* 设置PWM周期和脉冲宽度 */
        rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);

    }
}

static int BLED_Priority_temp(void)
{
    rt_thread_t BLED_thread;

    BLED_thread = rt_thread_create("BLED_thread",
                                      BLED_thread_entry,
                                      "BLED_thread",
                                      1024,
                                      BLED_THREAD_PRIORITY,
                                      20);
    if (BLED_thread != RT_NULL)
    {
        rt_thread_startup(BLED_thread);
    }

    return RT_EOK;
}
INIT_APP_EXPORT(BLED_Priority_temp);

3、结论

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值