定时器知识点

#视频教程: 11.TIM定时中断
CSDN教程

知识点:

1.时钟源选择图

![[Pasted Image 20240802103525_114.png]]

基本定时器

2个功能 :只能定时中断和主模式触发DAC的功能

知识点

1.时基单元:预分配器(PSC)、自动重装载寄存器(ARR)、计数器(CNT)

2.总结定时器产生中断的全部流程:从基准时钟到预分频器再到计数器,计数器计数自增,同时不断地与自动重装寄存器进行比较,值相等时,即计时时间到,这时就会产生一个更新中断和更新事件,CPU响应更新中断,就完成了我们定时中断的任务了。

3.主模式触发DAC的功能 就说通过更新时间映射到硬件,直接触发硬件 而不是触发中断,影响主程序

主模式触发DAC的功能,stm32定时器的一大特色就是主从触发模式(主从触发模式能让内部的硬件在不受程序的控制下实现自动运行),如果能把主从触发模式掌握好,那在某些情景下将会极大地减轻CPU的负担。

主模式触发DAC的作用就是,在我们使用DAC的时候,可能会用DAC输出一段波形,那就需要每隔一段时间来触发一次DAC,让它输出下一个电压点。如果用正常的思路来实现的话,就是先设置一个定时器产生中断,每隔一段时间在中断程序中调用代码手动触发一次DAC转换,然后DAC输出,这样会使主程序处于频繁被中断的状态,这会影响主程序的运行和其他中断的响应,所以定时器就设计了一个主模式,使用这个主模式可以把定时器的更新事件映射到触发输出TRGO(Trigger Out)的位置,然后TRGO直接接到DAC的触发转换引脚上,这样,定时器的更新就不需要再通过中断来触发DAC转换了,仅需要把更新事件通过主模式映射到TRGO,然后TRGO就会直接区触发DAC,整个过程不需要软件的参与,实现了硬件自动化,这就是主模式的作用,当然除了主模式外,还有更多硬件自动化的设计(后续讲)

4.基本定时器仅支持向上计数模式

5.基本定时器时钟源只能选择:内部时钟,也就是系统频率72MHz

通用定时器

知识点

1.通用定时器和高级定时器支持向上计数模式、向下计数模式和中央对齐模式。

2.对于通用定时器,时钟源可以选择内部时钟或者外部时钟

3.第一个外部时钟就是来自TIMx_ETR引脚上的外部时钟

参考:TIM定时中断

4.第二个外部时钟可以是来自其他定时器的信号ITR,通过这一路就可以实现定时器级联的功能

5.输出比较和输入捕获功能

通用定时器结构图的右下角即为定时器的输出比较功能的结构,如下图所示。每个通用定时器和高级定时器都有有四个输出通道,每个通道都有一个捕获比较寄存器,分别对应CH1到CH4的引脚,可以用来输出PWM波形,驱动电机。

![[Pasted image 20240803161604.png]]
中间的捕获/比较寄存器是输入捕获和输出比较电路共用的,CH1到CH4的引脚也是共用的,所以输入捕获和输出比较不能同时使用。

高级定时器

知识点

1.高级定时器拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能**。

2.重复次数计数器 提升定时时间

在申请中断的的信号输出处,增加了一个重复次数计数器,它的作用是:可以实现每隔几个计数周期,才发生一次更新事件和中断。原来的结构是每个计数周期完成后就都会发生更新,现在这个计数器实现每隔几个周期再更新一次,相当于对输出的更新信号又作了一次分频。(对于高级定时器,我们之前计算的最大定时时间59秒多,在这里就还需要再乘一个65536,也就是提升了很多的定时时间)

关于代码方面的知识点:
1.定时器初始化之后,立马清除中断标志位

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);

之后立马接一个

TIM_ClearFlag(TIM2,TIM_FLAG_Update);

	//选择时基单元的时钟,选择内部时钟;若不调用这个函数,系统上电也是默认是内部时钟
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	/*在TIM_TimeBaseInit函数的最后,会立刻生成一个更新事件,来重新装载预分频器和重复计数器的值
	预分频器有缓冲寄存器,我们写入的PSC和ARR只有在更新事件时才会起作用
	为了让写入的值立刻起作用,故在函数的最后手动生成了一个更新事件
	但是更新事件和更新中断是同时发生的,更新中断会置更新中断标志位,手动生成一个更新事件,就相当于在初始化时立刻进入更新函数执行一次
	在开启中断之前手动清除一次更新中断标志位,就可以避免刚初始化完成就进入中断函数的问题*/
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);

2.定时器默认的时钟源是内部时钟,为系统主频

3.仅高级定时器使用

//在使用高级定时器输出PWM时。需要调用这个函数,使能输出。否则PWM将不能正常输出
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
相关推荐
CV金科1 小时前
蓝桥杯-STM32G431RBT6(解决LCD与LED引脚冲突的问题)
c语言·stm32·单片机·嵌入式硬件·蓝桥杯
每天的积累2 小时前
STM32与ESP8266的使用
stm32·单片机·嵌入式硬件
小手智联老徐3 小时前
MATLAB 从 R2024B 开始支持树莓派 5
嵌入式硬件·matlab·树莓派
千千道13 小时前
STM32的寄存器深度解析
stm32·单片机·物联网
Whappy00116 小时前
51单片机-DS18B20(温度传感器)&AT24C02(存储芯片) & IIC通信-实验2-温度实时监测(可设置阈值)
单片机·嵌入式硬件·51单片机
Whappy00116 小时前
51单片机-AT24C02(IIC总线介绍及其时序编写步骤)-第一节(下一节实战)
单片机·嵌入式硬件·51单片机
JT灬新一16 小时前
ARM驱动学习之5 LEDS驱动
arm开发·单片机·学习
Chambor_mak18 小时前
stm32单片机个人学习笔记3(GPIO输出)
stm32·单片机·学习
机器未来20 小时前
基于FPGA的SD卡的数据读写实现(SD NAND FLASH)
arm开发·嵌入式硬件·fpga开发