STM32F429 >> 14. TIM_(一)_基本定时器

发布者:czl55555最新更新时间:2019-08-29 来源: eefocus关键字:STM32F429  TIM  基本定时器 手机看文章 扫描二维码
随时随地手机看文章

将定时器和GPIO 结合起来使用可以实现非常丰富的功能,例如测量输入信号的脉冲宽度、产生输出波形、产生PWM 控制电机状态等。


STM32F42xxx 系列控制器有 2 个高级控制定时器、10 个通用定时器和 2 个基本定时器,还有 2 个看门狗定时器

控制器上所有定时器都是彼此独立的,不共享任何资源。

在这里插入图片描述


其中最大定时器时钟可通过 RCC_DCKCFGR 寄存器配置为 90MHz 或者 180MHz。

就功能上来说通用定时器包含所有基本定时器功能,而高级控制定时器包含通用定时器所有功能。


基本定时器

基本定时器主要两个功能:


第一就是基本定时功能,生成时基;

第二就是专门用于驱动数模转换器(DAC)。

基本定时器有两个,TIM6 和 TIM7,功能完全一样,但所用资源彼此都完全独立,可以同时使用。


功能框图

在这里插入图片描述

首先先看绿色框内容,第一个是带有阴影的方框,方框内容一般是一个寄存器名称,比如图中主体部分的自动重载寄存器(TIMx_ARR)或 PSC 预分频器(TIMx_PSC),这里要特别突出的是阴影这个标志的作用,它表示这个寄存器还自带有影子寄存器,在硬件结构上实际是有两个寄存器,源寄存器是我们可以进行读写操作,而影子寄存器我们是完全无法操作的,有内部硬件使用。影子寄存器是在程序运行时真正起到作用的,源寄存器只是给我们读写用的,只有在特定时候(特定事件发生时)才把源寄存器的值拷贝给它的影子寄存器。多个影子寄存器一起使用可以到达同步更新多个寄存器内容的目的。


图中的自动重载寄存器有影子寄存器,它左边有一个带有“U”字母的事件图标,表示在更新事件生成时就把自动重载寄存器内容拷贝到影子寄存器内。


寄存器右边的事件图标、中断和DMA 输出图标表示在自动重载寄存器值与计数器寄存器值相等时生成事件、中断和 DMA输出。


1. 时钟源

使用定时器之前都必须开启定时器时钟,基本定时器属于 APB1 总线外设。


基本定时器时钟只能来自内部时钟,高级控制定时器和通用定时器还可以选择外部时钟源或者直接来自其他定时器等待模式。


我们可以通过 RCC 专用时钟配置寄存器(RCC_DCKCFGR)的 TIMPRE 位设置所有定时器的时钟频率,我们一般设置该位为默认值 0,使得表中可选的最大定时器时钟为 90MHz,即基本定时器的内部时钟(CK_INT)频率为 90MHz。


基本定时器只能使用内部时钟,当 TIM6 和 TIM7 控制寄存器 1(TIMx_CR1)的 CEN 位置 1 时,启动基本定时器,并且预分频器的时钟来源就是 CK_INT。


2. 控制器

定时器控制器控制实现定时器功能,控制定时器复位、使能、计数是其基础功能,基本定时器还专门用于 DAC 转换触发。


3. 计数器

基本定时器计数过程主要涉及到三个寄存器内容,分别是计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR),这三个寄存器都是 16 位有效数字,即可设置值为 0 至 65535。


首先看上图中预分频器 PSC,它有一个输入时钟 CK_PSC 和一个输出时钟CK_CNT。输入时钟 CK_PSC 来源于控制器部分,基本定时器只有内部时钟源所以CK_PSC 实际等于 CK_INT,即 90MHz。在不同应用场所,经常需要不同的定时频率,通过设置预分频器 PSC 的值可以非常方便得到不同的 CK_CNT,实际计算为:fCK_CNT 等于 fCK_PSC/(PSC[15:0]+1)。


