历史上的今天
返回首页

历史上的今天

今天是:2025年12月21日(星期日)

2022年12月21日 | 单片机怎么做定时器矩阵,彻底解决各种定时问题?

2022-12-21 来源:zhihu

定时功能非常常用,可以说是刚需,也可以说是很多人的痛点。

做LED闪烁效果要用定时、按键扫描要定时、数码管扫描要定时、滤波要定时等等。

曾经,我在产品开发的时候也被各种定时需求搞得焦头烂额。

还好,后面我自己写了一个定时器的程序架构,今天一步到位,,彻底解决各种定时的问题。


最近无际单片机编程有几个学员在学习的时候搞不懂这个。

我借此写了这篇文章,然后基于这个文章内容来给学员们直播讲解。

一、为什么我要搞定时器矩阵

定时器矩阵这个概念是我自创的,简单来说就是很多不同定时时间的软件定时器组合。

因为产品开发这么多年,总有乱七八糟的精准定时需求,有50us的,有1ms的,有10ms的,有50ms的,有100ms的等等。

如果没有一个很好的程序架构的话,不同的精准定时需求一多,代码就会很混乱,而且也不好管理,移植性和可扩展性那些就更不用提了。

二、解决需求的思路

然后我就在想,我能不能设计一个定时器的程序架构,让它能够适应所有的精准定时需求。

我的思维雏形大概是这样的。

图左边是定时器时间源,类似于我们的时钟源,一般我是用单片机定时器中断做个50us的定时,因为用定时器做时间比较精准。

为什么要用50us?因为我产品的RFD波形定时采集频率是50us采一次。

如果你产品没定时这么频繁的功能需求,你完全可以把定时时间源配置成10ms,甚至100ms,这个是根据不同的产品去调整的。

图右边的就是定时器矩阵,就是各种乱七八糟的不同定时需求组合,比如LED特效定时功能的定时需求、RFD波形定时采集、RFD重复码滤波延时等等。

最终这些定时器矩阵都有一个时间单位/基准,这个时间单位/基准是由定时器时间源提供,如果我配置定时器中断是50us,那定时器矩阵的时间单位就是50us。

有了这种想法以后,剩下的就是考验你的经验和代码水平了。


三、代码设计思路

一个工程师工作越久,做过的项目越多,就要慢慢形成一个面向对象的思维。

虽然上面雏形出来了,但是我相信很多人依然不知道怎么动手去写代码。

这个是正常的,最好的方法就是先抄后超。

我是用面向对象的思维去做的,对于c语言来说,结构体是实现面向对象最好的方式。

这里的对象不是你的男女朋友,而是世间万物皆可以当做一个对象。

比如说人是一个对象,这个对象有很多属性,比如说性别、年龄、身高、体重等等。

Ok,那在程序里,如何把这个对象的特征用结构体展现出来呢?

可以通过下面这个代码:

那回到我们定时器矩阵这里,我们把定时器矩阵当做一个对象。

那这个定时器矩阵都需要具备哪些共同的特征?

我总结了下面几个:

  1. 需要有个变量当做开关标志控制该定时器启动/停止

  2. 需要有个变量当做当前的定时值

  3. 需要有个变量当做该定时器的定时周期。

  4. 定时时间到了以后,需要去执行相应动作,为了灵活使用,需要一个函数指针。

那用结构体来表示代码如下:

这里很多人可能有点懵逼,我怎么想不到要这些东西呢?

这个是正常的,不用去纠结,我也不是一开始就把这几个成员都想到的,而是后面做功能的时候慢慢完善的,你刚开始抄我的思维就行了。

后面很多应用都是用这种套路去做的,比如说我们的任务管理、比如菜单这些,用多了自然就熟了,以后你自己也能设计别的对象了。

Ok,这样我们就把定时器矩阵这个对象的特征设计好了。


四、定时器代码实战

1.前面我们用结构体自定义了一个定时器的对象来,下面就要用这个定时器对象”生”出定时器矩阵。

我们直接用定义结构体数组的方式,T_SUM就是我们定时器矩阵的个数,也就是我产品有多少个定时器需求。

后面我们所有的操作都是围绕这个结构体来进行的。


2.配置定时器矩阵时间源,初始化定时器矩阵参数

A). 我们首先要给这个定时器矩阵一个时间源,也就是配置我们要去配置单片机定时器中断。

我们的定时频率配置的是50us,是因为我们产品有的功能最短需要50us的定时。

然后,我们需要写一个初始化函数,去调用这个定时器配置,以及初始化定时器矩阵参数。

B). 然后在这个50us定时器中断函数里,去实现给定时器矩阵定时代码。

这里,我单独写了一个函数。

然后我们在定时器中断函数里调用这个函数,实现给定时器矩阵定时。

3.附加功能

定时器矩阵时间源配置好了,但是我们还需要一些函数来操作定时器矩阵对吧?

A). 编写创建定时器

我希望定时器能像任务一样,想要的时候创建,所以就有了创建定时器函数。

我们创建定时器的时候这样调用就可以了。

B). 复位定时器

如果说我们需要循环定时的话,在定时时间到了以后就需要复位定时器,让定时器重新启动。

除了以上以外,其他功能可以自己去完善,比如说控制定时器状态、删除定时器、获取定时器时间,这里就不一一举例了。


完整的代码和视频教程,大家可以找无际单片机编程来拿。

有了这个定时器程序架构,以后开发产品再也不怕有各种定时需求啦,使用方便,移植性也强,如果加个动态分配,就更完美了。


推荐阅读

史海拾趣

天二科技(EVER OHMS)公司的发展小趣事

天二科技始终将产品质量视为企业的生命线。为了不断提升产品品质,公司引进了先进的自动化设备和生产工艺,并建立了严格的质量控制体系。经过多年的努力,天二科技的产品质量得到了显著提升,并先后通过了ISO9001、TS16949等多项国际质量管理体系认证。这些认证的取得不仅证明了天二科技在产品品质方面的卓越表现,更为公司赢得了客户的信任和市场的认可。

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

凯励公司始终将技术创新作为发展的核心驱动力。公司不断投入研发资金,加强与高校和研究机构的合作,不断推出具有竞争力的新产品。例如,公司成功研发出了MPX、MTF、MTB等多个系列的金属膜电容器,这些产品不仅具有优异的性能和稳定性,还广泛应用于新能源、工业控制、通信等领域。此外,凯励公司还致力于产品升级和工艺改进,不断提高产品的可靠性和使用寿命。

安普康(AMPCOM)公司的发展小趣事

安普康的成功离不开其独特的企业文化和优秀的团队。公司注重员工的培训和发展,为员工提供广阔的职业发展空间和良好的福利待遇。同时,公司还积极营造积极向上、团结协作的工作氛围,使得员工能够充分发挥自己的才能和潜力。这种企业文化不仅吸引了大量优秀人才加入安普康,也使得公司在面对市场挑战时能够保持强大的凝聚力和战斗力。


请注意,这些故事是基于已知信息创作的,并不代表安普康公司的真实发展历程。如需了解安普康公司的真实故事,建议查阅公司官方发布的资料或相关新闻报道。

EM Microelectronic-Marin SA公司的发展小趣事

进入1980年代,随着技术的不断进步,ASIC(应用特定集成电路)技术开始兴起。1982年,Mikron Integrated Microelectronics(EM Microelectronic-Marin的前身之一)开始了ASIC技术的研究,并在随后的几年中取得了显著成果。1987年,其奥地利分公司开始专注于识别和智能卡芯片的开发,这一领域的成功为公司带来了新的增长点。

ACEINNA公司的发展小趣事

多年来,EM Microelectronic-Marin始终保持着对技术的热爱和追求。公司不断投入资源进行研发,推动电子技术的持续发展。在未来,随着物联网、人工智能等技术的不断兴起,EM Microelectronic-Marin将继续致力于技术创新和产品升级,为电子行业的发展贡献自己的力量。

Anders DX公司的发展小趣事

多年来,EM Microelectronic-Marin始终保持着对技术的热爱和追求。公司不断投入资源进行研发,推动电子技术的持续发展。在未来,随着物联网、人工智能等技术的不断兴起,EM Microelectronic-Marin将继续致力于技术创新和产品升级,为电子行业的发展贡献自己的力量。

问答坊 | AI 解惑

【电子书】万用表测试电工电子元器件300例【PDG格式】

【电子书】万用表测试电工电子元器件300例【PDG格式】 【电子书】万用表测试电工电子元器件300例【PDG格式】_ 【电子书】万用表测试电工电子元器件300例【PDG格式】_ 【电子书】万用表测试电工电子元器件300例【PDG格式】_ [ 本帖最后由 emily ...…

查看全部问答>

5款ALTERA FPGA开发板原理图合集

5款ALTERA FPGA开发板原理图合集…

查看全部问答>

CCD摄像机质量对网络摄像机的影响

  1. 问题的提出         网络摄象机技术的发展,特别是宽带网络的普及,使得基于网络的网络监控应用正在普及。灵活的监视和控制配置、与信息网络紧密融合、长距离远程监控等优势都是传统监控所不可比拟的。如何 ...…

查看全部问答>

新领导新风格

我们团队的老总,新来的新风格,开会坚决不让人在下面与别人讨论,一定与他讨论他发起的话题,奶奶的,这有点不习惯。以前我们老大,喜欢百家争鸣,大家开大会,我们开小会。…

查看全部问答>

关于DXP 2004中元件封装问题……

各位大侠,在dxp 2004中有没有三排 15针串口(VGA)这个元件?如果有,那是在哪个库呢?而且还要有封装!我找了很久都没找到!如果有谁有这个元件库,可以给我吗?不胜感激!…

查看全部问答>

新手来问问题,请老鸟们指导

我手头有一块2410的板子,可是和电脑不能连接。能不能帮我分析分析 系统里除了驱动只装了360安全卫士,其他软件安装顺序是:1、CE5.0 2、EVC 3、USB驱动(用USB线连接) 4、activesync 连接之后打开板子的电源,托盘里activesync的小标一直没有反 ...…

查看全部问答>

loadcepc在哪?

請問啟動loadcepc的source code在哪 我創建了一個cepc,編譯好後沒有發現Loadcepc.exe …

查看全部问答>

文本框不能输入中文

为什么运行时文本框中不能输入中文???只能输入英文?…

查看全部问答>

那位兄弟有三星的NAND FLASH的驱动,我不要通用的啊,现代的我有,就是要改成三星的,

那位兄弟有三星的NAND FLASH的驱动,我不要通用的啊,现代的我有,就是要改成三星的, 有就发到我邮箱里啊?ricky5200@163.com 谢谢啊,…

查看全部问答>

STM32Primer2隆重登场

看来像手机... 在香港的Farnell网站可以下订单. 价钱港币718.9, 免运费. 比Primer1, 改良了不少. STM32F103E (512 Kbytes Flash) Li-Ion battery with smart loading& ...…

查看全部问答>