STM8定时器与软件循环实现毫秒级延时的对比与优化

STM8 如何生成一个可以延时ms级别的函数 在STM8微控制器上生成一个可以延时毫秒级别的函数通常涉及到使用定时器或者简单的软件循环。在资源受限的嵌入式系统中,软件循环是最简单的方法,但它不是特别精确,并且会占用CPU时间。另一方面,使用定时器可以提供更精确的延时,并且允许CPU在等待时执行其他任务。如果你使用的是其他库或者直接操作寄存器,可能需要调整这些函数的实现。同样,确保你的STM8时钟配置正确,因为这会影响到定时器的配置。请注意,这个例子没有考虑CPU时钟速度的变化,所以你需要根据你的CPU时钟速度调整循环次数。 阅读详情

1. 为什么STM8的延时函数这么重要?

如果你刚开始玩STM8单片机,肯定会遇到一个最基础但又绕不开的问题:怎么让程序“等一会儿”?比如,你想让一个LED灯闪烁,亮一秒灭一秒,这个“一秒”怎么实现?这就是延时函数要干的事儿。在STM8这种资源有限的8位MCU上,实现一个稳定、准确的毫秒级延时,看似简单,实则暗藏玄机。我刚开始做项目的时候,也在这上面踩过不少坑,比如用软件循环延时,结果发现按键反应迟钝,或者用定时器延时,又觉得配置起来太麻烦。

其实,STM8上实现毫秒级延时,主流就两种方法:软件循环延时和硬件定时器延时。前者就像你心里默数“1、2、3…”,数够了时间就到了;后者就像你设了个闹钟,闹钟响了时间才到,在这期间你还能干点别的。这两种方法,一个简单粗暴但“占着茅坑不拉屎”,一个稍微复杂但“精准高效”。这篇文章,我就结合自己多年的实战经验,带你彻底搞懂这两种方法的原理、优缺点,并给出具体的优化方案和代码,让你无论是做简单的玩具,还是稍微复杂点的控制板,都能游刃有余。

2. 软件循环延时:新手的第一把“瑞士军刀”

软件循环延时,绝对是嵌入式新手接触到的第一个延时方法。它的原理超级简单:让CPU执行一堆无意义的空操作指令,靠消耗固定的时钟周期来“磨”时间。

2.1 一个最基础的实现代码

下面这个函数,相信很多朋友都写过或用过:

#define F_CPU 16000000UL // 假设你的STM8主频是16MHz

void delay_ms(uint16_t ms) {
    volatile uint32_t i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 4200; j++) { // 这个“4200”是个经验值
            __asm__("nop"); // 插入一个空操作汇编指令
        }
    }
}

这段代码干了啥?外层循环控制“多少毫秒”,内层循环和nop指令共同构成“1毫秒”的耗时。这里的volatile关键字很重要,它告诉编译器:“别优化我的循环变量!”,否则编译器一看你这i和j光循环啥也不干,可能直接给你优化没了,延时也就失效了。

2.2 软件延时的“阿喀琉斯之踵”:精度与CPU占用

软件延时最大的优点就是简单,不需要初始化任何外设,拿来就用。但它有几个致命的缺点,我一个个给你掰扯清楚。

第一,精度差,受时钟影响大。 上面代码里的4200这个魔法数字是怎么来的?它是基于16MHz主频,结合编译器优化级别、每条指令的执行周期,反复测试或计算出来的。如果你的主频不是16MHz,或者你换了编译器、改了优化等级(比如从-O0改成-Os),这个数字就得重新调。我遇到过最坑的情况是,代码在调试模式(无优化)下延时准确,一发布(高优化等级)时间就全乱了。更别提如果系统时钟源(HSI/HSE)本身有偏差,延时误差会进一步放大。

第二,CPU被完全霸占,效率极低。 这是软件延时最被人诟病的地方。在执行delay_ms(1000)这一秒钟里,CPU什么事都干不了,就在那傻傻地数数。这在只有一个任务的简单系统中勉强可以接受,但一旦你的系统需要同时响应按键、刷新显示、读取传感器,这种“阻塞式”延时就会让整个系统看起来“卡顿”甚至“死机”。比如,你正在用延时等待一个温度传感器稳定,这时用户按了按键,系统是没法响应的。