下图是将预分频器 PSC 的值从 1 改为 4 时计数器时钟变化过程。原来是 1 分频,CK_PSC 和 CK_CNT 频率相同。向 TIMx_PSC 寄存器写入新值时,并不会马上更新CK_CNT 输出频率,而是等到更新事件发生时,把 TIMx_PSC 寄存器值更新到影子寄存器中,使其真正产生效果。更新为 4 分频后,在 CK_PSC 连续出现 4 个脉冲后 CK_CNT 才产生一个脉冲。

在这里插入图片描述


在定时器使能(CEN 置 1)时,计数器 COUNTER 根据 CK_CNT 频率向上计数,即每来一个 CK_CNT 脉冲,TIMx_CNT 值就加 1。当 TIMx_CNT 值与 TIMx_ARR 的设定值相等时就自动生成事件并 TIMx_CNT 自动清零,然后自动重新开始计数,如此重复以上过程。为此可见,我们只要设置 CK_PSC 和 TIMx_ARR 这两个寄存器的值就可以控制事件生成的时间,而我们一般的应用程序就是在事件生成的回调函数中运行的。在 TIMx_CNT 递增至与 TIMx_ARR 值相等,我们叫做为定时器上溢。


自动重载寄存器 TIMx_ARR 用来存放于计数器值比较的数值,如果两个数值相等就生成事件,将相关事件标志位置位,生成 DMA 和中断输出。TIMx_ARR 有影子寄存器,可以通过 TIMx_CR1 寄存器的 ARPE 位控制影子寄存器功能,如果 ARPE 位置 1,影子寄存器有效,只有在事件更新时才把TIMx_ARR 值赋给影子寄存器。如果 ARPE 位为 0,修改TIMx_ARR 值马上有效。


4. 定时器周期计算

定时事件生成时间主要由 TIMx_PSC 和 TIMx_ARR 两个寄存器值决定,这个也就是定时器的周期。比如我们需要一个 1s 周期的定时器,假设先设置 TIMx_ARR 寄存器值为 9999,即当 TIMx_CNT从 0 开始计算,刚好等于 9999 时生成事件,总共计数 10000 次,那么如果此时时钟源周期为 100us 即可得到刚好 1s 的定时周期。

接下来问题就是设置 TIMx_PSC 寄存器值使得 CK_CNT 输出为 100us 周期(10000Hz)的时钟。预分频器的输入时钟 CK_PSC 为 90MHz,所以设置预分频器值为(9000-1)即可满足。


初始化结构体


在这里插入图片描述

TIM_Prescaler:定时器预分频器设置。时钟源经该预分频器才是定时器时钟,它设定TIMx_PSC 寄存器的值。可设置范围为 0 至 65535,实现 1 至 65536 分频。


TIM_CounterMode:定时器计数方式。可设为向上计数、向下计数以及三种中心对齐模式。基本定时器只能是向上计数,即 TIMx_CNT 只能从 0 开始递增,并且无需初始化。


TIM_Period:定时器周期。实际就是设定自动重载寄存器的值,在事件生成时更新到影子寄存器。可设置范围为 0 至 65535。


TIM_ClockDivision:时钟分频。设置定时器时钟 CK_INT 频率与数字滤波器采样时钟频率分频比,基本定时器没有此功能,不用设置。


TIM_RepetitionCounter:重复计数器。属于高级控制寄存器专用寄存器位,利用它可以非常容易控制输出 PWM 的个数。这里不用设置。


基本定时器编程要点:

开启基本定时器时钟;

设置定时器周期和预分频器;

启动定时器中断,并开启定时器;

编写定时器中断服务函数。

bsp_tim.h

/**

  ******************************************************************************

  * @file    bsp_tim.h

  * @author  Waao

  * @version V1.0.0

  * @date    29-Jan-2019

  * @brief   This file contains some board support package's definition for the TIM.

  *            

  ******************************************************************************

  * @attention

  *

  * None

*

  ******************************************************************************

  */

