首页 > 其他分享 >【RTT-Studio】详细使用教程四:PWM输出控制

【RTT-Studio】详细使用教程四:PWM输出控制

时间:2024-07-19 08:58:54浏览次数:19  
标签:rt PWM define RTT Studio GPIO pwm RCC

文章目录

一、简介

本文将基于STM32F407VET6介绍,如何使用RT-Thread Studio开发环境下使用输出PWM波形。主要是使用RTT自带的PWM设备进行编写的驱动函数,更加快捷便利。


二、RTT时钟配置

由于使用RTT生成的工程默认使用的是系统内部时钟,便于我们对时间的控制,所以通常会使用外部时钟,因此需要对工程中的时钟进行更改,更改内容如下:

  • 打开RT-Thread Studio软件新建基于芯片的项目,并使用外部时钟系统。
  • 在drv_clk.c文件中添加时钟配置函数,并且注释内部时钟的调用。
/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    /** Configure the main internal regulator output voltage
     */
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    /** Initializes the CPU, AHB and APB busses clocks
     */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLM = 4;
    RCC_OscInitStruct.PLL.PLLN = 168;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    RCC_OscInitStruct.PLL.PLLQ = 4;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }

    /** Initializes the CPU, AHB and APB busses clocks
     */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
            | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
    {
        Error_Handler();
    }
}

void clk_init(char *clk_source, int source_freq, int target_freq)
{
//    system_clock_config(target_freq);
    SystemClock_Config();
}


三、PWM初始化配置

1.打开PWM驱动框架
在RT-Thread Setting 中借助图形化配置工具打开PWM的驱动框架,如下图所示:
在这里插入图片描述

2.定义PWM宏定义
在board.h文件中添加pwm的宏定义,从而保证能够使用pwm的相关驱动函数。

/*-------------------------- PWM CONFIG BEGIN --------------------------*/

/** if you want to use pwm you can use the following instructions.
 *
 * STEP 1, open pwm driver framework support in the RT-Thread Settings file
 *
 * STEP 2, define macro related to the pwm
 *                 such as     #define BSP_USING_PWM1
 *
 * STEP 3, copy your pwm timer init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end if board.c file
 *                 such as     void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)  and
 *                             void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
 *
 * STEP 4, modify your stm32xxxx_hal_config.h file to support pwm peripherals. define macro related to the peripherals
 *                 such as     #define HAL_TIM_MODULE_ENABLED
 *
 */

#define BSP_USING_PWM12
#define BSP_USING_PWM12_CH2
#endif

/*-------------------------- PWM CONFIG END --------------------------*/

3.编写DAC初始化代码
可以使用STM32CubeMx自动生成代码,使能PWM12定时器。

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

    if(tim_baseHandle->Instance==TIM12)
    {
        /* TIM12 clock enable */
        __HAL_RCC_TIM12_CLK_ENABLE();
    }
}


void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if(timHandle->Instance==TIM12)
    {
        __HAL_RCC_GPIOB_CLK_ENABLE();
        /**TIM12 GPIO Configuration
        PB15     ------> TIM12_CH2
        */
        GPIO_InitStruct.Pin = GPIO_PIN_15;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        GPIO_InitStruct.Alternate = GPIO_AF9_TIM12;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    }
}

4.打开STM32宏定义
在driver中的stm32f4xx_hal_conf.h中PWM和定时器宏定义打开。
在这里插入图片描述


四、驱动代码编写

1.pwm.c
主要包含一个函数,该函数是设置PWM的参数,主要是频率和占空比,可以增加频率和占空比的设置范围

#include "pwm.h"


/**
 * @brief 设置PWM的参数
 * @param fre 频率 0-999
 * @param duty 占空比 0-100
 * @return
 */
int set_pwm_param(rt_uint32_t fre, rt_uint32_t duty)
{
    rt_uint32_t period, pulse;

    if ((fre < 0 && fre > 1000) && duty > 0)
    {
        rt_kprintf("set param error...\n");
        return -RT_ERROR;
    }
    else
    {
        if (duty >= 100)
        {
            duty = 100;
        }
    }

    period = 1000000000 / fre;                 /* 周期为0.5ms,单位为纳秒ns */
    pulse = period * duty / 100;               /* PWM脉冲宽度值 */

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

    return 0;
}

2.pwm.h

#ifndef APPLICATIONS_INC_PWM_H_
#define APPLICATIONS_INC_PWM_H_

#include <rtthread.h>
#include <rtdevice.h>

#if 1
#define PWM_DEV_NAME        "pwm12"     // PWM设备名称
#define PWM_DEV_CHANNEL     2           // PWM通道

#define PWM_GPIO_PORT   GPIOB           // pwm端口号 -- TIM12_CH2
#define PWM_GPIO_PIN    GPIO_PIN_15     // pwm引脚号
#else
#define PWM_DEV_NAME        "pwm3"     // PWM设备名称
#define PWM_DEV_CHANNEL     2           // PWM通道

