RT-Thread Studio 输出PWM详细教程

本文详细介绍了如何在STM32微控制器上配置PWM功能。通过四个步骤指导读者完成PWM驱动框架的支持设置、宏定义修改、初始化函数移植及外设支持配置。特别关注了STM32CudeMX工具的应用及HAL库的定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/** 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
 *
 */

这是官方给的标准步骤,我按照这个步骤进行了好几遍都没有成功,错误每次都是几十个,(也可能是我自己的问题),下面我分享下我成功的步骤。
STEP 1:
在RT-Thread Settings中使能PWM设备。
使能pwm
STEP 2:
注释掉board.h中关于PWM的宏定义。

#define BSP_USING_PWM1     //你所使用的PWM   
/*#define BSP_USING_PWM2*/
/*#define BSP_USING_PWM3*/
#define BSP_USING_PWM1_CH1    //你使用的通道

STEP 3:
使用STM32CudeMX生成stm32f1xx_hal_msp.c文件。
在这里插入图片描述
文件位于Src文件夹下,打开文件我们复制HAL_TIM_MspPostInit函数到drv_pwm.c文件下

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(htim->Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspPostInit 0 */
  /* USER CODE END TIM1_MspPostInit 0 */
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**TIM1 GPIO Configuration    
    PA8     ------> TIM1_CH1 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM1_MspPostInit 1 */

  /* USER CODE END TIM1_MspPostInit 1 */
  }
}

在drv_pwm.c文件下修改一处

static void pwm_get_channel(void)
{
#ifdef BSP_USING_PWM1_CH1
    stm32_pwm_obj[PWM1_INDEX].channel |= 1 << 0;
    __HAL_RCC_TIM1_CLK_ENABLE(); //修改处使能定时器时钟
#endif

STEP 4:
打开pwm_config.h文件,参照给的例子添加。默认是没有TIM1的。

#ifdef BSP_USING_PWM1
#ifndef PWM1_CONFIG
#define PWM1_CONFIG                             \
    {                                           \
       .tim_handle.Instance     = TIM1,         \
       .name                    = "pwm1",       \
       .channel                 = 0             \
    }
#endif /* PWM1_CONFIG */

#endif /* BSP_USING_PWM2 */
#ifdef BSP_USING_PWM2
#ifndef PWM2_CONFIG
#define PWM2_CONFIG                             \
    {                                           \
       .tim_handle.Instance     = TIM2,         \
       .name                    = "pwm2",       \
       .channel                 = 0             \
    }
#endif /* PWM2_CONFIG */
#endif /* BSP_USING_PWM2 */

最后打开stm32f1xx_hal_conf.h

/*#define HAL_SRAM_MODULE_ENABLED   */
#define HAL_TIM_MODULE_ENABLED   //取消注释
#define HAL_UART_MODULE_ENABLED
/*#define HAL_USART_MODULE_ENABLED   */
/*#define HAL_WWDG_MODULE_ENABLED   */
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值