#include "main.h" // 确保包含了所有必要的头文件 TIM_HandleTypeDef htim2; uint16_t dt; // 定义用于设置占空比的变量 // 初始化TIM2的PWM功能 static void MX_TIM2_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 16 - 1; // 预分频器设置 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式 htim2.Init.Period = 999; // PWM周期 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; 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; // PWM模式1 sConfigOC.Pulse = 500; // 初始占空比 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 高电平有效 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) { Error_Handler(); // PWM通道配置失败处理 } HAL_TIM_MspPostInit(&htim2); // 调用MspPostInit函数 } // 主函数 int main(void) { HAL_Init(); // 初始化HAL库 SystemClock_Config(); // 配置系统时钟(该函数应在其他地方定义) MX_GPIO_Init(); // 初始化GPIO(该函数应在其他地方定义) MX_TIM2_Init(); // 初始化TIM2 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4); // 启动PWM输出 while (1) { // 增加占空比 for (dt = 1; dt < 500; dt++) { __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, dt); // 设置占空比 HAL_Delay(1); // 延时1毫秒(注意:这里使用了HAL_Delay而不是delay_ms) } // 减少占空比 for (dt = 499; dt > 0; dt--) { __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, dt); // 设置占空比 HAL_Delay(1); // 延时1毫秒 } // 可以在这里添加其他用户代码 MX_APPE_Process(); // 假设这是你的应用处理函数 } } // 错误处理函数(应在其他地方定义) void Error_Handler(void) { // 用户可以在这里添加自己的错误处理代码 while (1) { // 停止在这里 } } // 其他必要的初始化函数(如SystemClock_Config和MX_GPIO_Init)应在其他地方定义
新建NUCLEO-WBA55MX工程,并设置好定时器的PWM输出功能:
设置好后,点击生成KEIL工程与版本目录:
配置PWM2通道4:
GPIO口为PA6:
PA6引脚连接图:
KEIL定时器2通道4使能: