TIM简介
TIM(Timer):定时器
定时器基本功能:定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 //定时触发中断
定时器其他功能:不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
组成:16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
1/(72M/65536/65536)= 59.65
注意:定时器支持级联模式
TIM分类
根据复杂度和应用场景分为了
高级定时器:最复杂
通用定时器:中等复杂、最常用
基本定时器:最简单
STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4
类型 | 编号 | 总线 | 功能 |
---|---|---|---|
高级定时器 | TIM1、TIM8 | APB2 | 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能 |
通用定时器 | TIM2、TIM3、TIM4、TIM5 | APB1 | 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能 |
基本定时器 | TIM6、TIM7 | APB1 | 拥有定时中断、主模式触发DAC的功能 |
基本定时器
时基单元:预分频器、计数器、自动重装载寄存器
功能:计数、定时
时钟源:默认72MHz //只能选择内部时钟
预分频器:对72Mhz的计数时钟进行预分频 //实际分频=预分频+1
预分频器=0,CK_CNT=72MHz //不分频
预分频器=1,CK_CNT=36MHz //2分配
最大分频数为65535
计数器:对预分频后的计数数字进行计数,计数时钟每来一个上升沿,计数器的值就加1,最大可以加到65535 //仅支持向上计数
自动重装载寄存器:存储计数目标,计数到,产生中断信号,清零计数器
更新中断:计数值等于自动重装值产生的中断
输出:
上方箭头产生中断,更新中断
下方箭头产生事件,更新事件
DAC:把跟新事件通过主模式映射到TRGO,TRGO触发DAC,不需要软件参数,实现硬件的自动化
通用定时器
时基单元
核心:时基单元 //和基本定时器一样
计数模式:向上计数、向下计数、中央对齐 //通用定时器和高级定时器
向上计数:从0到计数目标,向上自增
向下计数:从计数目标到0,向下自减
中央对齐模式:从0开始向上计数到目标,产生一个溢出;再从目标向下计数,参数一个下溢,依次循环
内外时钟源选择
1.内部时钟源:72MHz
2.外部时钟源:
1.TIMx_ETR引脚上的外部时钟,通过ETRF给预分频器,这一路也叫外部时钟模式2
2.TRGI,用作触发输入来使用,可以触发定时器的从模式,TRGI当作外部时钟来使用,叫外部时钟模式1 //会占用触发输入通道
3.其他:
TIMx_CH1、TIMx_CH2 //这个上升沿和下降沿都有效
TI1FP1和TI2FP2获得
级联:
把跟新事件通过主模式映射到TRGO,TRGO触发DAC/ADC,然后接到其他定时器ITR上
其他硬件
输出比较电路
通道数:4
功能:输出PWM波形
输入捕获电路
通道数:4
功能:测量输入方波频率
捕获/比较寄存器
输入捕获和输出比较共用
高级定时器
重复次数计数器:实现每隔几个计数周期才发生一次更新事件和更新中断
DTG:死区生成电路
互补输出:前三路输出引脚变为两个,可以输入一对互补的PWM波,方式开关切换瞬间,由于器件不理想,造成短暂的直通现象,所以接入死区生成电路
刹车输入:给电机驱动提供安全保障,如果引脚BKIN产生刹车信号或内部时钟失效,产生故障,自动切断输出,防止意外发生
基本结构
时钟部分:
内部时钟:72MHz
ETR外部时钟:外部时钟模式2
ITRx其他定时器:外部时钟模式1
TIx捕获通道:编码器模式,编码器独用模式
时基单元:
预分频器:
计数器:
自动重装载器:
中断输出:
重复计数器(高级定时器):
中断输出控制:中断状态寄存器置标志位,标志位通过终端输出控制,到NVIC申请中断,需要就允许,不需要就禁止
时序
实时时钟:
RTC时钟,用于提供年、月、日、时、分、秒和星期等的实时时间信息,由后备电池供电,当你晚上关闭系统和早上开启系统时,RTC仍然会保持正确的时间和日期。
系统时钟:
是一个存储于系统内存中的逻辑时钟。用于系统的计算,比如超时产生的中断异常,超时计算就是由系统时钟计算的。这种时钟在系统掉电或重新启动时每次会被清除。
CPU时钟:
即CPU的频率,当然这里的时钟频率指的是工作频率,即外频,还有什么主频=外频×倍频
预分频时序
//分频系数1到2
CK_PSC:输入时钟
CNT_EN:高电平使能时钟
CNT_CNT:分频后时钟
计数:计数到自动重装载置产生更新事件,并清零,计数时改变分频数需要等待到计数清零后才能更新分哦数 //FC为计数目标
预分频控制寄存器:写入的分频数
预分频缓冲器:也称影子寄存器,真正起作用寄存器,实际分频数
//如果某时刻将预分频改变,若立刻改变分频系数,将导致一个计数周期内,前后不断频率不一样
预分频计数器:预分频器内部实际上也是靠计数来分频
当预分频值为0时,计数器就一直为0,输出原频率
当预分频值为1时,计数器0、1、0、1
计数器计数频率CK_CNT=CK_PSC/(PSC+1)
无预装
有预装
RCC时钟树
时钟是所有外设运行基础,时钟是最先需要配置的东西
主函数之前还有执行SystemInit函数,用来配置时钟树
时钟产生电路: //左半部分
震荡源:
高速晶振: //提供系统时钟,AHB、APB2、APB1
RC振荡器:8MHz
石英晶体振荡器HSE:4-16MHz,一般为8MHz //比RC更稳定
低速晶振:
低速晶振LSE:外部32.768KHz,一般给RTC提供时钟
低速RC振荡器:内部40KHz,给看门狗提供时钟
工作方式:
1.启动内部时钟,选择RC振荡器8MHz作为系统时钟
2.启动外部时钟,进入PLL锁相环倍频,得到72MHz
错误:
当外部时钟出现问题,72MHz变为内部8MHz,慢10倍
CSS:时钟安全系统
复杂切换时钟,检测外部时钟的运行状态,一但外部时钟失效,自动把外部时钟切换到内部时钟,保证系统时钟运行,防止程序卡死造成事故
时钟分配电路: //右半部分
SYSCLK经过AHB 1分频,在经过APB1 2分配(APB1最大36MHz),得到36MHz,下方频率x2提供给定时器2~7频率72MHz;APB2 1分频,下方频率x1提供给定时器1和8频率72MHz //预分频数在SystemInit分配
无论是高级定时器、通用定时器、基本定时器,内部基准时钟都是72MHz
定时中断编程
步骤
1.RCC开启时钟
RCC_APB1PeriphClockCmd
2.选择时基单元的时钟源 //定时中断默认选择内部时钟
TIM_InternalClockConfig
3.配置时基单元
TimeBaseInit
4.配置输出中断控制,允许更新中断输出到NVIC
ITConfig
5.配置NVIC,在NVIC中打开定时器中断通道,配分配优先级
6.允许控制,使能计数器
不使能不计数;使能后计数;计数器更新触发中断
学习资源:
哔哩哔哩江科大自化协STM32视频资料