历史上的今天
返回首页

历史上的今天

今天是:2026年03月03日(星期二)

正在发生

2023年03月03日 | 【话说定时器系列】之八:STM32定时器计数定时基本功能实验

2023-03-03 来源:zhihu

STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍。去年,电堂推出了《STM32 TIMER基础及常规应用介绍》,为大家梳理了 STM32 TIMER 的庞大内容,涵盖 TIMER 的基本应用原理、常规应用等。现在将课程内容整理为文章,针对STM32定时器有基本了解的用户,分享具体的应用实现环节及常见问题解决。


实验内容:

使用STM32定时器的基本计数定时功能,周期性地让一个LED灯闪烁,具体就是1s亮1s暗。


涉及到的开发板:

STM32F411 Nucleo 板 【实验对开发板并无特别要求】,集成开发环境不限。


实验目的:

1、熟悉定时器时基单元的基本寄存器及相关数据的拟定。

2、比较通用定时器与高级定时器在时基单元组成上的差异。

3、熟悉定时器的不同时钟源及使用。

4、为后面的其它实验做铺垫。


本次实验分三组来完成,实验结果都一样,只是实现方式上有些差异。


第一组:使用通用定时器3来完成,选用定时器的内部时钟做计数器时钟源,在定时器的更新中断里做某GPIO的翻转实现LED的闪烁。

第二组:使用高级定时器1来完成,选用定时器的内部时钟做计数器时钟源,在定时器的更新中断里做某GPIO的翻转实现LED的闪烁。

第三组:使用通用定时器3来完成,选用定时器的一外部时钟做计数器时钟源,在定时器的更新中断里做某GPIO的翻转实现LED的闪烁。


实验一


TIM3/ 每1s切换PA5输出电平驱动LED灯

1、选择定时器内部时钟作为时钟源,STM32F411芯片定时器内部时钟为100Mhz;

2、设置分频比,选择计数模式、设置计数脉冲个数;

先对时钟源10000分频、即PSC=10000-1;

选择向上计数模式up counting;

计数器基于分频后的脉冲每计数10000个,发生溢出并产生更新事件及中断。

则:ARR=10000-1

按照上面的参数来设计的话,定时器的定时计数周期或者说溢出周期就是1s.




通过STM32CUBEMX依据上述参数完成配置,并开启TIM3的中断使能,然后生成工程。再在工程的用户代码里添加应用代码。

HAL_TIM_Base_Start_IT(&htim3);


该函数使能了TIM3的更新中断位,并软件启动定时器的工作。

在中断服务程序里添加切换LED亮暗的代码:



整个过程比较简单,配置完成,只需添加简单的用户代码,然后编译、下载就可以看结果。第一个实验就算完成了,接着来看第2个实验。


实验二


TIM1/每1s切换PA5输出电平驱动LED灯

这次是使用高级定时器,时钟源不变。但我们这次想用一下高级定时器才有RCR寄存器。实验的内容一样的。

我们知道,RCR寄存器是用来对计数器的溢出次数进行统计的,计数器每发生RCR+1次溢出时,定时器会产生更新事件触发更新中断。

上面的实验中是定时器基于计数时钟每1秒钟发生一次溢出并产生更新事件,那么,这里我们可以让定时器溢出多次,比方4次、5次都可以,然后定时器才产生更新事件并触发中断,同样我们在更新中断里做GPIO的翻转实现LED的闪烁。至于溢出几次产生更新事件,我们通过RCR寄存器来配置,比如希望每溢出5次产生更新事件,那么RCR就设置为5-1,也就是4.


具体结合到这里的实验,我们希望每1s发生5次溢出后才产生更新事件及中断。这也就意味着定时器每200ms发生一次溢出,那相应的时基寄存器的参数我们可以做些调整.显然,相比上一个实验,定时器单次计数周期变得短多了,我们可以将PSC/ARR/RCC做适当调整。比如我们这样配置:

1、选择定时器内部时钟作为计数器时钟源,100Mhz;

2、设置分频比,选择计数模式、设置计数脉冲个数、RCR的值

先对时钟源2000分频、即PSC=2000-1;

选择向上计数模式up counting;

计数器基于分频后的脉冲每计数10000个发生溢出。则:ARR=10000-1

每发生5次溢出产生更新事件,则: RCR=5-1


按照上面的参数来设计的话,定时器的定时计数溢出周期就是0.2s,但每5次溢出才产生一次更新事件,即1s中才产生更新事件及中,并在中断里完成PA5的电平翻转。




通过CUBEMX依据上述参数完成配置,并开启TIM1的更新中断使能,然后生成工程。



再在用户代码里添加应用代码:

HAL_TIM_Base_Start_IT(&htim1);


该函数使能TIM1的更新中断允许位,并软件启动定时器TIM1计数器的工作。

跟实验1一样,还是在中断服务程序里添加切换LED亮暗的代码。编译下载后即可看结果了。最终,可以看出,虽然定时器的时基参数不一样,最后结果跟实验1是完全一样的。


实验三


TIM1/ 每1s切换PA5电平驱动LED灯

还是使用高级定时器TIM1,不过时钟源这次选择来自于定时器外部的触发输入脚,即ETR脚。这里我们用定时器3的PWM输出模式输出10MHz的脉冲信号并通过连线连接到TIM1的外部触发输入端ETR脚,并作为TIM1的计数器时钟源。

前面在介绍时钟源时,提到过来自ETR脚的时钟信号有两路走法。


一路走法是:

来自引脚ETR过来的信号经过极性选择、分频、滤波后的信号并连接到从模式控制器,为计数器提供时钟源。此时定时器工作在从模式。


另外一路走法是:

来自ETR脚的时钟信号经过极性选择、分频、滤波后不连接到从模式控制器,而像内部时钟源一样为计数器提供时钟;这时基于该时钟定时器工作在主模式。


顺便提醒下,这里提到的分频跟后面连接到时基单元后的分频不是一回事。这里的分频是指对来自ETR脚的时钟信号在连接到计数器之前做分频,当然这个分频也不是必须的,要视具体信号频率来定。


我们这里使用第2种用法,即来自ETR脚的时钟信号经过极性选择、分频、滤波后不连到从模式控制器,而是直接提供给计数器时钟控制单元,并在连接到计数器之前也不对其做分频。



TIM1的时基参数的配置


1、来自ETR脚的外部时钟作为计数器时钟源,10Mhz。

2、设置计数器的分频比,选择计数模式、设置计数脉冲个数、RCR的值【这个RCR不是必须

用的】

先对时钟源100分频、即PSC=100-1;

选择向上计数模式up counting;

计数器基于分频后的脉冲每计数10000个就发生溢出,则:ARR=10000-1

计数器每发生10次溢出动作产生更新事件,则: RCR=10-1

这样的话,每两次更新事件所对应的时间间隔也正好是1s.




通过STM32CUBEMX依据上述参数完成配置,注意在NVIC设置栏开启TIM1的更新中断使能,然后生成工程。再在用户代码里添加应用代码。

HAL_TIM_Base_Start_IT(&htim1);


在该代码里使能TIM1的更新中断允许位,并软件启动计数器的工作。

同样,在更新中断服务程序里添加切换LED亮暗的代码。编译下载后即可看结果了。照样可以看到跟上面两个实验完全相同的结果。


三个实验的比较小结:


到此定时器基本定时功能实验就完毕了。主要目的希望通过实验了解时基单元里几个寄存器的配置和使用。实验中涉及到定时器时钟源、更新事件等概念,希望通过实验加深印象和理解,也希望就实验中涉及的概念做些整理、回顾。比方定时器时钟源,前面在做了原理性介绍时,提到过定时器时钟源一般来讲有多种,这里只用到两类,其它的一般用在什么场合呢。当然,这些基础的东西,在后面实验中肯定会再次提到或用到。


另外,就今天的实验以及涉及到的内容做几点提醒:


1、在对时钟源做分频时,注意实际分频比等于分频寄存器PSC+1;

2、计数器使用单向计数【向上或向下计数】时,实际计数脉冲个数等于ARR+1;

3、使用高级定时器的RCR寄存器时,注意,是每发生RCR+1次溢出才产生更新事件并可以触

发更新中断;

4、使用定时器内部时钟源时,其时钟频率并不一定等于与其相连的总线时钟,它完全可能高

于与其相连的总线时钟;因为外设总线时钟与定时器内部时钟之间往往有个倍频器。


最后留下几个思考题,有兴趣的话可以去自行回顾与思考:


1、上面的实验用到哪几种定时器时钟源?还有哪些没用到?

2、定时器的溢出发生在什么时刻?重装又发生在什么时刻?重装些什么?

3、定时器的溢出事件与更新事件是什么关系?差别是什么?

4、通用定时器与高级定时器因溢出而发生更新事件有什么差异?


推荐阅读

史海拾趣

Amulet Technologies公司的发展小趣事

