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.定时器种类(通用定时器、基本定时器、高级定时器)

STM32F1XX系列共有八个定时器

两个高级定时器 + 四个通用定时器 + 两个基本定时器
在这里插入图片描述
注:主要使用通用定时器

DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依于CPU 的大量中断负载。
否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU对于其他的工作来说就无法使用。
DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由DMA 控制器来实行和完成。

2.通用计时器特点描述

在这里插入图片描述
注:上面第五点不常用。

通用定时器位于APB1低速总线上在这里插入图片描述

3.定时器计数模式(向上,向下,向上向下模式)

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

4.定时器中断、更新、触发事件、输入捕获、输出比较、PWM、分频

在这里插入图片描述
注:上面5和6用的比较少

在这里插入图片描述

5.通用定时器工作过程

在这里插入图片描述

  • 1、时钟源:
    A.内部时钟APB1分频器CK_INT(改变后的频率)作为时钟源
    B.其他通用定时器 外部引脚2,3,4
    C.其他定时器
    D.外部通道(略)
  • 2、时基单元(时间控制单元) :
    ①预分频(除法1~65535)
    ②计数器时钟
    ③自动重装载值
  • 3、输入部分:
    ①输入引脚(左下角四个外部输入通道)
    ②边沿检测(比如选择上升沿和下降沿捕获,就可以获得脉冲的长度)
  • 4、输出部分 :
    A.输出比较寄存器
    B.周期—重装载值
    C.占空比—比较值(比如上面重装载值设置100作为周期,比较器设置50,那么占空比就为50%)
    在这里插入图片描述

主要关注下面红线部分,即内部时钟APB1作为时钟源。在这里插入图片描述

通用定时器时钟频率配置、寄存器、结构体、库函数

计数器时钟频率计算
在这里插入图片描述

在这里插入图片描述

通用定时器相关寄存器

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

通用定时器库函数
在这里插入图片描述

定时器中断配置步骤(LED每秒闪烁一次)

在这里插入图片描述
江江讲的不对
预分频值:prescaler
时钟分频因子:ClockDivision

编程实现

led.c

前面配置过了

tim.h

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

tim.c

#include "stm32f10x.h"                  // Device header
#include "tim.h"
 
void tim_config(void)
{
		//2.配置定时器结构体
		TIM_TimeBaseInitTypeDef	TIMinitStructure;
		//3.配置NVIC中断控制器结构体  内核寄存器misc.h
		NVIC_InitTypeDef NVICinitStructure;
		//1.使能时钟 定时器时钟
		RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2,  ENABLE);
 
	
		NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1);//配置	NVIC中断组
 
	
		TIMinitStructure.TIM_ClockDivision     = TIM_CKD_DIV1; //1分频 也就是不分频
		TIMinitStructure.TIM_CounterMode       = TIM_CounterMode_Up;//计数模式 选向上 
		TIMinitStructure.TIM_Period            = 10000-1;	//自动重装载值
		TIMinitStructure.TIM_Prescaler         = 7200-1;    //预分频值
		TIM_TimeBaseInit( TIM2, &TIMinitStructure);		
		TIM_Cmd( TIM2,  ENABLE); //定时器使能 和串口很像
		//定时器中断配置     允许更新标志位 允许更新/溢出(串口这里也是一个标志位)
		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 );	
}

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);//最后记得清除定时器中断标志位  
}	
  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
STM32中,定时器库函数用于配置和控制定时器的功能。其中,定时器初始化函数`TIM_TimeBaseInit`用于初始化定时器的基本参数,包括预分频系数、计数模式和自动装载。\[1\] 在STM32定时器库中,定时器的基本参数是通过`TIM_TimeBaseInitTypeDef`结构体进行配置的。该结构体定义在`stm32f10x_tim.h`中,包括了定时器的周期、预分频时钟分割、计数模式和复计数器等参数。\[2\] 例如,要配置定时器2为向上计数模式,载寄存器为0xFFFF,预分频为16,可以使用以下代码:\[3\] ``` TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0xF; TIM_TimeBaseStructure.TIM_ClockDivision = 0x00; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); ``` 除了定时器初始化函数外,还有其他的定时器库函数,如`TIM_OC1Init`用于配置定时器的输出比较通道1。这些函数可以根据具体的需求来选择和使用。 #### 引用[.reference_title] - *1* [stm32通用定时器](https://blog.csdn.net/qq_41262681/article/details/95892667)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32固件库TIM定时器中常用函数的含义](https://blog.csdn.net/wcl501375/article/details/129343069)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行稳方能走远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值