本帖最后由 正点原子运营 于 2024-4-2 15:51 编辑
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板
2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版
6)正点原子STM32技术交流QQ群:725095144
本章将介绍使用STM32F103的通用定时器输出PWM。通过本章的学习,读者将学习到通用定时器输出比较的使用。 本章分为如下几个小节: 18.1 硬件设计 18.2 程序设计 18.3 下载验证
18.1 硬件设计 18.1.1 例程功能 1. PB4引脚输出频率为2KHz占空比不断变化的PWM 2. LED0闪烁,提示程序正在运行
18.1.2硬件资源 1. LED LED0 - PB5 2. TIM3 CH1 - PB4
18.1.3 原理图 本章实验使用的TIM3为STM32F103的片上资源,因此没有对应的连接原理图。
18.2 程序设计 18.2.1 HAL库的TIM驱动 本章实验将使用TIM3从CH1(PB4引脚)输出PWM,因此需要配置通用定时器从指定通道输出PWM,具体的步骤如下: ①:初始化定时器PWM ②:配置定时器PWM输出通道 ③:开始定时器PWM输出 在HAL库中对应的驱动函数如下: ①:初始化定时器PWM 该函数用于初始化定时器PWM,其函数原型如下所示: - HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim);
复制代码该函数的形参描述,如下表所示: 表18.2.1.1 函数HAL_TIM_PWM_Init()形参描述 该函数的返回值描述,如下表所示: 表18.2.1.2 函数HAL_TIM_PWM_Init()返回值描述 该函数的使用示例,如下所示: - #include "stm32f1xx_hal.h"
- void example_fun(void)
- {
- TIM_HandleTypeDef tim_handle = {0};
-
- /* 初始化TIM3 PWM */
- tim_handle.Instance = TIM3;
- tim_handle.Init.Prescaler = 72 - 1;
- tim_handle.Init.Period = 500 - 1;
- HAL_TIM_PWM_Init(&tim_handle);
- }
复制代码②:配置定时器PWM输出通道 该函数用于配置定时器的PWM输出通道,其函数原型如下所示: - HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel( TIM_HandleTypeDef *htim,
- TIM_OC_InitTypeDef*sConfig,
- uint32_t Channel);
复制代码该函数的形参描述,如下表所示: 表18.2.1.3 函数HAL_TIM_PWM_ConfigChannel()形参描述 该函数的返回值描述,如下表所示: 表18.2.1.4 函数HAL_TIM_PWM_ConfigChannel()返回值描述 该函数使用TIM_OC_InitTypeDef类型结构体指针传入了定时器输出比较通道的配置参数,该结构体的定义如下所示: - typedef struct
- {
- uint32_t OCMode; /* 输出比较模式 */
- uint32_t Pulse; /* 占空比 */
- uint32_t OCPolarity; /* 输出极性 */
- uint32_t OCNPolarity; /* 互补输出极性 */
- uint32_t OCFastMode; /* 快速模式 */
- uint32_t OCIdleState; /* 空闲状态 */
- uint32_t OCNIdleState; /* 互补空闲状态 */
- }TIM_OC_InitTypeDef;
复制代码该函数的使用示例,如下所示: - #include "stm32f1xx_hal.h"
- void example_fun(void)
- {
- TIM_OC_InitTypeDef tim_oc_init_struct = {0};
-
- /* 配置定时器通道1PWM输出 */
- tim_oc_init_struct.OCMode = TIM_OCMODE_PWM1;
- tim_oc_init_struct.Pulse = 250 - 1;
- tim_oc_init_struct.OCPolarity = TIM_OCPOLARITY_HIGH;
- HAL_TIM_PWM_ConfigChannel(&tim_handle, &tim_ic_init_struct, TIM_CHANNEL_1);
- }
复制代码③:开始定时器PWM输出 该函数用于开始定时器的PWM输出,其函数原型如下所示: - HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
复制代码该函数的形参描述,如下表所示: 表18.2.1.5 函数HAL_TIM_PWM_Start()形参描述 该函数的返回值描述,如下表所示: 表18.2.1.6 函数HAL_TIM_PWM_Start()返回值描述 该函数的使用示例,如下所示: - #include "stm32f1xx_hal.h"
- void example_fun(void)
- {
- /* 开启定时器通道1PWM输出 */
- HAL_TIM_PWM_Start(&tim_handle, TIM_CHANNEL_1);
- }
复制代码18.2.2 通用定时器驱动 本章实验的通用定时器驱动主要负责向应用层提供通用定时器的初始化函数。本章实验中,通用定时器的驱动代码包括gtim.c和gtim.h两个文件。 通用定时器驱动中,对TIM、GPIO的相关宏定义,如下所示: - #define GTIM_TIMX_PWM TIM3
- #define GTIM_TIMX_PWM_CLK_ENABLE() \
- do { \
- __HAL_RCC_TIM3_CLK_ENABLE(); \
- }while (0)
- #define GTIM_TIMX_PWM_CHY TIM_CHANNEL_1
- #define GTIM_TIMX_PWM_CHY_GPIO_PORT GPIOB
- #define GTIM_TIMX_PWM_CHY_GPIO_PIN GPIO_PIN_4
- #define GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE() \
- do { \
- __HAL_RCC_GPIOB_CLK_ENABLE(); \
- }while (0)
复制代码通用定时器驱动中TIM3的初始化函数,如下所示: - /**
- *@brief 初始化通用定时器PWM
- *@param arr: 自动重装载值
- *@param psc: 预分频系数
- *@retval 无
- */
- voidgtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc)
- {
- TIM_OC_InitTypeDef timx_oc_pwm_struct = {0};
-
- /* 初始化定时器PWM */
- g_timx_pwm_handle.Instance = GTIM_TIMX_PWM;
- g_timx_pwm_handle.Init.Prescaler = psc;
- g_timx_pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
- g_timx_pwm_handle.Init.Period = arr;
- HAL_TIM_PWM_Init(&g_timx_pwm_handle);
-
- /* 配置定时器PWM输出通道 */
- timx_oc_pwm_struct.OCMode = TIM_OCMODE_PWM1;
- timx_oc_pwm_struct.Pulse = (arr + 1) >> 1;
- timx_oc_pwm_struct.OCPolarity = TIM_OCPOLARITY_HIGH;
- HAL_TIM_PWM_ConfigChannel( &g_timx_pwm_handle,
- &timx_oc_pwm_struct,
- GTIM_TIMX_PWM_CHY);
-
- /* 开始定时器PWM输出 */
- HAL_TIM_PWM_Start(&g_timx_pwm_handle, GTIM_TIMX_PWM_CHY);
- }
复制代码从TIM3的初始化代码中可以看到,初始化函数中初始化了TIM3的PWM并配置了TIM3的PWM输出通道1,最后开始TIM3的PWM输出。
18.2.3 实验应用代码 本章实验的应用代码,如下所示: - int main(void)
- {
- uint16_t compare = 0;
- uint8_t counter = 0;
-
- HAL_Init(); /* 初始化HAL库 */
- sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
- delay_init(72); /* 初始化延时 */
- usart_init(115200); /* 初始化串口 */
- led_init(); /* 初始化LED */
- gtim_timx_pwm_chy_init(500 - 1, 72 - 1); /* 初始化通用定时器PWM */
-
- while (1)
- {
- if (compare++ >= 300)
- {
- compare = 100;
- }
- __HAL_TIM_SET_COMPARE(&g_timx_pwm_handle, GTIM_TIMX_PWM_CHY, compare);
-
- if (counter++ == 20)
- {
- counter = 0;
- LED0_TOGGLE();
- }
-
- delay_ms(10);
- }
- }
复制代码从上面的代码中可以看到,在初始化完TIM3输出PWM后,就不断地改变TIM3通道1的比较值,以达到改变PWM占空比。
18.3 下载验证 在完成编译和烧录操作后,可以观察到PB4引脚输出频率为2KHz,占空比不断变化的PWM。 |