RT-Thread Studio----STM32F107学习笔记3-- PWM配置

文章详细介绍了如何在STM32微控制器上使用RT-Thread操作系统配置PWM,包括在board.h中的宏定义,使用STM32CubeMX生成初始化函数,以及在HAL层的配置和驱动文件的修改。同时提到了针对不同定时器的特定配置步骤。
摘要由CSDN通过智能技术生成

1、根据board.h中PWM配置进行相应配置,如下图所示:

    1.1 打开“RT-Thread Settings”然后找到组件--》“设备驱动程序”--》将“使用PWM设备驱动程序”打开

    1.2 在board.h中定义PWM宏定义,例如我要使用PWM5,则添加PWM5,这里一个坑,除了需要添加提示的宏之外,还得添加#define BSP_USING_PWM5_CH4宏定义,如下图所示:     1.3 使用STM32CubeMx软件生成HAL_TIM_PWM_MspInit、HAL_TIM_MspPostInit函数代码,这里还有第二个坑,stm32cubemx生产的函数为HAL_TIM_Base_MspInit,需将其改为HAL_TIM_PWM_MspInit(有此函数则不需要修改直接复制即可)才可正确初始化PWM的TIM。如下图所示:

    1.4 打开生成的代码,在stm32f1xx_hal_msp.c找到 HAL_TIM_PWM_MspInit、HAL_TIM_MspPostInit函数,然后将其复制到board.c中最后即可,(注:在board.h中只提示添加HAL_TIM_PWM_MspInit函数,但除了添加此函数之外还需要添加HAL_TIM_MspPostInit函数才可配置PWM成功)如下所示:

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
{
  if(htim_pwm->Instance==TIM5)
  {
  /* USER CODE BEGIN TIM5_MspInit 0 */

  /* USER CODE END TIM5_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_TIM5_CLK_ENABLE();
  /* USER CODE BEGIN TIM5_MspInit 1 */

  /* USER CODE END TIM5_MspInit 1 */
  }

}

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

  /* USER CODE END TIM5_MspPostInit 0 */

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**TIM5 GPIO Configuration
    PA3     ------> TIM5_CH4
    */
    GPIO_InitStruct.Pin = 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 TIM5_MspPostInit 1 */

  /* USER CODE END TIM5_MspPostInit 1 */
  }

}

    1.5 打开定时器使能,在stm32f1xx_hal_conf.h中找到#define HAL_TIM_MODULE_ENABLED,取消注释,如下图所示:

2、编译,下载到开发板即可,以下代码以蜂鸣器为例子

#define PWM_DEV_NAME "pwm5"
#define PWM_DEV_CHANNEL4 4   //通道4
struct rt_device_pwm *pwm_dev ;

//TIM5_CH4

void beep_pwm_Config(void)
{
    rt_err_t res ;
    rt_uint32_t period , pulse  = 0 , dir = 0 ;

    period = 100000000;       //周期为100ms

    pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
    if(pwm_dev == RT_NULL)
    {
        LOG_E("rt_device_find [pwm] failed\n");
        return ;
    }

    //设置pwm周期和脉冲宽度调制
    //period:周期时间  单位为ns
    //pulse:脉冲宽度时间  单位为ns
    res = rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL4, period, pulse);
    if(res < 0)
    {
        LOG_E("rt_pwm_set failed\n");
        return ;
    }

    //使能设备
    rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL4);

    while(1)
    {

        if(!dir)
        {
            pulse += 1000000;      //从0开始每次增加5000ns
        }
        else {
            pulse -= 1000000;
        }
        if (pulse >= period) {
            dir = 1 ;
        }
        if(pulse == 0)
        {
            dir = 0 ;
        }

        //设置pwm周期和脉冲宽度
        rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL4, period, pulse);
        rt_thread_mdelay(100);
    }
}

注意:

 3、如果使用其他定时器,比如TIM14,在drv_pwm.c没有定义相关配置,则需要在drv_pwm.c添加相应配置,如下图所示:

 4、再打开 /drivers/include/config/pwm_config.h,对PWM14进行宏定义,如下图所示:

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值