STM32F103 TIM高级定时器

STM32F103C8T6 最小系统开发板使用HAL固件库驱动TIM高级定时器

1. 硬件设计

1.1 最小系统开发板

STM32F103C8T6微控制器拥有多个定时器,其中包括基本定时器和高级定时器。高级定时器(如TIM1、TIM8)具有更多的功能,如PWM输出、输入捕获、输出比较等。在本项目中,我们将使用TIM1高级定时器来生成PWM信号。

最小系统开发板的硬件设计通常包括了连接的LED或其他输出设备,用于展示定时器产生的PWM信号。TIM1的引脚通常可以配置为PWM输出。

STM32F103C8T6 引脚 说明
PA8 TIM1_CH1(用于PWM输出)

1.2 TIM高级定时器原理

高级定时器(如TIM1)相比于基本定时器,提供了更强大的功能,主要包括:

  1. PWM输出:可通过定时器的输出通道产生占空比可调的PWM信号,常用于电机控制、LED调光等应用。
  2. 输入捕获:用于测量外部信号的频率或周期。
  3. 输出比较:用于在特定时间输出一个信号。
  4. 死区时间生成器:主要用于双向电机驱动控制。

TIM1是STM32F103系列的高级定时器,支持多通道PWM输出,并且可以精确控制PWM信号的频率和占空比。

2. 软件设计

2.1 开发环境

  • 开发工具:STM32CubeMX、Keil uVision 5
  • 下载工具:ST-Link V2(用于将程序烧录到STM32开发板)
  • 固件库:STM32Cube HAL库

2.2 STM32CubeMX配置

  1. 打开STM32CubeMX,选择STM32F103C8T6芯片。
  2. Pinout & Configuration界面,选择TIM1并配置PA8为PWM输出。
  3. 配置TIM1:
    • 设置PWM模式。
    • 设置预分频器和自动重载值(ARR)来调整PWM信号的频率和周期。
    • 配置输出通道为PWM模式。
  4. 配置时钟并生成代码。
  5. 打开Keil uVision 5,载入生成的代码。

2.3 TIM1的初始化与配置

初始化TIM1并配置PWM输出通道,设置频率和占空比:

/* TIM1初始化代码 */
TIM_HandleTypeDef htim1;
TIM_OC_InitTypeDef sConfigOC;

void TIM1_Init(void)
{
    __HAL_RCC_TIM1_CLK_ENABLE();  // 启用TIM1时钟

    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 71;  // 设置预分频器,使计数器时钟为1MHz
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;  // 向上计数模式
    htim1.Init.Period = 1999;  // 设置自动重载值,PWM周期为2ms(1kHz频率)
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&htim1);  // 初始化TIM1的PWM功能

    /* 配置PWM输出通道 */
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 1000;  // 设置占空比为50%(1000/2000)
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);  // 配置TIM1通道1
}

2.4 启动PWM输出

启动TIM1的PWM输出功能,将PWM信号输出到PA8引脚:

/* 启动PWM输出 */
void TIM1_PWM_Start(void)
{
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);  // 启动PWM输出
}

2.5 完整程序

以下是完整的定时器配置与使用示例,设置PWM信号输出并控制占空比:

#include "stm32f1xx_hal.h"

/* TIM1句柄 */
TIM_HandleTypeDef htim1;
TIM_OC_InitTypeDef sConfigOC;

/* TIM1初始化 */
void TIM1_Init(void)
{
    __HAL_RCC_TIM1_CLK_ENABLE();  // 启用TIM1时钟

    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 71;  // 设置预分频器
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 1999;  // 设置自动重载值
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&htim1);  // 初始化PWM功能

    /* 配置PWM输出通道 */
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 1000;  // 设置占空比50%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);  // 配置通道1
}

/* 启动PWM输出 */
void TIM1_PWM_Start(void)
{
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);  // 启动PWM输出
}

/* 主程序 */
int main(void)
{
    HAL_Init();
    TIM1_Init();  // 初始化TIM1
    TIM1_PWM_Start();  // 启动PWM输出

    while (1)
    {
        // 主循环中可以执行其他任务
    }
}

3. 下载工具

stlink

使用ST-Link V2将程序烧录到STM32F103C8T6开发板。通过ST-Link V2调试接口连接到开发板,并使用Keil uVision 5的下载功能将程序烧录到微控制器中。

4. 结语

本博客介绍了如何使用STM32F103C8T6最小系统开发板和HAL固件库,通过TIM1高级定时器生成PWM信号。通过硬件设计、TIM高级定时器原理、软件设计、详细操作步骤及示例代码,您可以轻松实现PWM输出并控制其占空比。希望本博客对您的项目开发有所帮助。

posted @ 2025-02-07 15:47  jeikerxiao  阅读(834)  评论(0)    收藏  举报