一、什么是定时器
对于stm32f103系列单片机,其定时器是一个通过可编程预分频器驱动的,16位自动装载计数器。
- 可编程预分频器驱动
- 计数器是16位的
- 自动装载
二、STM32中的定时器
定时器种类 | 捕获/比较通道 | 互补输出 | 特殊应用场景 |
---|
基本定时器(TIM6,TIM7) | 0 | 无 | 主要应用于驱动DAC | 通用定时器(TIM2~TIM5) | 4 | 无 | 通用。定时器技术,PWM输出,输入捕获,输出比较 | 高级定时器(TIM1,TIM8) | 4 | 有 | 带死区控制盒紧急刹车,可应用于PWM电机控制 |
三、通用定时器基本原理
-
位于低速的APB1总线上 -
16位的,计数值在1到65535之间调节 -
支持向上、向下和向上/向下(也即中央对齐)3种计数模式; -
重装载值自动装载 -
含有16位可编程预分频器(也即TIMx_PSC寄存器),计数器时钟频率分频系数可以在1到65535之间调节 -
含有4个独立通道(也即CH1到CH4),每个通道都可以用来:输入捕获、输出比较、pwm生成以及单脉冲模式输出; -
可以使用外部信号(TIMx_ETR)控制定时器之间的级联 -
如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器)
- 更新事件,也即计数器向上或向下溢出;
- 触发事件,也即计数器启动、停止、初始化等;
- 输入捕获;
- 输出比较;
- 支持针对定位的增量(正交)编码器和霍尔传感器电路
- 触发输入作为外部时钟,或者按周期的电流管理。
-
每个通用定时器都是完全独立的,之间不共享任何资源,不会产生相互干扰就制约。
四、时钟系统
-
STM32有5个时钟源:HSI、HSE、LSI、LSE、PLL
- HSI是高速内部时钟,RC振荡器,频率约为8MHz,精度不高
- HSE是高速外部时钟,可接石英/陶瓷谐振器,或者外接时钟源,频率范围为4~16MHz
- LSI是低速内部时钟,RC振荡器,频率约为40kHz,提供低功耗时钟。WDG
- LSE是低速外部时钟,接频率为32.768kHz石英晶体。RTC
- PLL为锁相环倍频输出,其时钟输入可选择HSI2、HSE或者HSE/2。倍频可选择2~16倍,但是其输出频率不超过72MHz
-
系统时钟 SYSCLK可来源于三个时钟源
-
STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟 -
有2条总线,AHB总线和APB总线,APB总线又分为低速APB1总线和高速APB2总线 -
任何一个外设在使用之前,必须首先使能其相应的时钟
五、计数器模式
通用定时器可以使用向上计数、向下计数、中央对齐(向上向下)计数模式。
Tout(溢出时间) = (ARR+1)(PSC+1) / Tclk
六、PWM输出配置步骤
-
使能定时器3和相关IO口时钟。
- 使能定时器3时钟:
RCC_APB1PeriphClockCmd(); - 使能GPIOB时钟:
RCC_APB2PeriphClockCmd(); -
初始化IO口为复用功能输出。函数:GPIO_Init(); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-
这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置, 所以需要开启AFIO时钟。同时设置重映射。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
-
初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
参数 | 代码 | 备注 |
---|
计数 | TIM_Period | arr | 预分频数 | TIM_Prescaler | psc | 时钟分割 | TIM_ClockDivision | 通常用于输入捕获PWM直接等于0 | 计数模式 | TIM_CounterMode | 向上、向下向上/向下 |
-
初始化输出比较参数: TIM_OC2Init();
参数 | 代码 | 备注 |
---|
选择定时器模式 | TIM_OCMode | TIM_OCMode_PWM2 | 比较输出使能 | TIM_OutputState | ENABLE/DISABLE | 输出极性 | TIM_OCPolarity | 高/低 |
-
使能预装载寄存器: TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); -
使能定时器。TIM_Cmd(); -
不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();
|