定时器
定时器
在stm32f4中文参考手册中可以看到,stm32f4一共有14个定时器,加上滴答定时器那就有15个。如下

基本定时器
基本定时器的功能只能拿来定时,没有通道的功能。
基本定时器 TIM6 和 TIM7 包含一个 16 位自动重载计数器,该计数器由可编程预分频器驱动。
此类定时器不仅可用作通用定时器以生成时基,还可以专门用于驱动数模转换器 (DAC)。实 际上,此类定时器内部连接到 DAC 并能够通过其触发输出驱动 DAC。
这些定时器彼此完全独立,不共享任何资源。说明每一个定时器都有自己的寄存器。
- 基本定时器(TIM6 和 TIM7)的特性包括:
16 位自动重载递增计数器,递增计数
16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数 介于 1 和 65536 之间
用于触发 DAC 的同步电路
发生如下更新事件时会生成中断/DMA 请求:计数器上溢

- 程序设计
- 必须先把改外设的文件加进来

- 查看相应的.c文件,查看如何使用

- 注意代码实际上不需要自己编写,根据上面的流程直接抄,在帮助手册中

根据上面的步骤抄下来。
/**
* @brief 定时器7的中断服务函数
* @note None
* @param None
* @retval None
*/
void TIM7_IRQHandler(void)
{
//判断中断源
if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)
{
/* Code */
//清除中断标志位
TIM_ClearITPendingBit(TIM7, TIM_IT_Update);
}
}
/**
* @brief 定时器7的初始化
* @note 预分频值和计数值已经设置好,计数10秒
* @param None
* @retval None
*/
void TIM7_Config()
{
//定义结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//使能定时器7的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
//给结构体成员赋值
TIM_TimeBaseStructure.TIM_Prescaler = 20000 - 1; //预分频值
TIM_TimeBaseStructure.TIM_Period = 42000 - 1; //计数次数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //递增计数
TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);
//配置NVIC中断
NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn; //设置中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//使能定时器更新中断
TIM_ITConfig(TIM7,TIM_IT_Update , ENABLE);
//使能定时器
TIM_Cmd(TIM7, ENABLE);
}
需要说一下的是这个结构体的成员
typedef struct
{
//预分频状值
uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock.
This parameter can be a number between 0x0000 and 0xFFFF */
//计数模式
uint16_t TIM_CounterMode; /*!< Specifies the counter mode.
This parameter can be a value of @ref TIM_Counter_Mode */
//重装载值
uint32_t TIM_Period; /*!< Specifies the period value to be loaded into the active
Auto-Reload Register at the next update event.
This parameter must be a number between 0x0000 and 0xFFFF. */
//这个参数是设置及分频,一般普通定时器不会设置
uint16_t TIM_ClockDivision; /*!< Specifies the clock division.
This parameter can be a value of @ref TIM_Clock_Division_CKD */
//这个参数只有高级定时器才会设置
uint8_t TIM_RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter
reaches zero, an update event is generated and counting restarts
from the RCR value (N).
This means in PWM mode that (N+1) corresponds to:
- the number of PWM periods in edge-aligned mode
- the number of half PWM period in center-aligned mode
This parameter must be a number between 0x00 and 0xFF.
@note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeDef;
通用定时器
- TIM2到TIM5简介
通用定时器包含一个 16 位或 32 位自动重载计数器,该计数器由可编程预分频器驱动。它们可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获)或生成输出波形(输出比较 和 PWM)。使用定时器预分频器和 RCC 时钟控制器预分频器,可将脉冲宽度和波形周期从几微秒调制到几毫秒。
- 特性
多达 4 个独立通道,可用于:
输入捕获
输出比较
PWM 生成(边沿和中心对齐模式)
单脉冲模式输出
- 发生如下事件时生成中断/DMA 请求:
更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
输入捕获
输出比较
- TIM9 到 TIM14 简介
TIM9 到 TIM14 通用定时器包含一个 16 位自动重载计数器,该计数器由可编程预分频器驱动。它们可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获),或者生成输出波形(输出比较、PWM)。使用定时器预分频器和 RCC 时钟控制器预分频器,可将脉冲宽度和波形周期从几微秒调制 到几毫秒。TIM9 到 TIM14 定时器彼此完全独立,不共享任何资源。
- 特性
16 位自动重载递增计数器(属于中等容量器件)16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 和 65536 之间
- 多达 2 个独立通道,可用于:
输入捕获
输出比较
PWM 生成(边沿对齐模式)
单脉冲模式输出
- 发生如下事件时生成中断:
更新:计数器上溢、计数器初始化(通过软件或内部触发)
触发事件(计数器启动、停止、初始化或者由内部触发计数)
输入捕获
输出比较
从上面的信息可以看到,TIM9-TIM14的计数器有16位最大是65535,并且每一个定时器都有两个独立的通道,以及可以递增计数。(TIM3 和 TIM4)的计数器是16位的,(TIM2 和 TIM5)的计数器是32位的,并且每一个定时器都有四个独立的通道,以及还可以递增、递减、中心对齐计数。
- 通道(以TIM9-TIM14为例)

输入捕获的功能比较简单和中断差不多,这里主要说明一下输出比较。
需要了解一个概念``PWM`,脉冲宽度调制。在一个周期内调节高电平的占比,高电平占整个周期的大小就是占空比。

- 输出比较的寄存器
为什么叫输出比较,看完下面就明白。

-
比较计数器的值和设定的值,来确定这个电平的占比。
-
输出比较(程序设计)
- 在工程中添加TIM.c的源文件
- 查看源文件的注释

- 根据上面的步骤,去帮助手册抄。注意:查看哪一个引脚具有哪一个复用功能去数据手册查看。
void OutputCompare_Config()
{
//定义结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能定时器13和GPIOF的时钟
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM13 , ENABLE);
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOF , ENABLE);
//给结构体成员赋值 ,计数时间设置为10ms,分为100次
TIM_TimeBaseStructure.TIM_Prescaler = 8400 - 1; //预分频值
TIM_TimeBaseStructure.TIM_Period = 100 - 1; //计数次数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //递增计数
TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);
//把GPIOF8设置为复用功能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOF, &GPIO_InitStructure);
//将GPIOF8设置复用到TIM13
GPIO_PinAFConfig(GPIOF, GPIO_PinSource8, GPIO_AF_TIM13);
//配置比较输出
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 50;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM13, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable);
//使能定时器
TIM_Cmd(TIM13, ENABLE);
}

浙公网安备 33010602011771号