STM32F103C8T6 最小系统开发板使用HAL固件库驱动TIM基本定时器
1. 硬件设计
1.1 最小系统开发板
STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,具备多个定时器模块,其中包括基本定时器。我们将在本项目中使用一个基本定时器(TIM2)来实现定时任务。
最小系统开发板硬件设计图中,TIM2定时器的时钟由系统时钟源提供,而输出引脚可以配置为GPIO,用于产生定时中断或控制外设。
STM32F103C8T6 引脚 | 说明 |
---|---|
PA0 | TIM2_CH1(用于定时器输入/输出) |
1.2 TIM基本定时器原理
TIM基本定时器(例如TIM2)是一种非常简单的定时器,通常用于延时或周期性任务。它的工作原理是:定时器在每个定时周期到达时产生一个中断或输出信号,应用程序可以通过中断服务程序来处理这些定时事件。
基本定时器的工作原理:
- 计数器:定时器内部有一个16位的计数器,当计数器达到预定的值时,会触发一个事件。
- 自动重载寄存器:用于设置定时器的最大计数值(即定时周期)。
- 时钟源:定时器的计时依据系统时钟或外部时钟,时钟源可以设置为不同的频率。
- 中断:定时器达到预定值时,会产生中断请求,程序可以通过中断服务程序来执行特定的任务。
2. 软件设计
2.1 开发环境
- 开发工具:STM32CubeMX、Keil uVision 5
- 下载工具:ST-Link V2(用于将程序烧录到STM32开发板)
- 固件库:STM32Cube HAL库
2.2 STM32CubeMX配置
- 打开STM32CubeMX,选择STM32F103C8T6芯片。
- 在Pinout & Configuration界面,选择TIM2,并配置PA0为TIM2的输出引脚(PWM输出)。
- 配置TIM2:
- 设置计数器模式。
- 设置自动重载值(ARR)和预分频器(PSC),从而设定定时器的时间间隔。
- 配置时钟,并生成代码。
- 打开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,定时器时钟为9kHzhtim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式htim2.Init.Period = 999; // 设置自动重载值,定时器周期为100mshtim2.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. 下载工具
使用ST-Link V2将程序烧录到STM32F103C8T6开发板。通过ST-Link V2调试接口连接到开发板,并使用Keil uVision 5的下载功能将程序烧录到微控制器中。
4. 结语
本博客介绍了如何使用STM32F103C8T6最小系统开发板和HAL固件库,通过基本定时器(TIM2)实现定时任务。通过硬件设计、TIM定时器原理、软件设计、详细操作步骤及示例代码,您可以轻松实现定时器的应用。希望本博客对您的项目开发有所帮助。