STM32-基本定时器TIM6-TIM7基本定时功能

发布者:WhisperingWaves最新更新时间:2023-10-17 来源: elecfans关键字:STM3  基本定时器  TIM6  TIM7 手机看文章 扫描二维码
随时随地手机看文章

  1. STM32的Timer简介

  STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。

定时器计数器分辨率计数器类型预分频系数产生DMA请求捕获/比较通道互补输出
TIM1
TIM8
16位向上,向下,向上/向下1-65536之间的任意数可以4
TIM2
TIM3
TIM4
TIM5
16位向上,向下,向上/向下1-65536之间的任意数可以4没有
TIM6
TIM7
16位向上1-65536之间的任意数可以0没有

  其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生。TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。

  2基本定时器TIM6-TIM7

  2.1 时钟基本特征

  基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC) 提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。

  2.2 TIM6-7主要特征

  TIM6和TIM7定时器的主要功能包括:

  ● 16位自动重装载累加计数器

  ● 16位可编程( 可实时修改)预分频器,用于对输入的时钟按系数为1~65536 之间的任意数值

  分频

  ● 触发DAC的同步电路

  ● 在更新事件(计数器溢出)时产生中断/DMA 请求

  图144 基本定时器框图

STM32-基本定时器TIM6-TIM7基本定时功能
 

  2.3 计数器模式

  TIM6-TIM7可以由向上计数。向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。

  2.4 TIM6-TIM7基本定时器的寄存器

  1.TIM6和TIM7控制寄存器1(TIMx_CR1)

  ARPE :自动重装载预装载使能 (Auto-reload preload enable) 0:TIMx_ARR 寄存器没有缓冲 1:TIMx_ARR 寄存器具有缓 冲

  URS:更新请求源 (Update request source)

  该位由软件设置和清除,以选择UEV事件的请求源。

  0:如果使能了中断或DMA,以下任一事件可以产生一个更新中断或DMA请求:

  - 计数器上溢或下溢

  - 设置UG位

  - 通过从模式控制器产生的更新

  1:如果使能了中断或DMA,只有计数器上溢或下溢可以产生更新中断或DMA请求。

  UDIS:禁止更新 (Update disable)

  该位由软件设置和清除,以使能或禁止UEV事件的产生。

  0:UEV使能。更新事件(UEV) 可以由下列事件产生:

  - 计数器上溢或下溢

  - 设置UG位

  - 通过从模式控制器产生的更新

  产生更新事件后,带缓冲的寄存器被加载为预加载数值。

  1 :禁止UEV。不产生更新事件(UEV) ,影子寄存器保持它的内容(ARR 、PSC)。但是如果设置

  了UG位或从模式控制器产生了一个硬件复位,则计数器和预分频器将被重新初始化。

  CEN:计数器使能 (Counter enable)

  0:关闭计数器

  1:使能计数器

  2.TIM6和TIM7控制寄存器2(TIMx_CR2)

  3. TIM6和TIM7 DMA/中断使能寄存器(TIMx_DIER)

  UDE:更新DMA请求使能

  0:禁止更新DMA请求

  1:使能更新DMA请求

  UIE:更新中断使能

  0:禁止更新中断

  1:使能更新中断

  4 。 TIM6和TIM7状态寄存器(TIMx_SR)

  UIF:更新中断标志 (Update interrupt flag) 硬件在更新中断时设置该位,它由软件清除。

  0:没有产生更新。

  1:产生了更新中断。下述情况下由硬件设置该位:

  – 计数器产生上溢或下溢并且TIMx_CR1 中的UDIS=0;

  – 如果TIMx_CR1 中的URS=0并且UDIS=0,当使用TIMx_EGR 寄存器的UG位重新初始化计数器CNT时。

  5. TIM6和TIM7事件产生寄存器(TIMx_EGR)

  UG:产生更新事件 (Update generation) 该位由软件设置,由硬件自动清除。

  0:无作用

  1 :重新初始化定时器的计数器并产生对寄存器的更新。注意:预分频器也被清除( 但预分频系数不变)。

  6. TIM6和TIM7计数器(TIMx_CNT)

  CNT[15:0]:计数器数值 (Counter value)

  7 .TIM6和TIM7预分频器(TIMx_PSC)

  PSC[15:0] :预分频器数值 (Prescaler value) 计数器的时钟频率CK_CNT 等于f CK_PSC/(PSC[15:0]+1) 。

  在每一次更新事件时,PSC的数值被传送到实际的预分频寄存器中。

  8 .TIM6和TIM7自动重装载寄存器(TIMx_ARR)

  ARR[15:0] :自动重装载数值 (Prescaler value) ARR的数值将传送到实际的自动重装载寄存器中。

  如果自动重装载数值为0,则计数器停止。

  2.5 编程步骤

  1. 配置优先级;

  2. 使能时钟

  3. 配置GPIO;

  4. 配置TIME;

  5.使能计数器;

  6.开中断;

  7.清除标志位;

  具体配置如下:

  (1) NVIC_Configuration(void);配置优先级

  (2) void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)使能时钟

  (3) void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);配置GPIO

  (4) TIM_Configuration (void);配置TIM6/TIM7

  (5) TIM_Cmd(TIM7, ENABLE);使能定时器

  (6) TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);使能中断

  (7) TIM_ClearFlag(TIM7, TIM_FLAG_Update);清除标志位

  步骤(4)中的预分频系数用来确定TIMx所使用的时钟频率,具体计算方法为:CK_INT/(TIM_Perscaler+1)。CK_INT是内部时钟源的频率,是根据2.1中所描述的APB1的倍频器送出的时钟,TIM_Perscaler是用户设定的预分频系数,其值范围是从0 – 65535。

  步骤(4)中的时钟分割定义的是在定时器时钟频率(CK_INT)与数字滤波器

  (ETR,TIx)使用的采样频率之间的分频比例。TIM_ClockDivision的参数如下表:

