历史上的今天
返回首页

历史上的今天

今天是:2024年10月28日(星期一)

正在发生

2019年10月28日 | STM32定时计算详解

2019-10-28 来源:eefocus

STM32之定时器

时间=次数x1/频率


((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒

一、定时器简介


1、时钟来源

2、定时器结构(以基本定时器为例)

二、基本定时器的编程方法


1、基本定时器的寄存器

2、例程


/**

  * @brief  定时器6的初始化,定时周期0.01s

  * @param  无

  * @retval 无

  */

void TIM6_Init(void)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

 

    /*AHB = 72MHz,RCC_CFGR的PPRE1 = 2,所以APB1 = 36MHz,TIM2CLK = APB1*2 = 72MHz */

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

    

    /* 时基初始化 */         

    TIM_TimeBaseStructure.TIM_Period = 99;          //当定时器从0计数到99,即定时周期为100次

    TIM_TimeBaseStructure.TIM_Prescaler = 7199;     //设置预分频:10KHz

    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

    TIM_ARRPreloadConfig(TIM6, ENABLE);             //使能TIM6重载寄存器ARR

    

    /* 设置更新请求源只在计数器上溢或下溢时产生中断 */

    TIM_UpdateRequestConfig(TIM6,TIM_UpdateSource_Global);

    /* 定时器6的上溢或下溢中断使能 */

    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);

    /* 定时器6启动 */

    TIM_Cmd(TIM6, ENABLE);                          //使能定时器6

    TIM_ClearITPendingBit(TIM6,TIM_IT_Update);

    /* 定时器6的NVIC中断配置 */

    NVIC_TIM6_Configuration(); 

}

三、疑惑与解答


  以下问题皆以基本定时器为例进行阐述 


1、何谓更新事件


  更新事件就是指这个事件发生后,将会将定时器的寄存器进行更新,以使定时器工作在新的配置下,例如当一个定时周期结束(计数器上溢)或者其他事件。


2、何谓自动重装载寄存器(auto-reload register)


  自动重装载寄存器决定了定时器的上溢时机,当定时器的计数器中数值达到了自动重装载寄存器规定的值,计数器就要归零。也就是说自动重装载寄存器决定了定时器的周期。假定TIMx_ARR=0x36,而且分频系数为1,则可以看到下边的情况。

3、自动重装载寄存器和预加载寄存器的区别与联系


   当“TIMx_CR1.ARPE = 1”的时候,STM32中有自动重装载寄存器和预加载寄存器(TIMx_ARR)。


  预加载寄存器是自动重装载寄存器的“影子”,也就是预加载寄存器是自动重装载寄存器的缓冲器。自动重装载寄存器的功能在2点已经说明,但是自动重装载寄存器不是用户用程序可以直接进行操作的,用户需要借助于预加载寄存器(缓冲区)才能访问它。


  其目的是为了保证自动重装载寄存器在合适的时候被修改,不允许其随便被修改,否则可能导致在过渡的时候发生不期望的结果。


  这是什么一个概念呢?


  在定时器一个周期结束的时候,产生了一个更新中断,我们在中断服务程序中修改预加载寄存器(TIMx_ARR),但是并没有直接写入到自动重装载寄存器。在中断刚一产生的时候(早于我们的服务程序),原来TIMx_ARR的值被硬件自动装入自动重装载寄存器中。所以下一个定时器周期的长度取决于“原来TIMx_ARR的值”,而非我们在中断服务程序中的修改值。


  那么什么时候,我们的修改值才起作用呢?


  当下一个定时器周期结束的时候,我们对TIMx_ARR的修改值就被硬件自动写入到自动重装载寄存器中,所以我们的修改值在下下个定时器周期才起作用。


  而当“TIMx_CR1.ARPE = 0”的时候,STM32中只有自动重装载寄存器(TIMx_ARR),没有预加载寄存器。自动重装载寄存器没有缓冲区,对TIMx_ARR的修改,也就是直接对自动重装载寄存器的修改。


  这种情形又怎样看呢?


  在定时器一个周期结束的时候,产生了一个更新中断,我们在中断服务程序中修改自动重装载寄存器(TIMx_ARR)。所以下一个定时器周期的定时长度要取决于我们的这个修改值。


