第一步,在STM32cubeMX软件中开启定时器TIM14,对应的引脚为PF9,生成代码,将src中的HAL_TIM_Base_MspInit、HAL_TIM_MspPostInit函数拷贝到RT-Thread的board.c中,这里有个一号坑,stm32cubemx生产的函数为HAL_TIM_Base_MspInit,需将其改为HAL_TIM_PWM_MspInit才可正确初始化PWM的TIM。
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM14)
{
/* USER CODE BEGIN TIM14_MspInit 0 */
/* USER CODE END TIM14_MspInit 0 */
/* TIM14 clock enable */
__HAL_RCC_TIM14_CLK_ENABLE();
/* USER CODE BEGIN TIM14_MspInit 1 */
/* USER CODE END TIM14_MspInit 1 */
}
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(timHandle->Instance==TIM14)
{
/* USER CODE BEGIN TIM14_MspPostInit 0 */
/* USER CODE END TIM14_MspPostInit 0 */
__HAL_RCC_GPIOF_CLK_ENABLE();
/**TIM14 GPIO Configuration
PF9 ------> TIM14_CH1
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF9_TIM14;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
/* USER CODE BEGIN TIM14_MspPostInit 1 */
/* USER CODE END TIM14_MspPostInit 1 */
}
}
第二步,打开定时器使能,在stm32f4xx_hal_conf.h中找到#define HAL_TIM_MODULE_ENABLED,取消注释,
第三步,在RT-Thread Settings中打开PWM功能,
第四步,在board.h中定义PWM宏定义,例如我要使用PWM14,则添加PWM14,这里还有一个2号坑,必须得添加#define BSP_USING_PWM14_CH1宏定义,
第五步,在drv_pwm.c中添加PWM14_CH1的宏定义
第六步,打开 /drivers/include/config/pwm_config.h,对PWM14进行宏定义
编译成本后,下载到开发板,
第七步验证,通过串口控制台发送pwm_enable pwm14 1使能PWM14的通道1输出,发送pwm_set pwm14 1 5000 2500,使PWM输出占空比为50%的200kHz的方波信号。验证通过。