生成一段时分秒计时的STM32代码
时间: 2024-05-16 12:14:00 浏览: 54
在STM32上连接显示屏,屏幕上显示60s倒计时
5星 · 资源好评率100%
以下是一个简单的时分秒计时的STM32代码,使用定时器和中断实现:
```c
#include "stm32f10x.h"
// 定义全局变量,用于存储时分秒计时
volatile uint32_t seconds = 0;
volatile uint32_t minutes = 0;
volatile uint32_t hours = 0;
int main(void) {
// 初始化SysTick定时器,用于中断处理器每秒钟
SysTick_Config(SystemCoreClock / 1000);
// 初始化GPIO口,用于控制LED灯
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 初始化定时器2,用于时分秒计时
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 999; // 计数周期为1000,即1秒钟
TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 计数器时钟频率为72MHz/7200=10kHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 启用定时器2中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ(TIM2_IRQn);
// 启动定时器2
TIM_Cmd(TIM2, ENABLE);
while (1) {
GPIO_SetBits(GPIOC, GPIO_Pin_13); // 点亮LED灯
delay(500);
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 熄灭LED灯
delay(500);
}
}
// SysTick中断处理函数,每秒钟更新时分秒计时
void SysTick_Handler(void) {
seconds++; // 每秒钟增加1秒
if (seconds >= 60) {
seconds = 0;
minutes++; // 每分钟增加1分钟
if (minutes >= 60) {
minutes = 0;
hours++; // 每小时增加1小时
if (hours >= 24) {
hours = 0; // 每天重置为0小时
}
}
}
}
// TIM2中断处理函数,每秒钟更新定时器计数器
void TIM2_IRQHandler(void) {
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
TIM_SetCounter(TIM2, 0); // 重置计数器
}
}
// 延时函数,用于控制LED灯闪烁
void delay(uint32_t time) {
uint32_t i;
for (i = 0; i < time * 1000; i++);
}
```
该代码使用SysTick定时器每秒钟中断一次,更新全局变量seconds、minutes和hours,实现时分秒计时。同时,使用定时器2每秒钟重置计数器,实现精确的计时。在主函数中,使用GPIO口控制LED灯闪烁,以演示时分秒计时的效果。
阅读全文