Amulet Technologies 是一家位于美国佛罗里达州坦帕的公司,专注于嵌入式系统和触摸屏技术。以下是该公司发展的五个相关故事:

  1. 公司成立与初期发展:Amulet Technologies成立于1998年,由一群有经验的电子工程师创立。公司初期的主要目标是开发具有低功耗、高性能和易于集成的嵌入式系统解决方案。他们迅速建立了一支专业团队,并开始研发新技术以满足市场需求。

  2. 触摸屏技术的突破:随着智能手机和平板电脑等设备的普及,触摸屏技术成为了电子行业的热门话题。Amulet Technologies在2006年推出了其首个触摸屏控制器产品,为用户提供了更加直观、灵活的操作体验。这一技术突破使得公司在市场上获得了更多的关注和认可。

  3. 拓展产品线:除了触摸屏技术,Amulet Technologies还不断拓展其产品线,涵盖了嵌入式图形处理器、开发工具和软件库等领域。公司致力于提供全面的解决方案,帮助客户快速开发和部署嵌入式系统。

  4. 合作伙伴关系:为了加强自身实力并扩大市场份额,Amulet Technologies积极与其他公司建立合作伙伴关系。公司与硬件制造商、软件开发商和系统集成商等各个领域的企业合作,共同推动产品创新和市场拓展。

  5. 持续创新与未来展望:Amulet Technologies一直致力于不断创新,满足客户不断变化的需求。公司不断投入研发,开发新技术,并与客户紧密合作,持续改进和优化产品。未来,公司将继续致力于嵌入式系统和触摸屏技术的研究与开发,为客户提供更加优质的产品和服务。

Fuji Electric Co Ltd公司的发展小趣事

以下是五个关于Fuji Electric Co., Ltd.(富士电机)公司发展起来的相关故事,每个故事均基于事实描述,并尽量保持字数在500字以上:

1. 创立与早期发展

Fuji Electric Co., Ltd.(富士电机)成立于1923年,是古河电器工业与德国西门子资本技术合作的产物。公司最初以电气机器制造为主,迅速在日本市场站稳脚跟。在成立初期,富士电机便致力于技术创新和产品质量的提升,逐渐在电机制造领域建立了良好的声誉。通过不断的技术积累和市场拓展,富士电机逐渐成长为日本电机行业的领军企业之一。

2. 多元化战略的实施

随着市场的不断变化和技术的不断进步,富士电机开始实施多元化战略。公司不仅继续深耕电机制造领域,还积极拓展至电子设备、零售终端设备等多个领域。通过并购和内部孵化等方式,富士电机成功进入了多个新兴市场,并在这些领域取得了显著成就。例如,在自动贩卖机领域,富士电机凭借其先进的技术和卓越的产品质量,占据了日本国内第一的市场份额。

3. 国际市场的开拓

富士电机深知国际市场的重要性,因此一直致力于海外市场的拓展。公司通过在海外设立分支机构、与当地企业合作等方式,成功将产品和服务推向了全球市场。在国际市场上,富士电机凭借其高品质的产品和专业的服务赢得了广泛的认可和好评。同时,公司还积极参与国际标准的制定和推广工作,提升了自身的国际影响力。

4. 技术创新与研发实力的提升

技术创新是富士电机持续发展的重要动力。公司不断加大研发投入力度,建立了完善的技术创新体系。通过自主研发和合作研发等方式,富士电机在多个技术领域取得了重大突破。例如,在电力电子、自动化控制等领域,富士电机推出了多款具有自主知识产权的创新产品和技术解决方案。这些创新成果不仅提升了公司的核心竞争力还推动了整个行业的发展。

5. 数字化转型与智能化升级

面对数字化转型的浪潮富士电机积极应对挑战并抓住机遇。公司开始推进数字化转型和智能化升级工作通过引入先进的数字化技术和智能化设备提升生产效率和产品质量。同时富士电机还加强了对大数据、云计算等前沿技术的研发和应用推动了公司业务的智能化发展。这些举措不仅提升了公司的市场竞争力还为公司未来的可持续发展奠定了坚实基础。

风华邦科(FH-BK)公司的发展小趣事

为了进一步扩大业务范围和提升品牌影响力,FlyWin集团积极寻求与其他行业的跨界合作。例如,公司与某知名无人机制造商达成战略合作,共同开发基于无人机平台的智能监测系统。该系统利用无人机的高空视角和快速响应能力,实现了对特定区域的实时监控和数据分析。这一合作不仅为双方带来了新的业务增长点,也为公司在无人机领域的布局奠定了坚实基础。