总结:


  ① TIMx_CR1.ARPE = 0,自动重装载寄存器没有缓冲区,对TIMx_ARR的修改直接影响下一个周期的定时长度。


  ② TIMx_CR1.ARPE = 1,自动重装载寄存器有缓冲区,对TIMx_ARR的修改影响的是下下一个周期的定时长度。


      ③ TIMx_CR1.ARPE = 1,自动重装载寄存器有缓冲区预加载寄存器(TIMx_ARR),预加载寄存器更新到自动重装载寄存器的时机是:当定期器一个定时周期结束产生一个更新事件的时候。


  ④ TIMx_CR1.ARPE = 1,注意我们在写程序的时候,给TIMx_ARR赋值,并没有真正的写入到自动重装载寄存器中,而是写入到了预加载寄存器中。


  当我们需要定时器以T1和T2交替工作:


  ⑤ TIMx_CR1.ARPE = 0,自动重装载寄存器没有缓冲区,我们是在T1定时周期已经开始一会儿的时候,才去设定定时周期T1长度;在T2定时周期已经开始一会儿的时候,才去设定定时周期T2长度。因为当T1结束的时候,中断发生后,我们在中断程序中设定定时周期为T2。其实,此时定时器周期T2已经开始一段时间了。要知道定时器一个周期结束的时候,硬件自动进入下一个周期的计数,而不受软件的控制。


  ⑥  TIMx_CR1.ARPE = 1,自动重装载寄存器有缓冲区,我们是在T1定时周期一开始,就去设定定时周期T1的长度;在T2定时周期一开始,就去设定定时周期T2的长度。因为当T1结束的时候,更新事件产生(中断也发生),(我们在上一个定时周期的中断程序中已经设定定时周期为T2),TIMx_ARR中的T2值被硬件更新进入到自动重装载寄存器中。


  ⑦ 当T1、T2两个周期都很大的时候,需要ticks比较多,两种方式都不会出现错误。


   但是当T1、T2两个周期都很小的时候,需要ticks比较少,对于“TIMx_CR1.ARPE = 0”的情况,就有可能出现问题。因为有可能在T1定时周期已经超过T1时间长度的时候,才去设定定时周期T1;在T2周期已经超过T2时间长度的时候,才去设定定时周期T2。


总结:


  在需要不断切换定时器的周期时,而且周期都比较短,程序员需要通过预加载寄存器配合自动重装载寄存器,来操作定时器,以保证定时器周期的平稳过渡。  


自动重装载寄存器是预加载的,每次读写自动重装载寄存器时,实际上是通过读写预加载寄存器实现。根据TIMx_CR1 寄存器中的自动重装载预加载使能位(ARPE) ,写入预加载寄存器的内容能够立即或在每次更新事件时,传送到它的影子寄存器。                


摘自《STM32中文版芯片手册》



推荐阅读

史海拾趣

Gustav Klauke GmbH公司的发展小趣事

Gustav Klauke GmbH在电子行业中的五个发展故事

故事一:创立与电气时代的崛起

1879年,Gustav Klauke GmbH在德国雷姆沙伊德成立,正值第二次工业革命带来的“电气时代”大爆发。创始人Gustav Klauke凭借其对精工品质的执着追求,将公司的业务聚焦于电气连接技术和电缆作业工具的研发。随着全球电气工业的迅速发展,Klauke迅速成为该领域的佼佼者,为供电系统的各个环节提供可靠且实用的解决方案,满足了社会对电气产品日益增长的多元化需求。

故事二:产品创新与多元化发展

历经百年开拓,Klauke的产品线不断丰富和完善。从最初的钟表维修钳子,到电缆接线端子的生产,再到电池驱动的液压工具的研发,Klauke始终走在行业前沿。特别是1994年推出的首款电池驱动液压工具,标志着公司在电气连接技术上的重大突破。至今,Klauke已拥有多达280种工具,2000多个型号,超过10000个优质部件,广泛应用于电力、铁路和工业等多个领域。

故事三:品质与认证的国际认可

Klauke深知电气连接作业对安全可靠性的极高要求,因此始终将产品质量放在首位。公司不仅拥有IEC(国际电工委员会)、UL(美国保险商试验所)、DNV(挪威船级社)和GL(德国劳氏船级社)等特殊行业的权威资质认证,还通过严格的产品测试报告,确保每一款产品都能达到国际最高标准。这种对品质的坚持,让Klauke在全球客户中赢得了极高的信誉和口碑。

故事四:全球化布局与业务拓展

随着全球市场的不断扩大,Klauke积极实施全球化战略。从德国本土出发,公司在全球范围内设立了多个分公司和销售办事处,如印度、奥地利、西班牙等。同时,公司还通过并购和合作等方式,不断拓展业务领域和市场份额。例如,2018年Gustav Klauke GmbH被艾默生收购,现隶属于“专业工具”部门,这一举措进一步提升了公司在全球电气工具市场的竞争力。

故事五:未来展望与技术创新

面对未来,Klauke继续秉承德国精工品质的优良传统,致力于技术创新和服务优化。公司正密切关注物联网和工业4.0等下一代趋势,并制定相应的战略计划。例如,新型电池供电液压工具配备了蓝牙接口,实现了移动数据读取和工具配置的便捷性。此外,Klauke还计划推出更多高适应性、精准性的电气连接解决方案,以更好地满足全球日益多元的施工作业需求。展望未来,Klauke将继续向下一个百年目标迈进,为电子行业的发展贡献更多力量。

ABC [ABC Taiwan Electronics Corp]公司的发展小趣事

