STM32通用定时器配置

发布者:ByteWanderer最新更新时间:2017-02-04 来源: eefocus关键字:STM32  通用定时器  配置 手机看文章 扫描二维码
随时随地手机看文章

一、STM32通用定时器原理                        

    STM32 系列的CPU,有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。

下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图:

从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。

下面以通用定时器2的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。

可能有同学还是有点不理解,OK,我们举一个例子说明。假定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提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时。

Stm32外设用户手册,如图:

再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。

              

TIMER_cfg(); //定时器的配置


       //开启定时器2


 TIM_Cmd(TIM2,ENABLE);


voidTimer_Config(void)


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); 


    TIM_DeInit(TIM2);


    TIM_TimeBaseStructure.TIM_Period=2000-1;  //自动重装载寄存器的值


    TIM_TimeBaseStructure.TIM_Prescaler=(36000-1);         //时钟预分频数


    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);                              /开启时钟




我们每个语句都来解释一下。首先我们想使用定时器,就必须使能定时器的时钟,这就是函数RCC_APB1PeriphClockCmd();,通过它开启 RCC_APB1Periph_TIM2。

TIM_DeInit(TIM2);该函数主要用于复位TIM2定时器,使之进入初始状态。

然后我们对自动重装载寄存器赋值,TIM_Period的大小实际上表示的是需要经过TIM_Period次计数后才会发生一次更新或中断。接下来需要设置时钟预分频数TIM_Prescaler,这里有一个公式,我们举例来说明:例如时钟频率=72MHZ/(时钟预分频+1)。说明当前设置的这个TIM_Prescaler,直接决定定时器的时钟频率。通俗点说,就是一秒钟能计数多少次。比如算出来的时钟频率是2000,也就是

一秒钟会计数2000次,而此时如果TIM_Period设置为4000,即4000次计数后就会中断一次。由于时钟频率是一秒钟计数2000次,因此只要2秒钟,就会中断一次。

再往后的代码,还有一个需要注意的,TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;就是我们一般采用向上计数模式,即每次计数就会加1,直到寄存器溢出发生中断为止。最后别忘了,需要使能定时器!!

发生中断时间=(TIM_Prescaler+1)* (TIM_Period+1)/FLK

 用上述公式可算出:发生中断时间 (2000-1+1)*(36000-1+1)/72000000=1 秒

步骤五:编写中断服务程序。同样需要注意的,一进入中断服务程序,第一步要做的,就是清除掉中断标志位。由于我们使用的是向上溢出模式,因此使用

的函数应该是:TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);。



每跳一下0.1ms


关键字:STM32  通用定时器  配置 引用地址:STM32通用定时器配置

上一篇:(七)嵌入式系统异常程序远程定位
下一篇:S3C2440看门狗电路分析

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

一种实现对RFID移动读写器自动配置的方法
  1 引言   近年来,在现有的RFID 应用中,RFID 读卡器或者与固定专网连接进行数据、配置的实时同步,或者采用先记录、后上传的方法进行非实时的数据、配置同步两种方式来监控、管理读卡的数据与状态信息。以现在的带移动读卡器的RFID 应用公交收费系统为例,读卡器其实并不是实时与系统通信的。其工作模式为:读卡器对标签进行读取、修改后,将对应条目记录在读卡器内 。待每天下班后,由收费系统的工作人员持特定设备来读取这些条目和维护终端系统,完成数据、配置同步。这样的模式有很大的缺点:如不能实时监控运行系统,无法在短时间内挂失;当读卡器的配置信息遭人恶意修改或内置软件出现故障时,远端系统无法及时知晓。随着RFID 系统的更大规模的