TIM_ClockDivision描述二进制值
TIM_CKD_DIV1tDTS = Tck_tim0x00
TIM_CKD_DIV2tDTS = 2 * Tck_tim0x01
TIM_CKD_DIV4tDTS = 4 * Tck_tim0x10


 

  步骤(4)中需要禁止使用预装载缓冲器。当预装载缓冲器被禁止时,写入自动装入的值(TIMx_ARR)的数值会直接传送到对应的影子寄存器;如果使能预加载寄存器,则写入ARR的数值会在更新事件时,才会从预加载寄存器传送到对应的影子寄存器。

  ARM中,有的逻辑寄存器在物理上对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);设计preload register和shadow register的好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的preload register的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadow register,或者preload register和shadow register是直通的,即软件更新preload register时,同时更新了shadow register,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。

  3. 程序源代码

  本例实现的是通过TIM7的定时功能,使得LED灯按照1s的时间间隔来闪烁

 

  原理图:

STM32-基本定时器TIM6-TIM7基本定时功能

  /*

  * 文件名: main.c

  * 内容简述:

  * 从0开始创建一个工程,通过按键1触发中断1实现灯1的闪亮

  * 再通过按键2触发中断抢占 中断1实现小灯2的闪亮

  *

  * 2个LED指示灯,对应的GPIO为 : PC3 PC1

  * 输出为0点亮LED

  * 输出为1关闭LED

  * 2个按键 对应 PB7 PA11

  */

  #include “stm32f10x.h”

  /* 延时函数 */

  void Delay(__IO uint32_t nCount)

  {

  //__IO 就是volatile,加上这个后可以避免延时函数被编译器优化掉

  for(;nCount != 0; nCount--);

  }

  /* GPIO配置函数 */

  void GPIO_Configuration(void)

  {

  /*定义2个结构体变量 */

  GPIO_InitTypeDef GPIO_InitStructure;

  /*开启GPIOB,GPIOC ,复用口时钟的 时钟 */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);

  /*给GPIO_InitStructure.GPIO_Pin GPIO_InitStructure.GPIO_Mode GPIO_InitStructure.GPIO_Speed付初始值*/

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

  // 将连接LED3的GPIO设置为推挽输出

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  //设置为10MHZ的速度

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  //初始化GPIOC

  GPIO_Init(GPIOC, &GPIO_InitStructure);

  }

  /********配置优先级*****************/

  void NVIC_Configuration(void)

  {

  //定义一个结构体

  NVIC_InitTypeDef NVIC_InitStructure;

  //设置优先级组

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0) ;

  //设置 TIM7线

  NVIC_InitStructure.NVIC_IRQChannel =TIM7_IRQn;

  //使能优先级

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  //配置抢断优先级

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;

  //配置响应优先级

  NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;

  NVIC_Init(&NVIC_InitStructure);

  //设置存入寄存器

  NVIC_SetVectorTable (NVIC_VectTab_FLASH ,0x0);

  }

  //*****定时器初始化*********

  void TIM_Configuration (void)

  {

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  // TIM_Cmd(TIM7, DISABLE);

  //预分频系数为36000-1,这样计数器时钟为72MHz/36000 = 2kHz

  TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;

  //设置时钟分割 TIM_CKD_DIV1=0x0000,不分割

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;

  //设置计数器模式为向上计数模式

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ;

  //设置计数溢出大小,每计2000个数就产生一个更新事件

  TIM_TimeBaseStructure.TIM_Period = 2000 - 1;

  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  //将配置应用到TIM7中

  TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure);

  TIM_UpdateRequestConfig( TIM7, TIM_UpdateSource_Regular);

  //使能计数器

  TIM_Cmd(TIM7, ENABLE);

  //使能中断

  TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);

  //清除标志位

  // TIM_ClearFlag(TIM7, TIM_FLAG_Update);

  }

  //*****************************

  //主函数

  int main(void)

  {

  /*

  这个函数是ST库中的函数,函数实体在

  LibrariesCMSISCoreCM3system_stm32f10x.c

  配置内部Flash接口,初始化PLL,配置系统时钟的频率

  系统时钟缺省配置为72MHz

  */

  GPIO_Configuration ();

  NVIC_Configuration ();

  TIM_Configuration ();

  while(1)

  {

  }

  }

  it.c中的程序

  void TIM7_IRQHandler(void)

  {

  //检测是否发生溢出更新事件

  if(TIM_GetITStatus(TIM7, TIM_IT_Update)== SET)

  {

  GPIOC-》ODR ^= GPIO_Pin_3;

  TIM_ClearITPendingBit(TIM7 , TIM_FLAG_Update);

  }

  }

  编程心得:

  1.注意应用定时器是要开的使能 TIM_Cmd(TIM7, ENABLE)-计数器使能 TIM_ITConfig (TIM7,TIM_IT_Update,ENABLE)-中断使能 RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM7,ENABLE)-时钟

  2.进入中断后一定要记得清楚标志位 TIM_ClearITPendingBit(TIM7 , TIM_FLAG_Update);


关键字:STM3  基本定时器  TIM6  TIM7 引用地址:STM32-基本定时器TIM6-TIM7基本定时功能

上一篇:如何采用STM32单片机读取可变长度数据到内存
下一篇:STM32为什么必须先配置时钟再配置GPIO?原因解析

推荐阅读最新更新时间:2024-10-14 19:55

STM32进阶之串口环形缓冲区实现 FIFO
队列的概念 在此之前,我们来回顾一下队列的基本概念: 队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除(出队)。 队列的特点 类似售票排队窗口,先到的人看到能先买到票,然后先走,后来的人只能后买到票 队列的常见两种形式 普通队列 在计算机中,每个信息都是存储在存储单元中的,比喻一下吧,上图的一些小正方形格子就是一个个存储单元,你可以理解为常见的数组,存放我们一个个的信息。 当有大量数据的时候,我们不能存储所有的数据,那么计算机处理数据的时候,只能先处理先来的,那么处理完后呢,就会把数据释放掉,再处理下一个。那么,已经处
[单片机]
STM32进阶之串口环形缓冲区实现 FIFO
STM32 HAL库学习系列第11篇---定时器TIM---看门狗基本配置及使用
基本配置 使用cube配置溢出时间 记住准时喂狗 独立看门狗: /* IWDG 1s 超时溢出 */ MX_IWDG_Init(IWDG_PRESCALER_64,625); /* 启动独立看门狗 */ HAL_IWDG_Start(&hiwdg); LED1_ON; /* while部分是我们在项目中具体需要写的代码,这部分的程序可以用独立看门狗来监控 * 如果我们知道这部 分代码的执行时间,比如是50ms,那么我们可以设置独立看门狗的 * 溢出时间是60ms,比50ms多一点, 如果要被监控的程序没有跑飞正常执行的话,那么 * 执行完毕之后就会执行喂狗的程序,如果程序跑飞
[单片机]
单片机定时器/计数器基本原理
本文主要学习定时器/计数器的基本概念。首先从日常生活中的计数和定时的概念入手,来理解定时器/计数器功能的实现逻辑。一个比较重要的知识点是溢出,当定时器/计数器计满时,会产生 溢出 的动作,进而产生中断。同时,还可以进一步了解实现定时或计数的三种主要的方法。 一、定时/计数的基本概念 定时和计数是日常生活和生产中最常见和最普遍的问题。 定时器和计数器功能基本上都是使用相同的逻辑实现的,而且这两个功能都包含输入的计数信号,本质上都是对脉冲计数。计数器用来计数并指示在任意间隔内输入信号(事件)的个数,而定时器则对规定间隔内输入的信号个数进行计数,用来指示经历的时间。 在单片机中,定时/计数器作定时功能用时,对机器周期计数(由单片机的
[单片机]
单片机<font color='red'>定时器</font>/计数器<font color='red'>基本</font>原理
STM32 TIM—基本定时器
STM32F4xx系列控制器有共有14个TIM定时器。其中2个高级控制定时器TIM1和TIM8、10 个通用定时器TIM2TIM5和TIM9TIM14、 2个基本定时器TIM6和TIM7。 各个定时器的特性如下: 三种定时器中基本定时器是最简单的,功能少,结构简单,我们先从简单的开始入手。 基本定时器主要两个功能,第一就是基本定时功能,生成时基,第二就是专门用于驱动数模转换器(DAC)。由于PWM波可以实现DAC的输出,所以一般也就不用到基本定时器的第二个功能了。控制器的两个基本定时器 功能完全一样,但所用资源彼此都完全独立,可以同时使用。 基本定时器 TIM6 和 TIM7是一个 16位向上递增的定时器,当在自动重载寄存
[单片机]
STM32 TIM—<font color='red'>基本</font><font color='red'>定时器</font>
STM32 使用TIM2_CH1(PA15) 输出10K PWM信号
PA15- TIM2 Remap CH1 1.apb_init() RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); 2.gpio_init() #define PWM_GPIO_IDX 8 //PA15 #define PWM_GRP GPIOA #define PWM_PIN GPIO_Pin_15
[单片机]
STM32——硬件和软件I2C协议
I2C协议 I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 对于通讯协议,我们以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。 I2C 物理层 物理层的特点 支持多个通讯主机和多个通信从机。 使用两条线 时钟线(SCL)和数据线(SDA)。 每个连接到总线的设备都有独立
[单片机]
STM32——硬件和软件I2C协议
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved