历史上的今天
今天是:2024年12月27日(星期五)
2021年12月27日 | STM32软件定时器的设计
2021-12-27 来源:eefocus
定时器分为硬件定时器和软件定时器,几乎所有的微控制器上都配备了数量有限的硬件定时器,即控制器本身有专门实现定时的模块。几乎所有的硬件定时器的工作原理都是一样的:定时器在外部时钟提供的周期脉冲下进行计数工作,当计数到用户指定的次数时,就产生一次中断。这个过程完全由微控制器内部的定时器硬件电路实现,不需要 CPU 干预。
相比之下,软件定时器则需要 CPU 的介入来实现了。实现软件定时器一般有两种方法:一种是纯粹依赖 CPU 指令的堆积来实现;另一种是以硬件定时器产生的时间片为基准单位,CPU 基于这个基准单位进行累积来实现。
显然,硬件定时器的精度取决于驱动的时钟脉冲,一般情况下可以达到很高的精度(纳秒级),而软件定时器的实现由于引入了非硬件因素,精度必然有所下降。
在嵌入式应用中,经常使用定时器进行定时,当定时时间到达之后执行预定的操作。一个具体的嵌入式系统可能有几个甚至数十个定时应用,而这些应用对定时器的精度、最大周期等要求往往都是不同的。比如使用定时器产生一个准确频率的方波是对定时精度比较高的应用,而使用定时器定时翻转一个用户指示灯以表示当前设备的工作状态,则对定时器精度的要求大为下降,这时如果启用硬件定时器无疑是一种资源的浪费。所以,在一个具体的嵌入式系统中,硬件定时器和软件定时器配合使用,是提高性能和降低成本的有效方法。
那么,在 STM32 中如何利用一个硬件定时器构建多个软件定时器呢?
我们来分析软件定时器的基本需求:在嵌入式应用中,对定时器的使用模式一般是“定时时间到达后执行预定的操作”。所以需要解决如下一些问题:
1、 定时多久?——定时时间必须是可配置修改的;
2、 定时时间到达后做什么?——需要指定执行函数;
3、 定时器如何工作?——可以选择单次执行或循环执行。
具体实现如下:
【头文件 softtimer.h】
#ifndef __SOFT_TIMER_H__
#define __SOFT_TIMER_H__
#include "stm32f10x.h"
/* 单次执行 */
#define TIMER_ONESHOT 0
/* 循环执行 */
#define TIMER_PERIOD 1
/* 软件定时器结构体信息块 */
typedef struct __TIMER
{
u32 Timeoutcnt; // 表示定时器软件计数变量
u32 Timeout; // 表示定时器单次定时周期
void (*Timeoutfunc)(void *parameter); // 定时到达后的执行函数
void *Parameter; // 执行函数的参数
u8 Timerflag; // 表示定时器处于单次执行模式还是循环执行模式
}Timer_typedef;
extern Timer_typedef TimerList[10];
/* 初始化软件定时器 */
extern void TIMER_TimerInitialisation(void);
/* 启动一个软件定时器 */
extern void
TIMER_TimerStart(u8 TimerIdent,
u32 Timeout,
void (*Timeoutfunc)(void *parameter),
void *parameter,
u8 flag);
/* 用于判断定时时间是否到达,并执行对应函数 */
extern void TIMER_Execute(void);
#endif
上一篇:STM32网络丢包问题分析
史海拾趣
|
选择使用DC/DC模块电源除了最基本的电压转换功能外,还有以下几个方面需要考虑: 1.0额定功率 一般建议实际使用功率是模块电源额定功率的30~80%为宜,这个功率范围内模块电源各方面性能发挥都比较充分而且稳定可靠。负载太轻造成资源浪费 ...… 查看全部问答> |
|
十天学会 51视频教程 免费下载 地址:http://www.verycd.com/groups/mcu/392145.topic#post2203424… 查看全部问答> |
|
“万用表”是万用电表的简称,它是我们电子制作中一个必不可少的工具。用途多,量程广,使用方便是万用表的优点。万用表能测量电流、电压、电阻、有的还可以测量三极管的放大倍数,频率、电容值、逻辑电位、分贝值等。万用表有很多种,现在最流行的 ...… 查看全部问答> |
|
在AT4DB021B的Datasheet中说的Inactive Clock Polarity Low or Inactive Clock Polarity High 是个什么模式,和SPI Mode 0 or SPI Mode 3有什么区别, 在这两种模式下的opcode都不一样,比如读register的前者模式下是0x57,在后者模式下是0xD7,我 ...… 查看全部问答> |
|
最近要在EP9315的芯片上做win ce的驱动,但是我没有win ce的开发经验,请问如何下手学习啊?有哪些win ce开发较好的入门级的书,请牛人给推荐一下。 能否说的细致一些,比如如何搭建开发环境,在没有硬件的情况下如何模拟开发(驱动程序)。 摆脱 ...… 查看全部问答> |
|
一、恒压充电 恒压充电是指每只单格UPS电源蓄电池均以一恒定电压(一般取单格电池数乘以2.5v)进行充电。特点是:初始充电电流相当大,UPS蓄电池电动势和电解液体相对密度上升较快,随着充电的延续,充电电流逐渐减小,在充电终期只有很小的电流通 ...… 查看全部问答> |
|
刚买的2407DSK与仿真器,有几点不明:CCS不知应该装哪个,应该如何设置,感觉装上后的有点错误。USB仿真器连上了,例程下不进去,修改了CMD文件后有一些能下,但似乎跑不了,断点也不能用。… 查看全部问答> |




