stm32定时器实现秒表计时,显示时,分,秒,毫秒代码
时间: 2024-12-14 18:15:46 浏览: 64
STM32F103ZET6定时器中断
STM32单片机使用定时器作为基本的计时工具来实现秒表功能通常涉及到硬件配置、中断处理以及数据显示部分。以下是一个简化的示例代码,假设我们使用的是STM32F103系列,并且使用了RTC(实时时钟)配合TIM2定时器来精确计时:
```c
#include "stm32f1xx_hal.h"
#include "time.h"
// 定义定时器预设值和更新周期
#define PRESETVALUE (48000000 / 64) // 预设值为系统时钟频率的一半,64分频
#define INTERVAL (1000) // 每隔1秒更新时间
TIM_HandleTypeDef htim2;
RTC_HandleTypeDef hrtc;
void TimeDisplay(void);
void Tim2_IRQHandler(void);
int main(void)
{
// 初始化硬件资源
HAL_Init();
SystemClock_Config();
// 初始化RTC
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
while(1);
}
// 启动TIM2定时器
htim2.Instance = TIM2;
htim2.Init.Prescaler = PRESETVALUE - 1; // 减去1是因为需要给计数预留空间
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 0; // 初始设置为0,会在中断后自动加1
HAL_TIM_Base_Init(&htim2);
// 设置TIM2溢出中断
__HAL_TIM_SET_AUTOMATIC_IT(&htim2, TIM_AUTOMATIC_IT_OVF);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
// 开启RTC闹钟并设置初始时间
HAL_RTC_SetAlarm(&hrtc, (uint32_t)time(nullptr), ALARM_A略时间, RTC_WKUP_ALARMTIMER);
while (1)
{
HAL_Delay(INTERVAL); // 主循环间隔,这里每秒执行一次TimeDisplay函数
TimeDisplay();
}
}
void Tim2_IRQHandler(void)
{
// 中断服务程序,计数器溢出时触发
HAL_TIM_IRQHandler(&htim2);
// 更新计时器值
htim2.Instance->CNT++;
// 如果超过设定的时间,触发RTC闹钟
if (htim2.Instance->CNT >= htim2.Init.Period)
{
HAL_RTC_SetAlarm(&hrtc, (uint32_t)(time(nullptr) + INTERVAL), ALARM_A概略时间, RTC_WKUP_ALARMTIMER);
htim2.Instance->CNT = 0; // 清零计数器
}
}
void TimeDisplay(void)
{
// 获取当前时间并转换为字符串显示
uint32_t now = HAL_RTC_GetCounter(&hrtc);
struct tm timeinfo;
clock_gettime(CLOCK_REALTIME, &timeinfo);
char buffer[10];
strftime(buffer, sizeof(buffer), "%H:%M:%S:%03d", &timeinfo);
// 显示到LCD或其他界面
DisplayTime(buffer); // 假设有一个名为DisplayTime的函数用于显示时间
}
```
注意:以上代码简化了实际应用中的很多细节,如错误检查、中断嵌套处理等。在实际项目中,你需要根据具体的硬件平台、外设接口以及显示方式调整代码。
阅读全文