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();
		}
	}
}

五.实验现象

相关推荐
Miuney_MAX2 小时前
【单片机】之HC32F460中断向量选择
单片机·嵌入式硬件
猫猫的小茶馆7 小时前
【ARM】ARM的介绍
c语言·开发语言·arm开发·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆7 小时前
【PCB工艺】数模电及射频电路基础
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·pcb工艺
点灯小铭7 小时前
基于单片机的智能药物盒设计与实现
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
梓德原8 小时前
【基础】详细分析带隙型稳压电路的工作原理
单片机·嵌入式硬件·物联网
国科安芯9 小时前
航天医疗领域AS32S601芯片的性能分析与适配性探讨
大数据·网络·人工智能·单片机·嵌入式硬件·fpga开发·性能优化
小李做物联网9 小时前
【物联网毕业设计】60.1基于单片机物联网嵌入式项目程序开发之图像厨房监测系统
stm32·单片机·嵌入式硬件·物联网
龙智DevSecOps解决方案10 小时前
龙智解读:AI时代的嵌入式开发挑战以及Perforce QAC、Tessy等工具链的落地应用
嵌入式开发·汽车电子·汽车软件开发·功能安全规范
贝塔实验室10 小时前
新手如何使用Altium Designer创建第一张原理图(三)
arm开发·单片机·嵌入式硬件·fpga开发·射频工程·基带工程·嵌入式实时数据库
@good_good_study10 小时前
STM32 ADC多通道采样实验
stm32·单片机·嵌入式硬件