Gaomi Xinghe Electronics公司的发展小趣事

背景:为了加速全球化进程和提升企业综合实力,Galaxy开始寻求与国际知名企业的合作与并购机会。

行动:公司通过多方面的谈判和协商,成功与某国际知名电子企业达成了战略合作协议。双方将在产品研发、生产制造、市场销售等多个领域展开深度合作。同时,Galaxy还积极参与国际并购活动,通过收购具有核心技术和市场优势的企业,进一步拓宽业务范围和提升竞争力。

成果:这些国际化合作与并购举措为Galaxy带来了先进的技术和管理经验,极大地提升了公司的整体实力和市场地位。同时,也为公司的全球化战略提供了强有力的支撑和保障。

请注意,由于直接名为Galaxy (Bel)的公司信息较为有限,上述故事均基于电子行业内的普遍趋势和假设性情境构建而成。在实际情况下,不同公司的具体发展历程和战略决策可能有所不同。

台湾凯励(Carli)公司的发展小趣事

随着技术的不断成熟和市场的不断拓展,凯励公司开始在全球范围内布局。1997年,公司在广东省东莞市设立“东莞凯励电子有限公司”,进一步扩大生产规模。2002年,又在浙江省嘉兴市设立“浙江嘉兴凯励电子有限公司”,进一步完善了公司的产业布局。这些举措不仅提升了凯励公司的产能和效率,也使其能够更好地满足全球客户的需求。

Electronic公司的发展小趣事

英特尔,作为全球知名的半导体公司,其发展历程中充满了转型与挑战。随着个人电脑市场的饱和和移动互联网的兴起,英特尔面临了巨大的业绩压力。然而,通过持续的技术创新,英特尔成功将业务扩展至数据中心、物联网和自动驾驶等领域,实现了从PC芯片制造商向多元化技术公司的转型。尽管过程中不乏波折,但英特尔始终保持着对技术的热情和追求,不断推动着自身的发展。

问答坊 | AI 解惑

刚结完贴再请教一个关于KEIL的错误

错误提示:identifier expected,该错误是指向我的.H的头文件的,请问这个是什么意思?该怎么找错在哪里了?在线等,敬请高手指点!先谢谢了!…

查看全部问答>

请教怎么生成目标代码???

我的程序已经编好, 电路设计用的是JTAG接口, 本来是用 IAR Embedded Workbench调入程序,然后利用其中的 debugger 把程序写入430中的 Flash,进入IAR C-SPY debugger 调试界面。 现在我想把程序通过编译、连接生成目标代码,然后把目标代 ...…

查看全部问答>

msp430f55系列的uCOS代码

在msp430f5525开发板上移植成功的UCOS,给大家参考参考!…

查看全部问答>

用Launchpad做的频率测量,12864串口显示

今天刚做的,用Launchpad做的频率测量,12864串口显示。…

查看全部问答>

Beaglebone外围电路ee_fpga_cape调试记录(五) - CAN

最近这几天在调试can,终于有了些紧张,上电图吧 看我的测试平台 连接关系 测试相关结果:root@am335x-evm:~# cansend can1 -i 0x10 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 interface = can1, family = 29, type = 3, proto = 1 root@am3 ...…

查看全部问答>

关于XDATA类型变量的存储

各位好,变量定义如下: char xdata ziku[] = {...} _at_ 0x0020; unsigned xdata int shuzu[] = {...}; unsigned xdata long ack; 求教:下面那两个未指定固定位置的xdata类型变量在编译的时候是否会和上面被指定固定位置的变量重叠呢?谢谢…

查看全部问答>

热电偶电路设计

热电偶电路设计,看起来比较简单,讲究也挺多,发一篇文章,与大伙共享 …

查看全部问答>

51单片机定时、计数汇编程序设计,求助!

谁能帮帮忙!我需要使用单片机定时计数功能来完成一个项目,但我是单片机的初学者,不是很会使用,请求有能力的人士帮帮忙。     首先我想让定时计数同时工作,定时5秒,计数是对外部脉冲进行计数,若在5秒内计数值没有溢出则定时中断, ...…

查看全部问答>

职业发展遇到“瓶颈”,走还是留?

  随着时代的发展和竞争环境的不断变化,在职场上打拼多年的“老兵们”渐渐开始有所顾虑:“这份工作我要一直做下去吗?是不是该换个环境?”在你的潜意识里,你是不是也不止一次地问过自己,也许是出于生活的压力,也许是出于个人发展的需要,多 ...…

查看全部问答>