STM32F103 实例应用(5)——基本定时器
发布日期:2021-05-20 02:25:54 浏览次数:22 分类:精选文章

本文共 2638 字,大约阅读时间需要 8 分钟。

STM32F1 系列定时器简介

STM32F1 系列微控制器中的定时器分为基本定时器、通用定时器和高级定时器三类。基本定时器包括 TIM6 和 TIM7,通用定时器包括 TIM2/3/4/5,而高级定时器则包括 TIM1 和 TIM8。每个定时器的功能和外设有所不同。

基本定时器功能

基本定时器 TIM6 和 TIM7 是 16 位的只能向上计数定时器,仅支持定时功能,没有外部 IO。它们的核心包括时钟源、计数器、自动重装载寄存器等。

时钟源

定时器时钟 TIMxCLK 由内部时钟 CK_INT 通过 APB1 预分频器提供。APB1 预分频系数为 2 时,PCLK1 为 36 MHz,因此 TIMxCLK 为 72 MHz。

计数器时钟

计数器时钟 CK_CNT 通过 PSC 预分频器分频得到,计算公式为 CK_CNT = TIMxCLK / (PSC + 1)。PSC 支持 1 到 65536 的分频。

计数器

计数器 CNT 为 16 位,仅向上计数,最大值为 65535。达到自动重装载寄存器值时,触发溢出中断并重置。

自动重装载寄存器

自动重装载寄存器 ARR 存储计数器的最大值,当计数器达到该值时,定时器产生溢出中断。

基本定时器时基

基本定时器的时基包括三个寄存器:TIMx_CNT、TIMx_PSC 和 TIMx_ARR。通用定时器和高级定时器的时基则多了一个 TIMx_RCR。

基本定时器使用流程

NVIC 设置

在使用基本定时器前,需配置中断控制器 NVIC。例如,使用 TIM6 定时器时,设置其 IRQ 通道的优先级和启用。

定时器中断配置

在定时器中断中,需设置定时器的时基参数,如周期和预分频器值。例如,设置 TIM6 的周期为 1000 ms,预分频器为 71,计算得出 CK_CNT 为 1 MHz。

中断服务程序

中断服务程序负责处理中断事件,如计数器溢出。例如,在 TIM6_IRQHandler 中,每次中断触发时递增计数器。

设计实例

board_timer.h

#ifndef BOARD_TIMER_H
#define BOARD_TIMER_H
#include "stm32f10x.h"
#define BASIC_TIM_IRQHandler TIM6_IRQHandler
#endif

board_timer.c

#include "board_timer.h"
uint16_t time = 0;
void BASIC_TIM_NVIC_Config(void) {
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void BASIC_TIM_Config(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 1000;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM6, TIM_FLAG_Update);
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM6, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, DISABLE);
}
void BASIC_TIM_IRQHandler(void) {
if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) {
time++;
TIM_ClearITPendingBit(TIM6, TIM_FLAG_Update);
}
}

main.c

#include "board_timer.h"
extern uint16_t time;
int main() {
BASIC_TIM_Config();
BASIC_TIM_NVIC_Config();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
while (1) {
if (time == 1000) {
time = 0;
static uint8_t tmp = 0;
if (tmp == 0) {
UseLibSetOutput(GPIOB, GPIO_Pin_0, 0);
tmp = 1;
} else {
UseLibSetOutput(GPIOB, GPIO_Pin_0, 1);
tmp = 0;
}
}
}
return 0;
}

本文提供了 STM32F1 系列定时器的详细介绍,涵盖了基本定时器的功能、时基配置及其实际应用实例。

上一篇:STM32F103 实例应用(6)——通信概念
下一篇:STM32F103 实例应用(4)——中断应用

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月27日 06时51分53秒