一. 前言
二. CubeMX 配置
1. 定时器和 PWM 参数配置
![image-20210419123528498](https://i-blog.csdnimg.cn/blog_migrate/b182d08f0ac63edf631f80cacd91c569.png)
![image-20210419123553294](https://i-blog.csdnimg.cn/blog_migrate/4b2f4b3b0ec710e4e0da359bb30fe9cb.png)
2. 时钟配置
![image-20210419123607290](https://i-blog.csdnimg.cn/blog_migrate/9eeba86dad0ae642cfbbe19ed55a2c98.png)
三. 主要代码
1. 定义定时器控制类,及相关宏定义
/* code begin data type */
typedef struct
{
TIM_HandleTypeDef* htim;// 需要绑定的定时器句柄,如 htim1。
void (*startPWM_Output)(uint32_t channel);// 让定时器正向通道开始输出 PWM 的方法。
void (*stopPWM_Output)(uint32_t channel);// 让定时器正向通道停止输出 PWM 的方法。
void (*changePWM_DutyCycle)(uint16_t pause, uint32_t channel);// 改变定时器指定通道的 PWM 占空比。
}obj_tim_1;// 定时器 1 的控制类
/* code end data type */
2. 创建定时器控制类实例,并声明要实现的函数
/* code begin variable definition */
obj_tim_1 user_tim_1;// 定义定时器 1 控制类实例。
/* code end variable definition */
static void user_tim_1_startPWM_Output(uint32_t channel);
static void user_tim_1_stopPWM_Output(uint32_t channel);
static void user_tim_1_changePWM_DutyCycle(uint16_t pause, uint32_t channel);
void init_user_tim_1(void);
3. 实现声明的函数
/* code begin function body */
static void user_tim_1_startPWM_Output(uint32_t channel)
{
HAL_TIM_PWM_Start(user_tim_1.htim, channel);// 开启 PWM 输出。
}
static void user_tim_1_stopPWM_Output(uint32_t channel)
{
HAL_TIM_PWM_Stop(user_tim_1.htim, channel);// 停止 PWM 输出。
}
static void user_tim_1_changePWM_DutyCycle(uint16_t pause, uint32_t channel)
{
__HAL_TIM_SET_COMPARE(user_tim_1.htim, channel, pause);// 改变 PWM 占空比。
}
void init_user_tim_1(void)
{
user_tim_1.htim = &htim1;
user_tim_1.startPWM_Output = user_tim_1_startPWM_Output;
user_tim_1.stopPWM_Output = user_tim_1_stopPWM_Output;
user_tim_1.changePWM_DutyCycle = user_tim_1_changePWM_DutyCycle;
}
/* code end function body */
4. 声明全局函数和变量
/* code begin function statement */
void init_user_tim_1(void);// 初始化定时器 1,需要在使用 user_tim_1 前调用。
/* code end function statement */
/* code begin variable statement */
extern obj_tim_1 user_tim_1;// 定时器 1 的控制类实例。
/* code end variable statement */