STM32通用定时器(原理结构体库函数中断闪烁灯)

Posted 行稳方能走远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32通用定时器(原理结构体库函数中断闪烁灯)相关的知识,希望对你有一定的参考价值。

摘自:stm32定时器与定时器中断
作者:打酱油的
发布时间: 2021-04-11 01:04:09
网址:https://blog.csdn.net/weixin_46098612/article/details/115493737

摘自:stm32通用定时器结构体函数+定时器实现led闪烁
作者:点灯小哥
发布时间: 2021-03-09 12:13:32
网址:https://blog.csdn.net/weixin_46016743/article/details/114579672

定时器概念

1.定时器种类

在这里插入图片描述
注:主要使用通用定时器

2.通用计时器特点描述

在这里插入图片描述
在这里插入图片描述

3.定时器中断触发条件

在这里插入图片描述

4.定时器计数模式

分为向上,向下,向上向下模式
在这里插入图片描述
在这里插入图片描述

5.通用定时器作用用途

在这里插入图片描述

6.工作过程

在这里插入图片描述
在这里插入图片描述

对照着STM32中文参考手册14.1章节,红色部分重点关注

在这里插入图片描述
1、时钟来源:

A.内部时钟APB1分频器ckl_int(主要)
B.其他通用定时器 外部引脚2,3,4
C.其他定时器
D.外部通道(略)

2、时基单元(时间控制单元) :

①预分频(除法)
②计数器时钟
③自动重装载值

3、输入部分:

①输入引脚
②边沿检测

4、输出部分 :

A 输出比较寄存器
B周期—重装载值
C占空比—比较值

通用定时器结构体函数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
注:真正使用的只有前3个成员,后两个属于高级寄存器才使用

在这里插入图片描述

配置步骤

在这里插入图片描述

使用通用定时器实现LED灯每隔一秒亮一次

tim.c

#include "stm32f10x.h"                  // Device header
#include "tim.h"
 
void tim_config(void)
{
		TIM_TimeBaseInitTypeDef	TIMinitStructure;//2.配置定时器时钟结构体
		NVIC_InitTypeDef NVICinitStructure;//3.开启定时器中断,配置中断结构体  属于系统内核中断
	
		RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2,  ENABLE);//1.使能时钟 定时器时钟
 
	
		NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1);//中断服务组
 
	
		TIMinitStructure.TIM_ClockDivision     = TIM_CKD_DIV1; //1分频 也就是不分频
		TIMinitStructure.TIM_CounterMode       = TIM_CounterMode_Up;//计数模式 选向上 
		TIMinitStructure.TIM_Period            = 10000-1;	//Tout 自动重装载值
		TIMinitStructure.TIM_Prescaler         = 7200-1;    //分配器计数值
		TIM_TimeBaseInit( TIM2, &TIMinitStructure);
		
		TIM_Cmd( TIM2,  ENABLE);  //要有定时器使能
		
		//凡是带有IT都表示中断
		TIM_ITConfig( TIM2,  TIM_IT_Update,  ENABLE);//配置定时器与中断线联系创建
		             //中断源
	
		
		NVICinitStructure.NVIC_IRQChannel = TIM2_IRQn;//中断通道  中断源是系统定时器2
		NVICinitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
		NVICinitStructure.NVIC_IRQChannelSubPriority = 1;//子优先级
		NVICinitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
		NVIC_Init( &NVICinitStructure );
 
	
	
	
}

tim.h

#include "stm32f10x.h"                  // Device header
 
void tim_config(void);//声明

main.c

#include "stm32f10x.h"                  // Device header
#include "usart.h"
#include "led.h"
#include "tim.h"
 
void delay(uint16_t time)
{
		uint16_t i = 0;
		while(time--)
		{
			i=12000;
			while(i--);
		}
}
 
int main(void)
{
		
		LED_Init();
		tim_config();
		GPIO_SetBits( GPIOC,  GPIO_Pin_13);//初始化关灯
 
		while(1)
		{
			
			
			
		}
}

//4. 配置定时器中断服务函数  函数名必须和固件库一样
void TIM2_IRQHandler(void)
{
		 static uint16_t temp;//静态变量
		 
		 if(TIM_GetITStatus( TIM2,  TIM_IT_Update) != RESET) //判断定时器中断标志位是否被打开  在头文件stm32f10x_tim.h里
		 {                                                   //每秒开启一次中断 定时器本质也就是计数器 不用再写delay函数一直占用CPU的资源了
				if(temp++ %2 == 1) //求余  奇偶判断
					{
						 GPIO_ResetBits( GPIOC,  GPIO_Pin_13);
 
					}	
				else
					{
						 GPIO_SetBits( GPIOC,  GPIO_Pin_13);
 
				
					}
		 
		 }
 
 TIM_ClearITPendingBit( TIM2,  TIM_IT_Update);//最后要做定时器清除中断标志位
 
 
}	

以上是关于STM32通用定时器(原理结构体库函数中断闪烁灯)的主要内容,如果未能解决你的问题,请参考以下文章

STM32 定时器

STM32F103VET6基于STM32CubeMX创建定时器中断控制LED闪烁

STM32学习笔记——通用定时器计数延时

STM32F103C8T6基于Arduino框架下利用定时器跑RBG灯闪烁

STM32-定时器详解

STM32G070RBT6基于STM32CubeMX创建定时器中断控制LED闪烁