STM32-基本定时器

一.基本定时器简介

STM32F1 系列共有 8 个定时器,分别为:基本定时器、通用定时器、高级定时器。基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部IO。

二.基本定时器功能

上图为基本定时器的功能框图。

  • 时钟源 :定时器时钟TIMxCLK ,即内部时钟CK_INT

  • 计数器时钟 :定时器时钟经过PSC预分频器后,即CK_CNT ,用于驱动计数器计数 。

    计数器时钟计算方式:CK_CNT=TIMxCLK/(PSC+1)

  • 计数器CNT 是一个16位的计数器,最大计数值是65535。当计数达到自动重载寄存器的时候产生更新事件,并清零重头开始计数。

  • 自动重装载寄存器 :自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。

  • 定时时间的计算 :定时时间=计数器的中断周期*中断的次数 = 1/CK_CNT * (ARR+1)

三.定时器初始化结构体

c 复制代码
typedef struct {
	uint16_t TIM_Prescaler; // 预分频器
	uint16_t TIM_CounterMode; // 计数模式(基本定时器只能使用向上计数)
	uint32_t TIM_Period; // 定时器周期
	uint16_t TIM_ClockDivision; // 时钟分频(基本定时器不用设置)
	uint8_t TIM_RepetitionCounter; // 重复计算器(基本定时器不用设置)
} TIM_TimeBaseInitTypeDef;
  • TIM_Prescaler:定时器预分频器设置,时钟源经过预分频器后才是定时器时钟。
  • TIM_CounterMode:定时器计数方式,包含:向上计数、向下计数、中心对齐模式。基本定时器只能是向上计数(从0开始递增)
  • TIM_Period:定时器周期,设定自动重载寄存器的值。

四.源代码

1.定时器初始化设置和中断初始化设置

c 复制代码
//baseTimer.c
#include "baseTimer.h"
void INIT_NVIC_CONFIG(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	//设置中断分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;//设置中断源 基本定时器 6,7
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	
	NVIC_Init(&NVIC_InitStructure);
}

void INIT_BASETimer_CONFIG(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	//开启定时器时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
	TIM_TimeBaseInitStructure.TIM_Prescaler = 71;//分频因子 CLK/(pre+1) 72MHZ/72 = 1MHZ =10^6HZ 周期是1us
	TIM_TimeBaseInitStructure.TIM_Period = 1000-1;//定时1ms中断  (per+1)*计数周期
	//初始化定时器
	TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStructure);
	
	//清除计数器中断标志位
	TIM_ClearFlag(TIM6,TIM_FLAG_Update);
	//开启计数器中断
	TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
	//使能计数器
	TIM_Cmd(TIM6,ENABLE);
}

2.中断处理函数

c 复制代码
//stm32f10x_it.h
void TIM6_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM6,TIM_IT_Update) == SET)
	{
		Time_Count++;
		TIM_ClearITPendingBit(TIM6,TIM_FLAG_Update);
		if(Time_Count == 1000)
		{
			Time_Count = 0;
			if(FLAG == 0)
			{
				FLAG = 1;
			}
			else if(FLAG == 1)
			{
				FLAG = 0;
			}
		}
	}
}

3.主函数

c 复制代码
//main.c
#include "stm32f10x.h"
#include "bsp_colorled.h"
#include "baseTimer.h"

uint8_t FLAG=0;

int main(void)
{
	
	INIT_LED_CONFIG();
	CLOSE_LED();
	
	INIT_NVIC_CONFIG();
	INIT_BASETimer_CONFIG();
	while(1)
	{
		if(FLAG == 0)
		{
			OPEN_GREEN();
		}
		else
		{
			CLOSE_LED();
		}
	}
}

五.实验现象

相关推荐
KOAN凯擎小妹11 小时前
无源晶振为什么有串联谐振和并联谐振?MCU为什么使用并联晶体?
单片机·嵌入式硬件·晶振·元器件
茯苓gao12 小时前
嵌入式开发笔记:CAN与CAN FD完全指南——从帧格式差异到MCU选型实战
网络·笔记·stm32·嵌入式硬件·学习·汽车
木木_王12 小时前
嵌入式学习 | STM32 裸板驱动开发(Day06) | DHT11温湿度传感器超详解(单总线时序+全套驱动代码+智能温湿度报警项目)
驱动开发·stm32·学习
振南的单片机世界13 小时前
3.5T静默分帧,CRC16校验:Modbus-RTU帧结构解析
arm开发·stm32·单片机·嵌入式硬件
LingzhiPi14 小时前
零知派ESP32--AS5600磁吸旋钮音量控制器
c++·单片机·嵌入式硬件
0x3F(小茶)14 小时前
STM32 SPI的5种方向模式
c语言·stm32·单片机·嵌入式硬件
BSD_CGQ16 小时前
FSR压力传感器信号调理电路设计要点
单片机·嵌入式硬件·压力传感器·源头工厂·薄膜压力传感器
爱就是恒久忍耐16 小时前
CanFestival移植到STM32 F103芯片(基于HAL库)
stm32·单片机·嵌入式硬件
LCG元18 小时前
STM32 多总线传感器采集系统:I2C + SPI + ADC + UART 协同实战(FreeRTOS 调度)
stm32·单片机·嵌入式硬件
m0_5474866618 小时前
《Arm Cortex-M4嵌入式系统-STM32G4系列微控制器的原理架构与开发》全套PPT课件
arm开发·stm32·嵌入式硬件