[网络通信]
用DSP实现CPLD多方案现场可编程配置
在继电保护测试装置中, 既有复杂的算法, 又涉及多种检测与控制方案。用DSP实现算法和多方案的配置,用CPLD进行实时检测和控制,是一种较好的独立运行模式。一般CPLD的配置依靠专用配置PROM或下载电缆来完成。本文介绍基于DSP的CPLD多方案现场可编程配置方法。 1 总体描述 系统中的DSP采用TI公司的定点数字信号处理器TMS320C5402。它采用4总线4级流水线的增强型哈佛结构,处理速度为100MIPS;具有片内4K%26;#215;16位的ROM和16K%26;#215;16位的DARAM, 2个多通道缓冲串行口(McBSP),1个直接存储控制器(DMA)等片内外围电路;外部可扩展至1M%26;#215;16位存储
[嵌入式]
基于STM32在喷绘机喷头控制系统的设计与实现
0 引言 由于喷绘机喷绘过程中采用的是压电喷头工作原理,为保证喷绘出图像清晰细腻,喷绘机需要在同一温度下提供稳定的驱动电压对压电晶体进行控制。如何在精准的条件下根据室内温度实时、快速、方便地更改驱动电压和配置数据值得研究。 1 系统设计理念 喷头的驱动电压VDD2(t)取决于喷头容积电压Vrank、基于不同厂家不同颜色的油墨粘滞度而提供每色油墨与标准油墨的修正值Voffset电压、不同颜色的油墨在不同温度下需要的驱动电压补偿值Vdiff(t),即VDD2(t)=Vrank+Voffset+Vdiff(t)。不同颜色的油墨在不同的温度下驱动电压的补偿值Vdiff(t),称之为T-V数据。 不同厂家油墨温压数据不同,厂家会根据
[单片机]
基于<font color='red'>STM32</font>在喷绘机喷头控制系统的设计与实现
vivo X7配置完全曝光 6月30日正式发布
    本文转自TechWeb   本月30号,也就是周四,vivo将在京举办发布会,公布X7/X7 Plus两款新品。   泄露的渲染图   现在工信部数据库中,vivo X7/X7L正式入网,只是证件照尚未公开,不过配置已经是没悬念了。   此前vivo已经公开确认,X7将搭载高通骁龙8976处理器(骁龙652),4GB+64GB存储组合,整合前置指纹识别、1600万像素前置Moonlight柔光灯摄像头。   工信部的资料进一步指出,X7将拥有一块5.2英寸1080P OLED显示屏,电池容量2930mAh,三围147.3×71.85×7.24(mm),重量151g,比较轻薄,标配全网通。   
[手机便携]
STM32大小端模式与堆栈及其增长方向
栈增长和大端/小端问题是和CPU相关的两个问题. 1,首先来看:栈(STACK)的问题. 函数的局部变量,都是存放在 栈 里面,栈的英文是:STACK.STACK的大小,我们可以在stm32的启动文件里面设置,以战舰stm32开发板为例,在startup_stm32f10x_hd.s里面,开头就有: Stack_Size EQU 0x00000800 表示栈大小是0X800,也就是2048字节.这样,CPU处理任务的时候,函数局部变量做多可占用的大小就是:2048字节,注意:是所有在处理的函数,包括函数嵌套,递归,等等,都是从这个 栈 里面,来分配的. 所以,如果一个函数的局部变量过多,比如在函数里面定义一个u8 buf
[单片机]
<font color='red'>STM32</font>大小端模式与堆栈及其增长方向
STM32定时器更新事件可以暂停否?
有人使用STM32的定时器的输出比较功能,具体就是输出4个通道的PWM信号。不过 他需要不定时地调整4个通道的占空比,即调整他们的CCR值。但现在有个小问题,那就是新的CCR值的获得往往会能跨越多个目前定时器的计数周期,这样的话,即使开启各个通道CCR值的预装功能,似乎也很保证做到一次性修改。因为它希望新的CCR值被同时更新。换句话说,他担心不同通道新的CCR值分散在不同计数周期生效,可能给应用带来些麻烦。 我们知道,STM32定时器的预装寄存器的值到影子寄存器的更新往往离不开更新事件。一般来讲,只要启动了定时器,更新事件会随着计数器的溢出而自然产生。 既然这样,比方若是在下面四个时刻获得了新的CCR值,有没有办法让这几个
[单片机]
<font color='red'>STM32</font><font color='red'>定时器</font>更新事件可以暂停否?
STM32的IO口的8种配置(GPIO)
1 /` STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出) ① 浮空输入_IN_FLOATING ② 带上拉输入_IPU ③ 带下拉输入_IPD ④ 模拟输入_AIN ⑤ 开漏输出_OUT_OD ⑥ 推挽输出_OUT_PP ⑦ 复用功能的推挽输出_AF_PP ⑧ 复用功能的开漏输出_AF_OD 1.1I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口 的输出部分安排了多个响应速度不同的输出
[单片机]
STM32 ADC调试
使用火牛开发板自带的程序验证ADC的功能,怎么调试打印出来的ADC的值都是0,查看了ADC和DMA寄存器的设置也没什么问题, 修改了ADC的采用速率也不行后来从网上下到一个例子,down进去跑,竟然是正常的,比较了下代码关于ADC的设置都是一样的, 真奇怪的问题,到网站论坛上求助也没什么回复,我用正常的程序一段段替代运行不正常的程序,看看到底什么原因,最终问题发现了, 贴出来以免以后再次遇到: 不正常程序的代码的RCC_Configuration函数: void RCC_Configuration(void) { /* 使能外设时钟 */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, EN
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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