历史上的今天
返回首页

历史上的今天

今天是:2024年12月10日(星期二)

正在发生

2018年12月10日 | STM32 通用定时器的定时功能 学习笔记

2018-12-10 来源:eefocus

这节主要讲下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 


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


推荐阅读

史海拾趣

FEMA Electronics Corporation公司的发展小趣事

随着全球化的加速推进,FEMA意识到要想在更广阔的市场上取得更大的发展,必须实施国际化战略。于是,公司开始积极拓展海外市场,与多个国家和地区的客户建立了合作关系。同时,FEMA还加强了与国际先进企业的技术交流和合作,不断吸收和借鉴国际先进的经验和技术。这些举措为公司的国际化发展提供了有力支持,使FEMA的产品在国际市场上赢得了更广泛的认可。

CQR SECURITY公司的发展小趣事

为了拓展业务范围和提升品牌影响力,CQR SECURITY公司开始实施国际化战略。公司积极开拓海外市场,与多个国家的电子企业建立了合作关系。同时,CQR还加强了与国际安全组织的交流与合作,共同推动全球网络安全水平的提升。通过国际化战略的成功实施,CQR不仅拓展了业务版图,还提升了自身的技术水平和国际竞争力。

ADI(亚德诺半导体)公司的发展小趣事

在激烈的市场竞争中,CQR SECURITY公司不断探索创新服务模式。公司推出了基于云计算的安全服务平台,为客户提供更加便捷、高效的安全服务。同时,CQR还加强了对客户需求的深入了解,量身定制安全解决方案,满足客户的个性化需求。这种创新服务模式不仅提升了客户满意度,还为CQR带来了更多的商业机会。

Applied Micro Circuits (MACOM)公司的发展小趣事

MACOM公司上市后,成功募得了充足的资金,使其财务能力得到了显著增强。这使得公司能够有更多的资源进行研发、生产和市场推广,进一步巩固其在电子行业的地位。同时,上市也为MACOM带来了更广泛的投资者关注和市场认可,为其未来的发展提供了有力支持。

Bussmann (Eaton)公司的发展小趣事

1914年,Bussmann五兄弟以家族生意为起点,在自家的地下室里开始生产熔断器。他们凭借对电路保护的深刻理解和对市场需求的敏锐洞察,不久便将业务从地下室扩展到了小型厂房,并专注于汽车熔断器的生产。这一转变不仅标志着Bussmann业务的飞速发展,也奠定了其在电路保护领域的基石。通过不断的技术创新和市场拓展,Bussmann逐步在保险丝市场上取得了领先地位。

达方(DARFON)公司的发展小趣事

为了进一步拓展市场份额,达方电子开始在全球范围内布局生产基地和研发中心。同时,公司加强了对供应链的管理,确保原材料的稳定供应和产品质量的持续提升。这一阶段的努力,使达方电子在全球电子行业中的地位得到了进一步提升。

问答坊 | AI 解惑

[资料]基于单片机的四位BCD编码器电路设计

基于单片机的四位BCD编码器电路设计 来源:现代电子技术 作者:刘静波 1 引言 BCD码又称二/十进制码,即二进制编码的十进制码,在设计、测试数字电路硬件过程或是面对带有BCD码接口的集成电路时,常常希望方便、快速地产生BCD码来完成当前的 ...…

查看全部问答>

AD603完整资料!!!

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 我这里有AD603的完整资料,和大家分享~~~~  …

查看全部问答>

拜求MATLAB仿真与DSP的问题

我做电机控制的仿真,在MATLAB的SINULIN中有电机的模块,可是没有DSP的模块,问能不能在simulik用一个DSP的模块和电机的模块搭建起控制系统的仿真模型? 求解答…

查看全部问答>

很有用,有点不舍的 数控电源

数控电源.rar 数控电源全部资料…

查看全部问答>

基于Windows程序设计的一个小问题

#include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //---------以下初始化窗口类------------ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) {         HWND ...…

查看全部问答>

如何让电动十字滑架移动?

请教各位: 计算机输出信号(偏差量)怎么可以带动电动十字滑架移动?之间需要怎么一个具体的原理,我不懂.需要什么设备,器件请教. 非常感谢! …

查看全部问答>

2011年国赛控制大推测!

本帖最后由 paulhyde 于 2014-9-15 09:29 编辑 …

查看全部问答>

msp430 adc12 可以转换负电压吗

如果把参考电压设置成负的可以吗…

查看全部问答>

win8系统下如何安装eZ430-RF2500驱动?

RT,win8 系统下插上去后不能自动安装,请教如何手动安装? …

查看全部问答>