第三,难以实现长时间、高精度延时。 你想延时1小时怎么办?难道让for循环跑3600*1000次?先不说变量会不会溢出,这么长的阻塞时间,你的系统跟“死”了没区别。而且,由于循环本身有开销,微秒(us)级的短延时很难用纯软件循环精确实现。

所以,软件循环延时就像一把钝刀,切切豆腐还行,真要上硬菜,就得换工具了。

3. 硬件定时器延时:精准的“时间管家”

当你受够了软件延时的种种不便,就该请出更专业的工具——硬件定时器。STM8芯片内部通常集成了多个定时器(如TIM1, TIM2, TIM3, TIM4等),它们就像几个独立的小闹钟,不依赖CPU执行指令来计时,而是靠硬件时钟源自己走。

3.1 定时器延时的核心思想

定时器延时的原理是:配置一个定时器,让它每隔一个固定的时间(比如1ms)产生一个“时间到”

用STM32F407的SysTick定时器实现精准延时:告别粗糙的for循环delay_ms函数 本文详细介绍了如何使用STM32F407的SysTick定时器实现精准延时,替代传统的for循环delay_ms函数。通过解析SysTick硬件原理、构建精准延时库及高级应用优化,帮助开发者提升嵌入式系统的定时精度和CPU利用率,适用于STM32F407VET6等开发场景。 阅读详情

相关推荐

STM32CubeMX LL库实战:SysTick定时器配置避坑与精准延时实现(基于STM32F103)

本文深入解析STM32CubeMX LL库中SysTick定时器的配置技巧与精准延时实现方法,特别针对STM32F103开发中的常见问题进行避坑指南。通过对比LL库与HAL库的核心差异,提供微秒级和毫秒级高精度延时的三种实现方案,并分享异常排查与低功耗优化技巧,帮助开发者提升嵌入式系统的时序控制精度与能效比。

weixin_30753873的博客 730

用STM32定时器实现精准延时:从us到ms的三种实现方案对比

本文深入探讨STM32定时器实现精准延时的三种方案:查询方式、中断方式和DWT时钟周期计数器,详细对比它们的精度、CPU占用及适用场景。通过实测数据展示微秒到毫秒级延时的性能差异,并提供物联网设备优化建议,帮助开发者选择最佳定时器方案。

weixin_29194255的博客 180

stm32延时us寄存器_STM32延时函数的四种方法

目录单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()。本文基于STM32F207介绍4种不同方式实现的延时函数。1、普通延时这种延时方式应该是大家在51单片机时候,接触最早的延时函数。这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,在某些编译器下,代码会被优化,导致精度较低,用于一般的延时,对精度不敏感的应用场景中。...

weixin_32328999的博客 1120

STM32基于SysTick的精确延时实现与工程封装

嵌入式系统中的精确延时是保障外设时序、传感器采样、电机控制等关键功能的基础能力。其本质依赖硬件定时器对系统时钟的精准分频与计数,而非不可靠的软件空循环。原理上,通过配置Cortex-M内核集成的SysTick定时器,结合运行时HCLK频率动态计算微秒级延时系数(fac_us),可构建μs/ms/s三级精度的阻塞式延时服务。该方案具备高可移植性、低资源占用和确定性执行特性,技术价值在于统一时序抽象、规避编译器与中断干扰,并支撑LED闪烁、蜂鸣器驱动、继电器启停等典型开关型器件控制。本文以STM32F103平台

weixin_35649491的博客 710

用STM32F407VET6的SysTick定时器实现精准延时:告别粗糙的for循环delay

本文详细介绍了如何利用STM32F407VET6的SysTick定时器实现精准延时,替代传统的for循环延时方法。通过解析SysTick的硬件架构和寄存器操作,提供了微秒级和毫秒级延时的实战代码,并探讨了在PWM波形模拟、多任务调度等高级应用中的使用技巧,帮助开发者提升嵌入式系统的定时精度和效率。

weixin_30315723的博客 290

别再傻傻用空循环了!STM32F103C8T6精准延时实战:SysTick与TIM3配置详解

本文详细介绍了STM32F103C8T6精准延时实战,对比空循环延时的低效问题,重点解析SysTick与TIM3硬件定时器的配置与应用。通过具体代码示例,展示如何实现微秒级和毫秒级精准延时,提升嵌入式系统的时间控制精度与效率,特别适合驱动WS2812B等对时序要求严格的外设。