#ifndef __BSP_TIM_H_

#define __BSP_TIM_H_



#include



//================ TIM ==================

#define TIM_ TIM6

#define TIM_CLK               RCC_APB1Periph_TIM6


//============== Interrupt ==============

#define TIM_Interrupt         TIM6_DAC_IRQn



void TIM_Config(void);



#endif


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

bsp_tim.c

输入时钟频率为90MHz,预分频器设置为9000,周期设置为5000,故触发一次需时钟跳动45M次,即半个时钟周期,即0.5s


/**

  ******************************************************************************

  * @file    bsp_tim.c

  * @author  Waao

  * @version V1.0.0

  * @date    29-Jan-2019

  * @brief   This file contains some board support package's functions for the TIM.

  *            

  ******************************************************************************

  * @attention

  *

  * None

*

  ******************************************************************************

  */



#include



/**

  * @brief  Initialize the TIM.

  * @param  None  

  * @retval None

  */

void TIM_Config(void)

{

TIM_TimeBaseInitTypeDef BASE_TIM_InitStructure;

RCC_APB1PeriphClockCmd(TIM_CLK, ENABLE);

BASE_TIM_InitStructure.TIM_Prescaler = 9000-1;

BASE_TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;

BASE_TIM_InitStructure.TIM_Period = 5000-1;

TIM_TimeBaseInit(TIM_, &BASE_TIM_InitStructure);

TIM_ClearFlag(TIM_, TIM_FLAG_Update);

TIM_ITConfig(TIM_, TIM_IT_Update, ENABLE);

TIM_Cmd(TIM_, ENABLE);

}


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

stm32f4xx_it.c

经检验,每经过0.5s,该中断会连续触发两次,但只有一次是TIM 更新中断成功置位的,故在中断函数中,需判断是否触发TIM 更新中断,否则中断函数代码将被执行两次


/**

  * @brief  This function handles TIM6_DAC_IRQHandler.

  * @param  None

  * @retval None

  */

void TIM6_DAC_IRQHandler(void)

{

timer++;

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

{

LED1_TOGGLE;

TIM_ClearITPendingBit(TIM_, TIM_IT_Update);

printf("n%d", timer);

}

}

关键字:STM32F429  TIM  基本定时器 引用地址:STM32F429 >> 14. TIM_(一)_基本定时器

上一篇:STM32 的中断配置很烦人怎么办?
下一篇:STM32F429 >> 2. LED_Library_Function

推荐阅读最新更新时间:2024-11-17 15:30

