天天看點

STM32 筆記 03:如何使用 CubeMX 配置 Timer 輸出可變 PWM(正向)一. 前言二. CubeMX 配置三. 主要代碼

文章目錄

  • 一. 前言
  • 二. CubeMX 配置
    • 1. 定時器和 PWM 參數配置
    • 2. 時鐘配置
  • 三. 主要代碼
    • 1. 定義定時器控制類,及相關宏定義
    • 2. 建立定時器控制類執行個體,并聲明要實作的函數
    • 3. 實作聲明的函數
    • 4. 聲明全局函數和變量

一. 前言

  • 測試時所使用的 MCU 是:STM32F103C8Tx
  • 測試時所使用的 CubeMX 版本是:6.1
  • 測試例程下載下傳位址:實作定時器正向通道的 PWM 輸出(包括進階定時器,如 TIM1_CH1)

二. CubeMX 配置

1. 定時器和 PWM 參數配置

STM32 筆記 03:如何使用 CubeMX 配置 Timer 輸出可變 PWM(正向)一. 前言二. CubeMX 配置三. 主要代碼
STM32 筆記 03:如何使用 CubeMX 配置 Timer 輸出可變 PWM(正向)一. 前言二. CubeMX 配置三. 主要代碼

2. 時鐘配置

STM32 筆記 03:如何使用 CubeMX 配置 Timer 輸出可變 PWM(正向)一. 前言二. CubeMX 配置三. 主要代碼

三. 主要代碼

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 */
           
/* code begin function statement */
static void user_tim_1_startPWM_Output(uint32_t channel);// 讓定時器正向通道開始輸出 PWM 的方法。
static void user_tim_1_stopPWM_Output(uint32_t channel);// 讓定時器正向通道停止輸出 PWM 的方法。
static void user_tim_1_changePWM_DutyCycle(uint16_t pause, uint32_t channel);// 改變定時器指定通道的 PWM 占空比。
void init_user_tim_1(void);
/* code end function statement */
           

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

繼續閱讀