#define PWM_GPIO_PORT   GPIOA           // pwm端口号 -- TIM3_CH2
#define PWM_GPIO_PIN    GPIO_PIN_7      // pwm引脚号
#endif

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

extern int set_pwm_param(rt_uint32_t fre, rt_uint32_t duty);

#endif /* APPLICATIONS_INC_PWM_H_ */

3.main.c
主要是设置PWM的输出频率和占空比,然后进行PWM的输出。

#include <rtthread.h>
#include <drv_common.h>
#include "pwm.h"

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

#define ID  GET_PIN(E, 12)

int main(void)
{
    int count = 1;

    rt_pin_mode(ID, PIN_MODE_OUTPUT);

    set_pwm_param(500, 50);

    while (count)
    {
        rt_pin_write(ID, RESET);
        rt_thread_mdelay(1000);
        rt_pin_write(ID, SET);
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

五、测试验证

通过示波器可以观察到输出的波形,设置的输出频率为:500Hz,输出的占空比为:50%,通过观察波形,可以看到,输出的波形频率为:499.989Hz,输出占空比为50.0%,和测试结果相符,实验合格。测试波形如下:
在这里插入图片描述

标签:rt,PWM,define,RTT,Studio,GPIO,pwm,RCC
From: https://blog.csdn.net/Hei_se_meng_yan/article/details/140532040

相关文章

  • 【译】使 Visual Studio 更加可视化
    任何Web、桌面或移动开发人员都经常使用图像。你可以从C#、HTML、XAML、CSS、C++、VB、TypeScript甚至代码注释中引用它们。有些图像是本地的,有些存在于线上或网络共享中,而其他图像可能仅以base64编码字符串的形式存在。我们在代码中以多种方式引用它们,但总是作为字符串......
  • 将DevEcoStudio进行汉化
    1、点击最上方菜单栏中的file,然后选择setting2、在弹出的窗口的左侧菜单栏中选择Plugins,然后在右侧选择Installed3、由于汉化插件已经给我们下载好了,所以直接在搜索框输入Chinese,然后勾选,点击Apply,之后点击ok4、然后选择Restart重启编译器即可5、再次进入后页面的内容......
  • [Xamarin] 在 Visual Studio 中使用 adb 连接本机 Mumu 模拟器
    官网https://mumu.163.com/操作步骤1.开启Mumu模拟器的【开发者模式】模式。2.在【问题诊断】中查看ADB端口号3.在VisualStudio中找到"Tools/Android/AndroidAdbCommandPrompt"4.使用命令监听端口adbtcpip163845.使用命令建立连接adbconn......
  • Visual Studio Community 2022美化
    说明:VS版本:VisualStudioCommunity2022背景美化【扩展】【管理扩展】搜索“ClaudiaIDE”,【下载】,安装完扩展要重启VS在wallhaven下载壁纸图片作为文本编辑器区域背景图片【工具】【选项】搜索ClaudiaIDE,修改【图片路径】和【透明度】主题美化同样,在【扩展】里安装Visua......
  • 浅谈Visual Studio 2022
    VisualStudio2022(VS2022)提供了众多强大的功能和改进,旨在提高开发者的效率和体验。以下是一些关键功能的概述:1264位支持:VS2022的64位版本不再受内存限制困扰,主devenv.exe进程不再局限于4GB,允许用户打开、编辑、运行和调试最大和最复杂的解决方案。内存和性能改进:核心调试器......
  • 【STM32】RTT-Studio中HAL库开发教程四:DAC+DMA输出波形
    文章目录一、DAC介绍二、HAL库配置初始化三、RTT中初始化四、测试验证一、DAC介绍1.DAC作用DAC(Digital-to-AnalogConverter),即为数字/模拟转换模块,又称D/A转换器;作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与ADC相反。即为输出波形和输出固定电压......
  • Visual Studio 2022下载安装教程c++
    文章目录VisualStudio安装教程一、官网下载二、安装三、配置四、VisualStudio2022使用教程VisualStudio安装教程一、官网下载下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/二、安装要是个人学习的活就下载社区版下载完成后是一个安......
  • JetBrains家族| Android Studio快捷键
    一、JetBrainsIDE(一)什么是IDE?IDE,IntegratedDevelopmentEnvironment(集成开发环境)        是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具,集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套......
  • Android Studio下载Gradle超时解决方案
    本文由ChatMoney团队出品AndroidStudio找到项目中gradle配置文件的路径,我的路径为/你的项目路径/gradle/wrapper/gradle-wrapper.properties,里面对应内容应该如下所示:#TueJun1116:15:13CST2024distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsdi......
  • Android Studio下载Gradle超时解决方案
    本文由ChatMoney团队出品AndroidStudio找到项目中gradle配置文件的路径,我的路径为/你的项目路径/gradle/wrapper/gradle-wrapper.properties,里面对应内容应该如下所示:#TueJun1116:15:13CST2024distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsdi......