STM32F103 TIM基本定时器

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

1. 硬件设计

1.1 最小系统开发板

STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,具备多个定时器模块,其中包括基本定时器。我们将在本项目中使用一个基本定时器(TIM2)来实现定时任务。

最小系统开发板硬件设计图中,TIM2定时器的时钟由系统时钟源提供,而输出引脚可以配置为GPIO,用于产生定时中断或控制外设。

STM32F103C8T6 引脚 说明
PA0 TIM2_CH1(用于定时器输入/输出)

1.2 TIM基本定时器原理

TIM基本定时器(例如TIM2)是一种非常简单的定时器,通常用于延时或周期性任务。它的工作原理是:定时器在每个定时周期到达时产生一个中断或输出信号,应用程序可以通过中断服务程序来处理这些定时事件。

基本定时器的工作原理:

  1. 计数器:定时器内部有一个16位的计数器,当计数器达到预定的值时,会触发一个事件。
  2. 自动重载寄存器:用于设置定时器的最大计数值(即定时周期)。
  3. 时钟源:定时器的计时依据系统时钟或外部时钟,时钟源可以设置为不同的频率。
  4. 中断:定时器达到预定值时,会产生中断请求,程序可以通过中断服务程序来执行特定的任务。

2. 软件设计

2.1 开发环境

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

2.2 STM32CubeMX配置

  1. 打开STM32CubeMX,选择STM32F103C8T6芯片。
  2. Pinout & Configuration界面,选择TIM2,并配置PA0为TIM2的输出引脚(PWM输出)。
  3. 配置TIM2:
    • 设置计数器模式。
    • 设置自动重载值(ARR)和预分频器(PSC),从而设定定时器的时间间隔。
  4. 配置时钟,并生成代码。
  5. 打开Keil uVision 5,载入生成的代码。

2.3 TIM2的初始化与配置

首先,配置TIM2的工作模式,设置定时器的预分频器和自动重载值:

/* TIM2初始化代码 */
TIM_HandleTypeDef htim2;

void TIM2_Init(void)
{
    __HAL_RCC_TIM2_CLK_ENABLE();  // 启用TIM2时钟

    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 7999;  // 设置预分频器,系统时钟为72MHz,定时器时钟为9kHz
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;  // 向上计数模式
    htim2.Init.Period = 999;  // 设置自动重载值,定时器周期为100ms
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&htim2);  // 初始化定时器
}

2.4 配置定时器中断

如果希望定时器在计数完成时产生中断,我们可以启用定时器中断。设置并启用定时器中断:

/* 配置TIM2中断 */
void TIM2_NVIC_Config(void)
{
    HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);  // 设置中断优先级
    HAL_NVIC_EnableIRQ(TIM2_IRQn);  // 启用TIM2中断
}

2.5 启动定时器

启动定时器并启用中断,使定时器能够周期性触发事件:

/* 启动TIM2 */
void TIM2_Start(void)
{
    HAL_TIM_Base_Start_IT(&htim2);  // 启动TIM2并启用中断
}

2.6 中断服务程序

在定时器计数到达预定值时,产生中断并执行相应的操作。在中断服务程序中,可以执行特定的任务,例如切换LED状态或输出PWM信号:

/* TIM2中断服务程序 */
void TIM2_IRQHandler(void)
{
    if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET)  // 检查更新中断标志
    {
        __HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);  // 清除中断标志
        // 执行定时任务,如切换LED状态
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);  // 假设连接了一个LED
    }
}

2.7 完整程序

以下是完整的定时器配置与使用示例:

#include "stm32f1xx_hal.h"

/* TIM2句柄 */
TIM_HandleTypeDef htim2;

/* 定时器初始化 */
void TIM2_Init(void)
{
    __HAL_RCC_TIM2_CLK_ENABLE();  // 启用TIM2时钟

    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 7999;  // 设置预分频器
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 999;  // 设置自动重载值
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&htim2);  // 初始化定时器
}

/* 启动定时器 */
void TIM2_Start(void)
{
    HAL_TIM_Base_Start_IT(&htim2);  // 启动定时器并启用中断
}

/* 配置TIM2中断 */
void TIM2_NVIC_Config(void)
{
    HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);  // 设置中断优先级
    HAL_NVIC_EnableIRQ(TIM2_IRQn);  // 启用TIM2中断
}

/* TIM2中断服务程序 */
void TIM2_IRQHandler(void)
{
    if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET)
    {
        __HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);  // 清除中断标志
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);  // 假设连接了一个LED
    }
}

/* 主程序 */
int main(void)
{
    HAL_Init();
    TIM2_Init();
    TIM2_NVIC_Config();  // 配置中断
    TIM2_Start();  // 启动定时器

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

3. 下载工具

stlink

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

4. 结语

本博客介绍了如何使用STM32F103C8T6最小系统开发板和HAL固件库,通过基本定时器(TIM2)实现定时任务。通过硬件设计、TIM定时器原理、软件设计、详细操作步骤及示例代码,您可以轻松实现定时器的应用。希望本博客对您的项目开发有所帮助。

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