Rtthread学习笔记(十一)RT-Thread Studio开启PWM输出

一、

1、配置RT-Thread Settings

Rtthread学习笔记(十一)RT-Thread Studio开启PWM输出_第1张图片
配置完毕记得保存配置

2、开启board.h及stm32xxxx_hal_config.h的宏定义

这里只需要先开启宏,函数复制看下面的步骤。
Rtthread学习笔记(十一)RT-Thread Studio开启PWM输出_第2张图片Rtthread学习笔记(十一)RT-Thread Studio开启PWM输出_第3张图片

3、复制PWM初始化函数

初始化相关的函数有两种获取方式,第一种可以使用stm32cube配置工程,然后打开工程的stm32f1xx_hal_msp.c和main.c进行复制;第二种可以打开RTThread源代码的板级支持包BSP进行复制,BSP中包含很多芯片的例程代码,但代码中是没有初始化全部的外设的,所以最好还是采用第一种方法。
需要复制的函数有:
1、void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim);//在stm32f1xx_hal_msp.c中,放在board.c最下面,也可自己分配位置
2、void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm);//在stm32f1xx_hal_msp.c中,放在board.c最下面,也可自己分配位置
3、static void MX_TIM2_Init(void);//main.c中,位置自己配置吧

第1、2个函数会被系统检索自动初始化,第3个函数需要用户主动初始化,放在mian函数中自己初始化吧,其中的有些内容会与后面初始化内容重复,但最终还是会以程序最后的配置为准,不影响使用。

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
{

  if(htim_pwm->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspInit 0 */

  /* USER CODE END TIM2_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_TIM2_CLK_ENABLE();
  /* USER CODE BEGIN TIM2_MspInit 1 */

  /* USER CODE END TIM2_MspInit 1 */
  }

}

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  if(htim->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspPostInit 0 */

  /* USER CODE END TIM2_MspPostInit 0 */
    /**TIM2 GPIO Configuration
    PA0-WKUP     ------> TIM2_CH1
    PA1     ------> TIM2_CH2
    PA2     ------> TIM2_CH3
    PA3     ------> TIM2_CH4
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM2_MspPostInit 1 */
  /* USER CODE END TIM2_MspPostInit 1 */
  }
}
TIM_HandleTypeDef htim2;
/* TIM2 init function */
static void MX_TIM2_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 72;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 1000;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 100;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }

  sConfigOC.Pulse = 200;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }

  sConfigOC.Pulse = 300;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  {
    Error_Handler();
  }

  sConfigOC.Pulse = 400;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_TIM_MspPostInit(&htim2);

}

Rtthread学习笔记(十一)RT-Thread Studio开启PWM输出_第4张图片
Rtthread学习笔记(十一)RT-Thread Studio开启PWM输出_第5张图片

4、初始化最终需要使用的PWM代码

RTThread关于PWM相关的部分已经开启完毕,接下来就是使用,使用系统带的接口函数进行操作,具体参照RT关于PWM章节RT官方PWM章节

#include 
#include 
#include 

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include 
static void MX_TIM2_Init(void);
/* PLEASE DEFINE the LED0 pin for your board, such as: PA5 */
#define LED0_PIN    GET_PIN(B, 0)

TIM_HandleTypeDef htim2;

#define PWM_DEV_NAME        "pwm2"  /* PWM设备名称 */
#define PWM_DEV_CHANNEL     3       /* PWM通道 */
struct rt_device_pwm *pwm_dev;      /* PWM设备句柄 */
rt_uint32_t period, pulse;

int main(void)
{
    int count = 1;
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
    
    MX_TIM2_Init();
    period = 5000;    /* 周期为5ms,单位为纳秒ns  period*pwm频率=1000000ns*/
    pulse = 1000;          /* PWM脉冲宽度值,单位为纳秒ns */
    /* 查找设备 */
    pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
    /* 设置PWM周期和脉冲宽度 */
    rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
    /* 使能设备 */
    rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);

    rt_pwm_set(pwm_dev, 4, period, pulse);
    rt_pwm_enable(pwm_dev, 4);

    while (count++)
    {
        /* set LED0 pin level to high or low */
        rt_pin_write(LED0_PIN, count % 2);
        LOG_D("Hello RT-Thread!");
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

Rtthread学习笔记(十一)RT-Thread Studio开启PWM输出_第6张图片

你可能感兴趣的:(RT-Thread,stm32)