随着全球电子市场的不断扩大,ABC Taiwan Electronics Corp开始实施国际化战略。公司积极参与国际电子展会,与国外客户建立合作关系,将产品推向国际市场。同时,公司还加强了对国际标准和法规的研究,确保产品符合国际质量要求。通过不断拓展海外市场,ABC的销售额和市场份额逐年攀升,成为了国际知名的电子零件供应商。

上海如韵(CONSONANCE)公司的发展小趣事

在发展过程中,如韵始终关注社会责任和可持续发展问题。公司积极参与社会公益活动,为弱势群体提供帮助和支持。同时,如韵注重环保和节能减排工作,在产品设计和生产过程中严格遵守相关环保法规和标准。

为了推动行业的可持续发展,如韵还积极参与行业交流和合作活动,与同行分享经验和资源。通过与产业链上下游企业的紧密合作和协同创新,如韵为推动电子行业的绿色发展和技术进步做出了积极贡献。

Amprobe公司的发展小趣事

在发展过程中,如韵始终关注社会责任和可持续发展问题。公司积极参与社会公益活动,为弱势群体提供帮助和支持。同时,如韵注重环保和节能减排工作,在产品设计和生产过程中严格遵守相关环保法规和标准。

为了推动行业的可持续发展,如韵还积极参与行业交流和合作活动,与同行分享经验和资源。通过与产业链上下游企业的紧密合作和协同创新,如韵为推动电子行业的绿色发展和技术进步做出了积极贡献。

迪一电子公司的发展小趣事

随着市场的不断变化和技术的快速发展,迪一电子公司意识到必须不断创新才能保持竞争力。于是,公司加大研发投入,引进高端技术人才,与国内外知名科研机构合作,成功研发出一系列具有竞争力的新产品。这些新产品不仅提高了公司的市场占有率,还为公司赢得了良好的口碑。

Eby Company公司的发展小趣事

eBay积极履行社会责任,参与多项公益活动。例如,在疫情期间,eBay向中国红十字基金会捐赠了人民币100万元,用于支援疫情防控工作。此外,eBay还鼓励卖家和买家参与环保活动,如回收旧电子产品等。这些公益活动不仅展示了eBay的社会责任感,也提高了其品牌形象和用户忠诚度。

请注意,以上故事概要仅基于eBay的历史和关键事件进行了简要描述,并未达到每个故事至少500字的要求。如需更详细的故事内容,请参考相关书籍、新闻报道或官方资料。

问答坊 | AI 解惑

仪器仪表类题目分析.doc

仪器仪表类题目分析.doc…

查看全部问答>

用万用表能测到晶振起振电压,而用示波器测不到,请教原因?

我用万用表可以测到晶振的起振电压,接上示波器,测不到电压和频率,请教各位大哥这个是不是示波器探针电容的影响? 示波器的设置:探针 为  *10  挡,交直流都试过了 …

查看全部问答>

无线网卡资料

无线网卡资料    无线部分自己做有很大难度 了解一下吧…

查看全部问答>

网卡驱动安装后,网络连接里怎么没有

网卡驱动我用的DDK的例程,isdnwan,编译好后进行安装,可以看到驱动和网卡都安装了,但是在网络连接里怎么没有啊,不懂,求助…

查看全部问答>

急!!!zinc的图形界面可以用VxSim仿真出来吗??

我创建了一个下载型工程,就用zinc中Hello的实例做的,在下载的时候老是出现这个错误: Errors while downloading G:/tornado2.2/target/proj/Project1/SIMNTgnu/Project1.out: _LinkMain__14ZafApplication _Control__14ZafApplicationUi ___1 ...…

查看全部问答>

嵌入式人才的发展方向,给从事嵌入式开发的同学指路(转)

     嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家 ...…

查看全部问答>

谁知道三星 s3c6400 处理器的报价啊

谁知道三星 s3c6400 处理器的具体报价啊?ARM11的那个,iphone用的那个。…

查看全部问答>

请问电话线接法??

请问二蕊的电话线如何接?线序怎样?四蕊的电话线如何接?线序怎样? 电话线头分哪些,最好有图片, 谢谢。 …

查看全部问答>

请教ST_ARM

  我用STR710的Bank1扩展了16M的外部Flash存储器。连接时STR710的地址线、数据线、读、写控制线与外连的Flash进行了相应的连接。   我想请教的是:在IAR EWARM环境下对外部Falsh写数据时,我除了要使能BANK1, ...…

查看全部问答>

发几个用CORDIC快速求三角函数的定点程序

最近在做FFT,发几个用到的三角函数计算程序 #define DSP32_Q(x) ((int) ((x)*(((unsigned) (1 << (20)))))) const int atanLUT[20] = { DSP32_Q(0.78539816340), DSP32_Q(0.46364760900), DSP32_Q(0.24497866313), DSP32_Q(0. ...…

查看全部问答>