TIM定时器中断

TIM(Timer)定时器

  • 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。
  • 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时。
  • 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。
  • 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。

计数器就是用来执行计数定时的寄存器,每来一个时钟,计数器加1。 预分频器,可以对计数器的时钟进行分频,使计数器更加灵活。
自动重装寄存器就是计数器的目标值,就是我要申请多少个时钟申请中断。

在这里插入图片描述

  • 注:一个高级定时器和三个通用定时器,没有基本定时器。

基本定时器

在这里插入图片描述
注:图上向上的折线箭头就会是一个计数值等于自动重装值产生的中断叫做更新中断。
向下的箭头表示是更新事件,更新事件不会触发中断,但是可以触发其他内部电路的工作。
计数器计数自增,同时不断地与自动重装寄存器进行比较,他俩值相等时,即计时时间到,这时会产生一个更新中断和更新事件,CPU响应更新中断,就完成定时中断任务了。

通用定时器

在这里插入图片描述
对于通用定时器来说,计数器模式有向上计数模式

  • 向上计数模式:计数器从0开始,向上自增,计到重装值,清0同时申请中断,然后开始下一轮,依次循环。
  • 向下计数模式:从重装值开始,向下自减,减到0之后,回到重装值同时申请中断,然后继续下一轮,依次循环。
  • 中央对齐的计数模式:从0开始,先向上自增,计到重装值,申请中断,然后在向下自减,减到0,在申请中断,然后继续下一轮,依次循环。
  • 基本定时器仅支持向上计数模式,通用定时器和高级定时器支持向上计数模式和向下计数模式和中央对齐计数模式。
  • 内外时钟源的选择和主从触发模式:基本定时器是内部时钟源,也就是72Mhz。通用定时器可以选择内部时钟和外部时钟。通用定时器可以通过ETR外部时钟,来配置外部时钟,叫外部触发时钟模式2。还有TRGI可以做外部时钟,叫外部时钟模式1。

ITR和定时器之间的关系
在这里插入图片描述
高级定时器
在这里插入图片描述

  • 与通用定时器相比,增加了一个重复次数计数器,可以实现每隔几个计数周期才发生一次更新事件和更新中断。原来的结构是每个计数周期完成后都会发生更新,现在有个计数器可以每隔几个周期在更新一次。
  • DTG死区生成电路,用于三相无刷电机,在开关关闭的瞬间,产生死区,防止直通。
  • BRK给电机驱动提供安全保障的。刹车输入功能,如果外部引脚TIMx_ BKIN产生了刹车信号或者内部时钟失效,那么控制电路,就会自动切断电机的输出,防止意外的发生,这就是刹车输入功能。

定时中断的基本结构

在这里插入图片描述
CK_PSC预分频器的输入时钟,内部时钟一般是72MHZ
CNT_EN计数器使能,高电平计数器正常运行,低电平计数器停止。
CK_CNT计数器时钟,即是预分频器的时钟输出,也是计数器时钟输入。当计数值计到和重装值相等时,并下一个时钟来临时,计数值才清0,同时产生一个更新事件,这是一个计数周期的工作流程。

预分频器为了防止计数中途更改数值造成错误,设计了缓冲寄存器,计数器同理。

在这里插入图片描述
CK_INT:内部时钟72MHZ
CNT_EN:时钟使能,高电平启动
计数器也有缓冲寄存器的,但用和不用可以自己设置,无预装时序是没有缓冲寄存器的,通过使用ARPE,可以选择是否使用预装功能

在这里插入图片描述
有预装时序是没有缓冲寄存器的
在这里插入图片描述
引入自动加载影子寄存器目的是同步,就是让值的变化和更新事件同步发生,防止在运行途中更改造成的错误。

RCC时钟树

在这里插入图片描述
这个时钟树就是stm32用来产生和配置时钟,并把配置好的时钟发送到各个外设的系统。
在这里插入图片描述
左边的时钟是产生电路,右边的是时钟分配电路,中间SYSCLK是系统时钟,72MHZ。
在时钟产生电路有4个震荡源,分别是内部的8MHZ高速RC振荡器:HAI RC,外部的4-16MHZ的高速石英晶体振荡器:HSE OSC,也就是晶振,一般接8MHZ,外部的32.768KHZ低速晶振:LSE OSC,一般是提供给RTC时钟的,最后是内部的40KHZ低速RC振荡器:LSI RC,提供给开门狗的。

另还有个CSS,这个是时钟安全系统 ,也是负责切换时钟的,它可以监测外部时钟的运行状态,一旦外部时钟失效,它就会自动把外部时钟切回内部时钟,保证系统时钟的运行, 防止程序卡死。

时钟分配电路:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F4系列微控制器中的定时器(TIM)模块可以用于生成定时中断。在使用TIM定时器中断时,通常需要进行以下步骤: 1. 配置TIM定时器的基本参数:选择定时器的时钟源、预分频值和计数模式等,这些参数决定了定时器的工作频率和计数范围。 2. 配置定时器的自动重装载寄存器(ARR)和预分频寄存器(PSC):设置定时器的计数周期和预分频系数,以确定定时器的定时周期。 3. 配置定时器的工作模式:选择定时器的工作模式,比如单脉冲模式、重复模式或连续模式等。 4. 启用定时器中断:使能定时器中断,并设置中断优先级。 5. 编写中断处理函数:在中断处理函数中编写需要执行的代码,比如更改输出状态、处理数据等。 6. 启动定时器:使能定时器开始计数。 下面是一个使用TIM2定时器中断的示例代码: ```c #include "stm32f4xx.h" void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { // 中断处理代码 // ... TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } int main(void) { // 初始化配置代码 // 使能定时器2中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 配置定时器2 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 1000; // 定时周期为1ms TIM_TimeBaseStructure.TIM_Prescaler = 8400 - 1; // 预分频系数为8400,定时频率为10kHz TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 清除定时器2的中断标志位 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 使能定时器2的更新中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 启动定时器2 TIM_Cmd(TIM2, ENABLE); while (1) { // 主循环代码 // ... } } ``` 以上代码中,我们使用了TIM2定时器,并配置了1ms的定时周期。在中断处理函数`TIM2_IRQHandler`中,可以编写需要执行的代码。在主循环中,可以编写其他的程序逻辑。 希望这个简单的示例对你有所帮助!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值