STM32 通用定时器的定时功能 学习笔记

发布者:静静思索最新更新时间:2018-12-10 来源: eefocus关键字:STM32  通用定时器  定时功能 手机看文章 扫描二维码
随时随地手机看文章

这节主要讲下STM32 通用定时器的定时功能。


一、TIMx的时钟源问题:


STM32有8路寄存器,包括TIM1和TIM8两个高级定时器,TIM6和TIM7两个基本定时器,TIM2-TIM5四个通用定时器,定时器是完全独立的,而且没有互相共享任何资源,它们可以一起同步操作,所有TIMx定时器在内部相连,用于定时器同步或链接。当一个定时器处于主模式时,它可以对另一个处于从模式的定时器的计数器进行复位、启动、停止或提供时钟等操作。其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。


1)定时器的时钟:


计数器时钟可由下列时钟源提供: 


 1:内部时钟(CK_INT) 


 2:外部时钟模式1:外部输入脚(TIx) 


 3:外部时钟模式2:外部触发输入(ETR) 


 4:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。


这些时钟,具体选择哪个可以通过TIMx_SMCR寄存器的相关位来设置。这里的CK_INT时钟是从APB1倍频的来的,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,当APB1的时钟不分频的时候,通用定时器TIMx的时钟就等于APB1的时钟。这里还要注意的就是高级定时器的时钟不是来自APB1,而是来自APB2的。


2)定时器的核心:


说到定时器的核心,自然少不了两个,一个是计数时钟(每隔多长时间计一次),二是计多少次溢出,这两个就共同决定了溢出时间。定时器的计数时钟根据定时器的不同分别来自APB1或APB2,计数时钟说白了就是要把一秒分成很多份,但由于总线时钟一般在数十兆,经过分频的APB也在数十兆,所以要把APB再分频至更低的频率,这就需要设置预分频寄存器。例如当前APB1为36MHz,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,因此分频至10KHz需要设置预分频器寄存器TIMx_PSC(如下图)为7199,为什么是7199而不是7200呢?


下面寄存器介绍说明了这点:计数器时钟CK_CNT等于TIMx时钟/(PSC+1),所以只需设置寄存器值7199就行了。


这里10KHz的频率相当于把一秒分为10000份,即0.0001秒,定时器每隔0.0001秒涨一次。


注:因为PSC是16位寄存器,所以值范围为0-65535。


计数器自动重装载寄存器TIMx_ARR,该寄存器存放的就是计数器要增加的次数(计多少次溢出)。


注:因为ARR也是16位寄存器,所以值范围为0-65535。


这样这两个寄存器决定了溢出时间,接着上面的例子,如果设置ARR寄存器值为5000,那就是说定时器每隔0.0001秒涨一次,总共涨5000次,这样就是0.5秒溢出一次。


总结下来,定时器的溢出公式为:溢出时间(秒)= ((ARR+1)*(PSC+1))/ TIMx时钟CK_INT(MHz)


定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。


下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;


当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。


假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;


当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);


当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。


有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?


答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;


设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。


再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。


如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。


二、TIM通用定时器配置步骤:


1.配置TIM时钟  


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);


2.定时器基本配置


void TIM2_Configuration(void)

{

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;


TIM_DeInit(TIM2); //复位TIM2定时器


TIM_TimeBaseStructure.TIM_Period = 5-1;        // 2.5ms    

TIM_TimeBaseStructure.TIM_Prescaler = 36000-1;    // 分频36000      

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 时钟分频 

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 计数方向向上计数

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);



TIM_ClearFlag(TIM2, TIM_FLAG_Update);



TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); 



TIM_Cmd(TIM2, ENABLE);      

}



TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间。

TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间。

TIM_ClockDivision的作用是做一段延时,一般在特殊场合的时候会用到,可不关心。

TIM_CounterMode选择了计数器模式:

TIM_CounterMode_Up                       //TIM向上计数模式

TIM_CounterMode_Down                     //TIM向下计数模式

TIM_CounterMode_CenterAligned1   //TIM中央对齐模式1计数模式

TIM_CounterMode_CenterAligned2   //TIM中央对齐模式2计数模式

TIM_CounterMode_CenterAligned3   //TIM中央对齐模式3计数模式

单片机时钟频率72MHz,APB1 二分频36MHz,故TIM2自动2倍频至72MHz,故定时器中断频率为72000000/36000/5=400Hz


3.使能定时器中断TIM_Cmd(TIM2, ENABLE);


4.配置NVIC。


    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4; 

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);


5.写中断函数


void TIM2_IRQHandler(void)

{

......//中断处理

}   


--------------------- 


作者:LIUYONG19 


来源:CSDN 


原文:https://blog.csdn.net/LIUYONG19/article/details/75383854 


版权声明:本文为博主原创文章,转载请附上博文链接!


关键字:STM32  通用定时器  定时功能 引用地址:STM32 通用定时器的定时功能 学习笔记

上一篇:STM32 通用定时器的输出PWM功能 学习笔记
下一篇:stm32 USART_IT_IDLE中断 一帧数据

推荐阅读最新更新时间:2024-03-16 16:19

