使用中断实现嘀嗒计数器

一般情况下,使用一个计数器设定为1ms来一次中断,在中断服务例程中将嘀嗒计数器加1。

uint32_t tick_count = 0;void timer_isr(void)
{tick_count++;
}

需要超时处理的代码每次比较嘀嗒计数器看是否超过预设值:

#define TICK_TIMEOUT     100
uint32_t tick_start = tick_count;
if(tick_count - tick_start > TICK_TIMEOUT) {......
}

不用中断实现嘀嗒计数器

选择1个32位的定时器,设定定时器的预分频寄存器(prescaler),让计数器(counter)每1ms累加1。程序直接使用定时器的counter外设寄存器值作为嘀嗒计数器。

#define TICK_TIMEOUT     100
uint32_t tick_start = TIM0_CNT; // TIM0_CNT 为 定时器0的 counter 外设寄存器
if(TIM0_CNT - tick_start > TICK_TIMEOUT) {......
}

预分频寄存器位数不够的情况

如果定时器的时钟频率比较高,而预分频寄存器(prescaler)位数不够,计数器(counter)做不到1ms累加一次,这种情况可以减小嘀嗒计数器的时间间隔,例如将间隔设定为0.1ms。如果嘀嗒计数器为32位整数,当嘀嗒间隔为1ms时,嘀嗒计数器的溢出时间大约是50天少一点;嘀嗒间隔减小到0.1ms后,嘀嗒计数器的溢出时间大约是5天少一点。如果要处理比溢出时间还要长的超时,那么需要额外的代码。

#define HAL_MS(ms)   ((ms) * 10)     // 定义一个宏,转换 ms 和嘀嗒数
#define TICK_TIMEOUT        HAL_MS(100)
uint32_t tick_start = TIM0_CNT; // TIM0_CNT 为 定时器0的 counter 外设寄存器
if(TIM0_CNT - tick_start > TICK_TIMEOUT) {......
}

只有16位定时器的情况

如果所需要的超时时间都是很短的,那么将嘀嗒计数器定义成16位整数。如果嘀嗒间隔为1ms,那么16位的嘀嗒计数器的溢出时间是65秒。如果嘀嗒间隔为0.1ms,那么溢出时间是6.5秒。这么短的溢出时间可能无法满足需求,那么定义32位的嘀嗒计数器,再定义一个嘀嗒计数器累加函数,尽量保证该函数在每个嘀嗒间隔内被调用至少一次。最坏情况下,必须在定时器溢出前调用一次。

// 定义 32 位的嘀嗒计数器
uint32_t tick32_count = 0;// 定义嘀嗒计数器的累加函数,尽量保证该函数在每个嘀嗒间隔内被调用至少一次。
void tick_loop(void)
{static uint16_t tick16_start = 0;uint16_t tick16_count = TIM0_CNT; // 假设TIM0的 counter 寄存器为 16 位tick32_count += tick16_count - tick16_start;tick16_start = tick16_count;
}