STM8S定时器基本中断定时
STM8S的定时器分三类; 高级定时器TIM1 通用定时器TIM2,TIM3,TIM5 基本定时器TIM4,TIM6 其中除TIM4和TIM6是8位定时器外,其他的定时器都是16位计数的。 每个定时器都具有自动重装载功能 每个定时器的时钟都可以由系统时钟独立分频而来,其中高级定时器TIM1可以选择65536种分频,分频系数为1-65536.通用定时器可以选择16种分频,基本定时器只能选择8种分频。 除了TIM1可以选择计数方向外,其他的定时器都是向下计数的,而技术手册上说的向上计数是错误的。 基本中断定时用到的寄存器; 一、自动装载寄存器高位(TIMx_ARRH) 和 自动装载寄存器低位(TIMx_
[单片机]
stm8 tim4 测速显示
/******************************************************************* 实验名称及内容:PWM测速度并显示 配套书籍:《深入浅出STM8单片机入门、进阶与应用实例》《STM8实战》 实验平台及编程人员:骨灰级菜鸟 / #include iostm8s208mb.h //主控芯片的头文件 #include “stdio.h” /端口/引脚定义/ #define LCDRS_SET PF_ODR|=0x01 //置位PF0 #define LCDRS_CLR PF_ODR&=0xFE //清0PF0 #define LCDRW_SET PF_ODR|=0x0
[单片机]
stm8 <font color='red'>tim</font>4 测速显示
STM32定时TIM2触发ADC采样,使用DMA保存结果
1.adc.h文件 //ADC-------------------------------------------------------------------------// #ifndef __EVAL_ADC_H #define __EVAL_ADC_H // Includes ------------------------------------------------------------------// #include stm32f10x.h #include eval.h // Exported types ------------------------------
[单片机]
stm32F429中断优先级相关知识
最近用到f429比较多,故对相关中断知识点作下梳理,随时更行。。。 1 .systick的优先级到底比外设高还是低呢? 1、只要内核的优先级可以配置,那么内核的优先级就不是一定比外设的高,而是要先比较软件优先级,如果软件优先级一样,那么就比较他们的硬件的中断编号,编号就是在中断向量表中的位置,越小,优先级越高。 2、以systick为例,在systick的固件库初始化函数:SysTick_Config(uint32_t ticks) 中,调用了NVIC_SetPriority (SysTick_IRQn, (1 __NVIC_PRIO_BITS) - 1); ,这里面把 systick的 优先级配置为 :1 4-1 = 15,这里
[单片机]
STM32CubeMX(Keil5)开发之路——5定时器中断TIM
运行环境 Windows10 STM32CubeMX___Version 5.0.0 Keil5(MDK5)___Version 5.15 简介 本例程主要讲解如何使用定时器实现一个定时器中断,每秒打印一串数据 STM32CubeMx基本配置 基础配置过程请参考 STM32CubeMx(Keil5)开发之路—配置第一个项目 为了方便调试,重定向printf,进行usart设置 1——点击USART1进行设置 2——模式选择Asynchronous异步传输 3——可以看到右边自动出现了Tx和Rx 4——可以自行设置波特率,停止位,校验位等参数 1——点击Clock Configuration进行设置 2——注意这几个地
[单片机]
STM32CubeMX(Keil5)开发之路——5<font color='red'>定时器</font>中断<font color='red'>TIM</font>
C51单片机定时器T0,T1的常用基本设置
有时候带手机不方便,可以又想知道时间,这时候可以用蜂鸣器做一个音频的时间提醒器,每60秒发一声提醒 提醒器计时可以使用单片机的定时器T0、T1来做,计时的定时器用T1来做,工作在方式2(8位自动装载),系统运行提示的定时器用T0来做,工作在方式1(16位定时) 代码如下 #include reg52.h #define uint unsigned int #define uchar unsigned char #define time_set0 5000//设置定时器0的计时长度 #define th0 (65536-time_set0)/256//计算定时器高8位装入值 #define tl0 (65
[单片机]
STM32学习笔记——高级定时器TIM1更新中断配置
stm32高级定时器TIM1,更新中断初始化配置和普通定时器差别不大,需要注意的是结构IM_TimeBaseInitTypeDef中TIM_RepetitionCounter配置问题。TIM_RepetitionCounte是用来配置重复计数,就是重复溢出多少次才给你来一个溢出中断,只有高级定时器需要配置。下面是官方库中对它的注释: 它对应的寄存器叫TIM1_RCR.如果这个值不配置,上电的时候寄存器值可是随机的,本来1秒中断一次,可能变成N 秒中断一次。下图是stm32参考手册中对该寄存器的详细解释: 总结一下高级定时器溢出中断配置的步骤: 1,时钟使能 2,配置预分频、自动重装值和重复计数值 3,清除中断标志
[单片机]
STM32编程之用TIM定时器的输入捕获功能红外遥控解码
1、主程序 #include sys.h #include usart.h #include led.h #include lcd.h #include delay.h #include remote.h #include stm32f10x_tim.h /* 程序功能:用STM32的定时器输入捕获功能进行红外解码。 当按下红外遥控器的按键时,LCD显示键值和连按的次数; 同时串口也输出同样的数据。 日期:2015年7月27日 地点:湖北工业职业技术学院电子工程系 硬件连接: PA1---TIM5_CH2; */ int main(void) { u8 i=0; d
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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