weixin_30316097的博客 407

12、STM8(TIM1)定时器

文章目录1、概述1.1、定时器特点1.2、TIM1功能特点1.3、TIM1预分频器的实现1.4、向上计数模式1.5、向下计数模式1.6、中央对齐模式(向上/向下计数)1.7、定时器使用重点2、代码实现2.1、寄存器版2.2、库函数版 1、概述   STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1) 、通用型 (TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器来设计应用变得非常容易与方便 (相同的寄存器映射,相

嵌入式羊圈 2157

使用 VPN 访问太理内部网相关问题总结【太原理工大学】

电脑连接 VPN,访问校园内部网相关问题总结,太原理工大学。

m0_52861684的博客 9830

数据库实验报告--MySQL

数据库完整版报告--MySQL 包括数据库创建、表的创建、视图以及授权和触发器的创建等内容,全是精华!看完点赞加收藏O(∩_∩)O~。

Mortalz7 4918

深入解析Sigma Delta调制器 —— 从电流采样到数字信号处理的完整链路

本文深入解析了Sigma Delta调制器的工作原理与应用。通过剖析过采样、噪声整形与负反馈核心机制,并结合AMC1306等实例,详细阐述了从电流采样到数字信号处理的完整链路。该技术凭借其高精度和高抗干扰能力,在ADC、电流测量及音频处理等领域发挥着关键作用。

ttt77的博客 639

动态博弈、威胁与承诺(博弈论入门学习笔记四)

0 动态博弈 动态博弈:行动有先后顺序,不同的参与人在不同时点行动,先行动者的选择影响后行动者的选择空间,后行动者可以观察到先行动者做了什么选择。例如下棋、消费者和商家讨价还价、谈婚论嫁、企业之间的价格战等等。 因此,为了做出最优的行动选择,每个参与人都应该思考:如果我如此选择,对方将如何应对?如果我是他,我将会如何行动?给定他的应对,什么是我的最优选择? 动态博弈中的战略:在博弈开始之前就...

stepho的博客 1万+

Python经典编程习题100例:第25例:求各个阶乘的和

不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程100例习题汇总 题目描述: 求1+2!+3!+…+20!的和。 解题思路: > 调用math模块中的factorial函数 代码: import math sum=0 for i in range(1,21): sum+=math.factorial(i) print(sum) ..

CSDN 精品推荐 2731

YOLOv8改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用

本文记录的是利用双级路由注意力机制优化的目标检测网络模型。传统的复杂度高,随着输入空间分辨率增加,计算量呈平方增长,导致严重的可扩展性问题。而本文所使用的在获取全局信息的同时,通过区域到区域路由和令牌到令牌注意力的合理设计,减少了不必要的计算量。BiFormer: Vision Transformer with Bi-Level Routing Attention采用四阶段金字塔结构,与一些先进的视觉Transformer类似。在每个阶段,首先使用重叠的补丁嵌入(在第一阶段)或补丁合并模块(在第二到第四阶段

Limiiiing的博客 604

ARM功耗管理之功耗状态及功耗模式

思考:功耗状态?功耗模式?Core&Cluster&Device&SoC如何映射?

AI-安全-功耗 774

12、知识图谱数据处理与推理全解析

本文深入解析了知识图谱中的数据处理与推理技术,涵盖SHACL的多种约束类型(如值约束、范围约束、字符串约束、逻辑约束等)及其在数据质量控制中的应用,并介绍了常用的SHACL工具与实际案例。文章对比了SPARQL与SHACL的特点,探讨了RDF(S)的局限性,引出表达能力更强的OWL和OWL2语言及其在语义网和生物医学等领域的应用。此外,还阐述了规则在知识表示中的作用,包括产生式规则和Datalog规则,并总结了知识图谱中推理的重要性与典型流程,为构建高质量、可推理的知识图谱提供了全面的技术指导。

zz67890的博客 128

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: RK3588开发实战:如何从零开始手动移植uboot源码(避坑指南)
下一篇: 【数字逻辑】实战解析:74LS193计数器与移位寄存器在嵌入式系统中的应用设计
机智的E君
博客等级 码龄10年 83粉丝 6770原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值