不用中断实现嘀嗒计数器相关推荐

  1. 调试模式和定时器,看门狗和嘀嗒定时器

    文章目录 一.调试模块 二.定时器模块 三.看门狗 四.系统时基定时器 五.定时器与内核之间的关系 杨桃32学习笔记,本文图片文字皆为转述 参考博客连接 一.调试模块 所谓调试的过程便是,写好程序然后 ...

  2. 【STM32F103】嘀嗒定时器(Systick)_延时函数

    STM32嘀嗒定时器--延时函数 一 系统Systick定时器 Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值.只要不把它 ...

  3. 嘀嗒APP打车体验记

    总的感觉就还是蛮爽的! 2013-11-24 要搬家, 在周围问了下搬家的面包要400,最低也要250,在百度上查了一下路程也就80块钱不到的- 于是就在23号晚上下载了嘀嗒打车软件,进行了约车- 选 ...

  4. 嘀嗒出行的IPO备战

    配图来自Canva可画 陈阿姨要上女儿家,临行前打不到车,在路边长时等待,终于等到一辆车但司机表示"赶时间交班",便扬长而去:李大叔想出门访友,在路边等了许久,出租车司机却对自己的 ...

  5. 嘀嗒出行显示服务器开小差,嘀嗒出行闪退怎么办 解决方法

    嘀嗒出行闪退怎么办?嘀嗒出行黑屏怎么办?闪退黑屏怎么解决?今天果盘小编为大家解答遇到嘀嗒出行闪退的解决方法! 嘀嗒出行这款游戏在如今真是非常的火爆,一开测就有上万玩家涌入服务器,但是可能有些玩家在玩的 ...

  6. STM8-TIMER实现系统嘀嗒计时器

    文章目录 1. timer.c 2. timer.h 3. 中断处理函数  STM8中没有系统嘀嗒计时器,所以用timer实现系统嘀嗒计时器的功能,每1ms产生一个中断.本次使用的是高速内部时钟,时钟 ...

  7. 关于HAL库中系统嘀嗒时钟的简单探究

    在利用HAL库建立STM32工程时,系统嘀嗒时钟的初始化是在函数HAL_Init()中实现的: HAL_StatusTypeDef HAL_Init(void) {/* Configure Flash ...

  8. 滴滴顺风车为嘀嗒IPO做了嫁衣裳

    配图来自Canva 在国庆.中秋双节的威力之下,"国庆堵车大赛"."高速遇堵车点外卖"."国庆堵车堵到钓鱼",一系列和堵车相关的话题频频在不 ...

  9. stm32专题九:SysTick(一)系统嘀嗒定时器原理

    SysTick是存在于stm32内核的定时器,嵌套在NVIC中,24位,只能递减.在stm32中文参考手册中,对于SysTick的描述其实很少,主要如下.systick的时钟可以为AHB时钟,或者是A ...

最新文章

  1. pkg-config工具在实际工程中的用法
  2. 关于 tsm 磁带槽位
  3. UA MATH577 逻辑与可计算性1 递归函数
  4. 美国25大最具价值博客网站出炉
  5. 5G的频谱效率,到底有多高
  6. inspinia前端模板怎样修改图标
  7. ITK:带有离散高斯滤波器的平滑图像
  8. matlab imfinfo返回图像信息
  9. 海量大数据大屏分析展示一步到位:DataWorks数据服务对接DataV最佳实践 1
  10. 4 读写文件_和尧名大叔一起从0开始学Python编程-简单读写文件
  11. vue 子页面调用父页面常用方式
  12. 血淋淋的教训—将Vue项目打包成app的跨域问题
  13. 浅析Spring.net 中的Aop使用
  14. 3月20 Ubuntu里运行脚本示例
  15. linux环境变量中无cc,Linux环境变量
  16. koa mysql 按钮级权限_Vue要做权限管理该怎么做?控制到按钮级别的权限怎么做?...
  17. 父与子的编程python_父与子的编程之旅:与小卡特一起学Python 完整版
  18. 繁凡的 ACM 退役记(一名普通算法竞赛选手与博主的竞赛生涯回忆录)凡是过往,皆为序章
  19. 三端口 DC-DC 变换器(C 题)-- 2021年全国大学生电子设计竞赛试题
  20. OC中继承代理委托类别

热门文章

  1. 微服务中的短信服务如何设计?
  2. 。求推荐一个usb集线器的购买网址
  3. 手机本地视频怎么投屏到电脑
  4. 可以ping 通IP地址但ping不通网址的解决方法
  5. 大学计算机基础知识简答题,大学计算机基础简答题汇总(题库).doc
  6. JAVA中Integer的缓存机制
  7. 配置简单的Git服务器
  8. 在代码的cmake时遇到Could NOT find Qt5Svg (missing: Qt5Svg_DIR)
  9. pl/sql developer的字符集问题
  10. Linux高级专题详解--shell编程大全(shell变量,if语句,case语句,for循环,while循环,函数调用,数组,正则表达式,shell脚本三剑客--grep,sed,awk家族)