stm32f103c8t6 HAL库定时器秒表
时间: 2025-01-17 13:56:04 浏览: 62
### 使用 STM32F103C8T6 和 HAL 库创建定时器秒表程序
为了实现一个简单的秒表功能,可以利用STM32F103C8T6微控制器的定时器外设以及HAL库来完成计时操作。下面是一个完整的例子,展示了如何配置并使用定时器来进行每秒钟触发一次事件。
#### 初始化硬件资源
确保已经在CubeMX工具中正确设置了TIM2定时器用于时间测量,并启用了相应的中断服务例程(ISR),以便能够响应定时溢出事件[^2]。
#### 编写主函数与初始化部分
在`main.c`文件里加入必要的头文件声明和全局变量定义:
```c
#include "stm32f1xx_hal.h"
// 定义两个静态变量用来记录时间和调用次数
static uint32_t time_cnt = 0;
static uint32_t sec_count = 0;
int main(void){
/* MCU Configuration */
// 初始化所有已使能的外围设备, 如系统时钟、GPIO等.
HAL_Init();
SystemClock_Config(); // 配置系统时钟
MX_GPIO_Init(); // GPIO初始化
MX_TIM2_Init(); // TIM2初始化
// 启动定时器中断
HAL_TIM_Base_Start_IT(&htim2);
while (1){
__asm volatile ("nop"); // 主循环等待中断处理
}
}
```
#### 实现定时器中断回调函数
接下来是在同一源文件内添加定时器中断的服务例程,这里我们将通过增加计数器的方式来模拟秒表的行为:
```c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim->Instance==TIM2){
static uint32_t time_cnt = 0;
++time_cnt;
if(time_cnt >= 1000){ // 假定每次中断间隔为1ms,则此处表示经过了一秒
time_cnt = 0;
printf("%d seconds elapsed.\r\n",++sec_count); // 打印当前过去了多少秒
// 反转LED状态以指示一秒过去
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
}
}
```
上述代码片段实现了基本的秒表逻辑:每当定时器产生中断时就累加计数值;一旦达到预设阈值(即一秒钟),则重置计数并将总秒数加一,并打印出来同时切换连接到PA5引脚上的LED灯亮灭状态作为视觉反馈[^3]。
#### 调整定时器参数
需要注意的是,在实际开发过程中可能还需要调整定时器的具体参数(比如预分频系数Prescaler),使得其产生的中断频率正好满足需求——在这个场景下就是希望得到大约每一毫秒发生一次中断的效果。这可以通过修改CubeMX生成的初始化代码或者直接编辑对应的结构体成员来达成目的。
阅读全文
相关推荐














