基于Rt Thread的PWM驱动开发

基于RT Thread的PWM驱动开发

由于项目需要,在此记录下基于RTT的PWM驱动开发流程
本期项目将完成基于HAL的PWM驱动开发,实现脉冲个数控制,实现基于RTT框架下的PWM驱动开发

1.CUBEMX配置

TIM3配置如下

基于Rt Thread的PWM驱动开发_第1张图片

时钟配置如下

基于Rt Thread的PWM驱动开发_第2张图片

GPIO引脚配置如下

基于Rt Thread的PWM驱动开发_第3张图片

中断配置如下

基于Rt Thread的PWM驱动开发_第4张图片

生成工程

基于Rt Thread的PWM驱动开发_第5张图片

2.基于MDK的工程验证

需在启动时加入如下代码

  HAL_TIM_PWM_Start_IT(&htim3,TIM_CHANNEL_3);

这里的htim3,TIM_CHANNEL_3与CUBEMX对应,需修改为自己对应的管脚
基于Rt Thread的PWM驱动开发_第6张图片
基于Rt Thread的PWM驱动开发_第7张图片

实现脉冲个数控制

基于Rt Thread的PWM驱动开发_第8张图片
定义改回调函数即可实现脉冲个数控制

int count=0;
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM3)
	{
		if(count++>5){
			HAL_TIM_PWM_Stop_IT(&htim3,TIM_CHANNEL_3);
		}
	}
}

基于Rt Thread的PWM驱动开发_第9张图片

实现改变占空比

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  if(count++<400){
		  __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,count);
	  }else{
		count=0;
	  }
	  HAL_Delay(500);
  }

基于Rt Thread的PWM驱动开发_第10张图片

RT thread Studio工程配置

1.新建工程

基于Rt Thread的PWM驱动开发_第11张图片

2.setting 设置

基于Rt Thread的PWM驱动开发_第12张图片
编译第一把报错正常,接下来,逐个修改
基于Rt Thread的PWM驱动开发_第13张图片

在Board.h中删除注释定义
基于Rt Thread的PWM驱动开发_第14张图片
取消stm32f4xx_hal_conf.h中关于TIM的定义
基于Rt Thread的PWM驱动开发_第15张图片
复制MDK工程关于TIM的初始化函数到board.c中

基于Rt Thread的PWM驱动开发_第16张图片

在Board.c中添加TIM3的初始化函数

基于Rt Thread的PWM驱动开发_第17张图片

正式开始RTT PWM框架

/*
 * Copyright (c) 2006-2022, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2022-03-14     RT-Thread    first version
 */

#include 
#include 
#include 

struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
int pulse = 0;
int main(void)
{
    MX_TIM3_Init();

    pwm_dev = (struct rt_device_pwm *) rt_device_find("pwm3");
    if (pwm_dev == RT_NULL)
    {
        rt_kprintf("find pwm3 failed\n");
    }
    else
    {
        rt_kprintf("find pwm3 success\n");

        rt_pwm_set(pwm_dev, 3, 500000, 0); //PWM设置 通道3 period=500000(ns)  pulse=250000
        rt_pwm_enable(pwm_dev, 3); //启动PWM

    }

    while (1)
    {
        pulse += 15000;
        if (pulse < 500000)
        {

            rt_pwm_set(pwm_dev, 3, 500000, pulse);

        }
        else
        {
            pulse = 0;
        }
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

基于Rt Thread的PWM驱动开发_第18张图片

感谢以下开源资源的支持

rt thread PWM驱动框架

STM32CubeIDE 统计及控制PWM产生个数

RTTHREAD STUDIO PWM 配置

你可能感兴趣的:(RTT学习,STM32,HAL,单片机,驱动开发,stm32)