通用定时器可以用来: 1、测量输入信号的脉冲长度,也就是输入捕获(请对此四字短语养成良好的形象哈) 2、产生输出波形,也就是输出比较或者PWM(同上)% |2 H' |0 ^6 c" @5 `1 l 那葵花兄,通用的原理呢?又见葵花兄坦然自若的说:通用定时器是一个通过可编程预分频器(PSC)(注:这三个字母要有印象哈)驱动的16位自动装载计数器(CNT)(注:同上)构成。 好了,大家撇开葵花兄,把焦点重新聚焦在我身上、那通用定时器有什么功能呢?我想肯定有人马上反应:有定时的功能、、额、、我也不能说你错是吧、、那我来具体点吧,其实也不是我具体,多亏了“葵花宝典”第STM32篇中文参考手册 : 1) 16 位向上 、向下 、向上/向下自动装载计数器 (TIMx_CNT)。4 B# I* g9 E, r; j h4 R, I 2) 16 位可编程( 可以实时修改 )预分频器(TIMx_PSC)(TIMx_PSC)(TIMx_PSC),计数器时钟频率的分系为 1~ 65535 之间的任意数值。: q; Z% I% W, h" f T6 T- S& w; @ 3)4个独立通道( TIMx_CH1~4 TIMx_CH1~4 TIMx_CH1~4 TIMx_CH1~4)2 I3 h5 S3 F, G& O/ h" { A.输入捕获 B.输出比较 C.PWM 生成 (边缘或中间对齐模式 )6 {8 b3 P6 q; e9 H- i D.单脉冲模式输出 4)可使用外部信号( TIMx_ETR )控制定时器和互连(可以用1个定时器控制另外一个定时器)的同步电路。 5)如下事件发生时产生中断/DMA: A.更新:计数器向上溢出/向下溢出,计数器初始化 ( 通过软件或者内部 /外部触发 ) B.触发事件 (计数器启动、停止初始化或者由内部/外部触发计数 ) C.输入捕获 , T; u# }( p, r0 ] D.输出比较 E.支持针对定位的增量 (正交 )编码器和霍尔传感电路 4 c% @; ]( |; }8 O) ^: x' ~ F.触发输入作为外部时钟或者按周期的电流管理 当然啦,在此博客中不考虑那么多功能先哈、、先淡定、、若是被吓到了、、先去喝杯茶压压惊哈、、那我们怎么来实现定时的功能呢? 只要定时、当达到一定容量时,就会发生溢出、、聪明的人又知道我要说什么了吧?世上太多聪明的人了、、没错了、、把中断这位兄弟叫上、让溢出兄和中断兄合身、、(省略合身等待的时间)、对了、诞生了溢出中断、我们给取个好听的名字:更新中断、在这里,我们是利用中断来定时的、、 接下来,容小弟介绍下与此博客有关系的寄存器(具体的位是什么功能我就不讲了哈,因为我们是采用库而不是操作寄存器,想知道的可以参考中文参考手册哈),大家掌声响起:欢迎控制兄(TIMx_CR1) " m9 f2 C; \; N & Y) E {+ K) z 欢迎中断/DMA使能兄(TIMx_DIER): ; J F( f9 P! f 欢迎预分频器兄(TIMx_PSC): 欢迎自动重装载寄存器兄(TIMx_ARR): / M$ l/ A0 Y, ]; H5 `7 z4 g# O- o 好了、、这四位可以在旁边休息了(我们就不介绍了)、、因为我们的重点:库兄要出现了,接下来,用最热烈的掌声欢迎: 首先:有请挂载时钟大神ABP1(为什么要请这位大神呢?因为我们的通用定时器是挂载在这位ABP1的,证据如下) 再者,我们有请第二大神:初始化大神:TIM_TimeBaseInit(为什么是他呢?为什么?究竟是为什么?啊哈、、请看) 看到了吧、、所以请不要怀疑大神的地位哈、、至于参数具体是哪些,大家可以打开#include "stm32f10x_tim.h"哈,在这里就不多说了、、相信大家都是聪明人、 前两位大神出来了,我们还有大神、、哎、、大神无处不在、、来、有请类型中断使能大神 void TIM_ITConfig(TIM_TypeDef* TIMx, u16 TIM_IT, FunctionalState NewState) 看到中断、、大家又有想到什么猫腻没??条件发射就是这样炼成的、、没错了、、就是中断优先级设置大神啦、、这个大家应该有印象、我就不细说了哈,没印象的话这位大神可就要躲到某个角落伤心了, 看到以上大神、、其实还有一位大神没出现、、此大神没出现、、其他大神啥都不是、、对了、就是定时器启动大神 void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) 好了、、最后,编写中断服务函数,在中断函数里检查中断标志位和清中断标志位,还有你想要做的事,相信大家也是比较熟悉的了、、 在这里,我们来谈谈时钟的问题、、大家可以看到系统时钟树图里: 看到我美丽销魂的涂鸦没、、由于我的系统时钟初始化是36MHZ的、而且设置APB1的预分频系数为2,所以定时器的时钟就为72MHZ,大家可以根据自己的系统时钟设置选择哈、、 到此,我们来总结下使用中断的定时器: 1.开启挂载在ABP1上的TIM3的时钟 2.对定时器进行初始化 3.设置中断类型 4.设置中断优先级 5.开启定时器3 6.编写中断服务函数 看一下参考代码:
好了、、说到这里、、通用果然是通用的、、对于所有的通用定时器都是同样的原理、、在这里我们只是实现了简单的定时(值加到某个程度就更新产生中断,通过LED灯显示)、、希望大家多多指教、、本博客比较滑稽、、望大家莫怪哈、、有什么说错的地方请像抓腐败那样提出来哈、、我虚心向您请教、、谢谢大家、、 |
X-NUCLEO-IKS4A1实现手势滑动
STM32G系列RS485自动收发控制以及自适应波特率实战
STM32G0系列ADC扫描序列模式解读
STM32固件库分享,超全系列整理
【经验分享】FPGA作为从机与STM32进行SPI协议通信---Verilog实现
【管管推荐】STM32经验分享篇
STM32G030F6P6基于HAL库模拟SPI驱动1.8寸TFT LCD屏幕
STM32的CAN FD位定时设置注意事项
基于STM32将移植 SBSFU 到 STM32G070过程分享
基于STM32G030 RAM不够用经验分享