STM32基础设计(5)---ADC转换(中断方式)
本文简单介绍了STM32F103C8,通过中断方式读取电压,不过最后楼主读取参考电压失败,还没有找到错误,所以读取的电压只能十六进制显示,如有不便请忽略本文! 本文的介绍按照一般流程来走: 1,串口的初始化 2,ADC初始化 3,中断初始化 4,编写中断函数 5,编写主函数 接下来详细介绍: 1,串口的初始化: void usart_init() { GPIO_InitTypeDef Uart_A; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE); Uart_A.GPIO_Pin = GPIO_Pin_9; Uar
[单片机]
关于STM32串口使用DMA的教程
1 前言 直接存储器访问(Direct Memory Access),简称DMA。DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”(拷贝)的组件,数据拷贝过程不需CPU干预,数据拷贝结束则通知CPU处理。 因此,大量数据拷贝时,使用DMA可以释放CPU资源。DMA数据拷贝过程,典型的有: 内存— 内存,内存间拷贝 外设— 内存,如uart、spi、i2c等总线接收数据过程 内存— 外设,如uart、spi、i2c等总线发送数据过程 2 串口有必要使用DMA吗 串口(uart)是一种低速的串行异步通信,适用于低速通信场景,通常使用的波特率小于或等于115200bps。 对于小于或者等于
[单片机]
关于<font color='red'>STM32</font>串口使用DMA的教程
FreeModbus for stm32(Keil工程)——精简Modbus slave协议
1、测试环境Keil MDK 4.7a stm32f103c8, PB12为输出线圈,可以通过Modbus Poll来控制线圈的输出状态。 2、通过ModbusProt.h配置硬件、数据缓冲区大小和功能码配置 3、移植要点为Port.c和Port.h 定时器操作在stm32平台下基本不用改 a、定时器初始化; xMBPortTimersInit() b、开定时器及中断; vMBPortTimersEnable() c、关定时器及中断; vMBPortTimersDisable() d、定时器溢出中断服务程序;TIME_IQR_HANDLER() 串口操作: a、串初始化; xMBPortS
[单片机]
FreeModbus for <font color='red'>stm32</font>(Keil工程)——精简Modbus slave协议
stm32位带操作中对内存的浅显理解
基础知识 进制   计算机以二进制代码储存信息,每个二进制数表示一位 (bit),每8个二进制数表示一个字节 (Byte) , 而再往上的KB,就是210倍的字节,总结有以下进制关系。 1 Byte = 8 bit 1 KB = 1024Byte(210=1024) 1 MB = 1024KB 1 GB = 1024MB 1 GB = 230Byte 内存地址   内存地址使用16进制数表示,内存地址只是一个编号表示,一个内存空间,计算机以字节存储数据,所以一个内存地址对应的应该是一个字节(8 bit)的大小,这个之后会详细解释。 这里用32位机的内存做一个图例。32位机的内存地址用8位16进制数表示。 0x00000
[单片机]
<font color='red'>stm32</font>位带操作中对内存的浅显理解
基于MSP430、STM32的2.4G无线游戏遥控器实现
历时7天,跨度两个多星期,才将微型四轴的遥控器调试好,中间除了备考两科考试,其余时间全在宿舍蹭网消磨青春,不得不说状态不好,实际上内心也极度的空虚。 之前将微型四轴的机体做好,迫不及待的进行了一下测试,天真的以为,飞机不用遥控器也可以,实际上我设想的是直接用手头的开发板对其进行简单的增减速,为此我还 特意为它写了一个触摸控制界面,只有三个触控点,一个加速,一个减速,一个停止,非常无聊。 后来发现,没有一个遥控器真的非常不方便,周六便去二手市场仅用5元便淘得一飞机遥控器,里面电池都还没用完,质量算上乘。这遥控器是红外遥控的,用手机看了下红外管,能够正常发光实际上,我当然最希望直接对现有电路进行一下线路修改就实现最方便了,事情
[单片机]
基于MSP430、<font color='red'>STM32</font>的2.4G无线游戏遥控器实现
STM32编译出现 Error[Li005]: no definition for "assert_param"
如果出现这个错误,请增加预编译内容: USE_STDPERIPH_DRIVER 如图
[单片机]
<font color='red'>STM32</font>编译出现 Error[Li005]: no definition for
基于STM32F103C8T6 MCU的STM32 Blue Pill Board接口
在本教程中,我将介绍如何将DHT11湿度和温度传感器与基于STM32F103C8T6 MCU的STM32 Blue Pill Board接口。DHT11传感器的值由STM32读取,并显示在I2C LCD显示屏上。 介绍 传感器是很小的设备,可以弥合原始模拟世界与MCU的数字世界之间的鸿沟。传感器可以非常简单,例如非常著名的LM35温度传感器,也可以是一些复杂的数学单元,例如MPU6050陀螺仪和加速度计组合传感器。 简单或复杂,传感器是许多消费,汽车,机器人和工业应用中的关键部分,如果不集成适当的传感器就无法完成某些应用。 让我们从工业应用程序扩展到日常项目和业余爱好者。气象站是一个非常普遍且受欢迎的项目,无论是物联网
[单片机]
stm32 外部中断知识介绍
中断分类 STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18: 线0~15:对应外部 IO口的输入中断。线16:连接到 PVD 输出。线17:连接到 RTC 闹钟事件。线18:连接到 USB 唤醒事件。 触发方式 :STM32 的外部中断是通过边沿来触发的,不支持电平触发。 外部中断分组: STM32 的每一个GPIO都能配
[单片机]
<font color='red'>stm32</font> 外部中断知识介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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