功能
它有基本定时器所有功能,还增加以下功能
TIM2、TIM3、TIM4、TIM5
多种时钟源:
外部时钟源模式1:
每个定时器有四个输入通道
只有通道1和通道2的信号可以作为时钟信号源
通道1 和通道2 的信号经过输入滤液和边缘检测器
外部时钟源模式2:
可以向上计数也可以向下计数还可以两者都用(*对其模式)
输入捕获
输出比较
PWM生成
支持针对定位的增量(正交)编码器和霍尔传感器电路。
框图
通用定时器相关寄存器
捕获比较寄存器TIMx_CCMR1(有四个):输入捕获,输出比较
输出比较8种模式:三位来控制
冻结
强制输出高电平:条件计数器=比较寄存器
强制输出低电平:条件计数器=比较寄存器
输出翻转:等于60 会将电平翻转
强制输出高电平:无条件
强制输出低电平:无条件
PWM模式1:CNT<CCR 输出低电平
CNT>=CCR 输出高电平
PWM模式2:CNT>CCR 输出低电平
CNT<=CCR 输出高电平
OC1M和OC2M是相同的。
先配置CC2S位,配置输入还是输出。
CCM2
剩下两个通道
CCEN
使能
CCR1
比较的值
计数器寄存器TIM_CNT
计数器的值
CR1控制寄存器
配置计数方式,*
案例1:LED呼吸灯——PWM脉冲
需求
使用通用定时器的输出比较功能
(输出比较功能)专门输出PWM脉冲
输出占空比可调的PWM波形,作用到二极管,使二极管(LED2)呈现呼吸灯的效果。
PWM波:
PWM(Puls-width modulation)脉冲宽度调制,不停地修改高电平的宽度。一般用于控制点击、LED亮度调节等应用。
被控制的电路必须要有一定的“惯性”。
所谓惯性时指,比如LED即使断电了,也不会立即熄灭,点击断定了也不会立即停止。
三个参数:周期、频率、占空比( 正脉冲的持续时间与脉冲总周期的比值。)
输出比较原理:
比较寄存器的值和计数器的进行大小比较
根据比较结果(> = <)不同,产生不同的输出:高电平或者低电平。
比较寄存器中的值不会变,计数器的值会变大或者变小
tim5.c
#include "tim5.h"
void TIM5_Init(void){
//1. GPIO PA1的配置(是默认复用功能不需要AFIO1)
//1.1 放时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
//复用推挽
GPIOA->CRL |= GPIO_CRL_CNF1_1;
GPIOA->CRL &= ~GPIO_CRL_CNF1_0;
GPIOA->CRL |= GPIO_CRL_MODE1;
//2.定时器 tim5 的配置
//2.1 先放时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;
//三大块
// 控制器(时钟源)配置 默认不改就是就是72MHz
//时基单元
//输入和输出通道
//2.2 时基单元
//2.2.1 计数方向(默认像上,其实可以不用配置)
TIM5->CR1 |= TIM_CR1_DIR;
//2.2.2 预分频
TIM5->PSC = 7200 - 1;
//2.2.3 自动重装载
TIM5->ARR = 100 - 1;
//3 输入输出通道
//3.1 让通道2使用输出模式(默认就是输出,可以不用配置)
TIM5->CCMR1 &= ~TIM_CCMR1_CC2S;
//3.2 配置比较寄存器 具体的比较模式 (8选1 我们选择PWM模式1)
TIM5->CCMR1 |= (TIM_CCMR1_OC2M_1|TIM_CCMR1_OC2M_2);
TIM5->CCMR1 &= ~TIM_CCMR1_OC2M_0;
//3.3 低电平有效,为了让CCR的值 能很好地表示亮度
TIM5->CCER |= TIM_CCER_CC2P;
}
void TIM5_PWMStart(void){
//计数器是使能
TIM5->CR1 |= TIM_CR1_CEN;
//通道2使能
TIM5->CCER |= TIM_CCER_CC2E;
}
void TIM5_PWMStop(void){
//关闭计数器使能
TIM5->CR1 &= ~TIM_CR1_CEN;
//关闭通道2使能
TIM5->CCER &= ~TIM_CCER_CC2E;
}
void TIM5_SetDuty(uint16_t duty){
TIM5->CCR2 = duty;
}
tim5.h
#ifndef __TIM5_H__
#define __TIM5_H__
#include "stm32f10x.h"
void TIM5_Init(void);
void TIM5_PWMStart(void);
void TIM5_PWMStop(void);
void TIM5_SetDuty(uint16_t duty);
#endif /* __TIM5_H__ */
main.c
#include "usart1.h"
#include "string.h"
#include <stdio.h>
#include "m24c02.h"
#include "i2c.h"
#include "led.h"
#include "systick.h"
#include "tim6.h"
#include "tim5.h"
typedef enum {
LIGHT,
DARK
}LED_DIRCT;
int main(void)
{
TIM5_Init();
TIM5_PWMStart();
LED_DIRCT direct = LIGHT;
while (1)
{
if (direct == LIGHT)
{
for (uint8_t i = 0; i < 100; i++)
{
TIM5_SetDuty(i);
Delay_ms(10);
}
direct = DARK;
}else if(direct == DARK){
for (uint8_t i = 0; i < 100; i++)
{
TIM5_SetDuty(99-i);
Delay_ms(10);
}
direct = LIGHT;
}
}
}