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进行宏定义,如下图所示: