news 2026/6/26 12:51:31

STM32F1 非阻塞式延迟函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F1 非阻塞式延迟函数

个人学习笔记,高手勿喷
起因:在配置F103的CDC时,当初使用HAL_Delay(20000)延迟函数,在延迟期间无法收到电脑串口发来的信息,后发现是使用了阻塞式延迟函数的,所以无法收到。
后来改成非阻塞式的延迟函数,串口和延迟两不误,所以记录在此,以后随时调用

SysTick 是 ARM Cortex-M 系列内核中集成的一个简单定时器,主要用于提供周期性的中断或延时功能,常被用作系统的心跳定时器。在嵌入式系统中,它通常有以下作用:

  1. 提供系统时基:用于实现延时函数(如代码中的HAL_Delay()),通过计数来控制时间间隔。
  2. 周期性中断:可配置为定期触发中断,用于执行周期性任务(如系统调度、定时采样等)。

在 STM32 的 HAL 库中,SysTick 通常在HAL_Init()函数中完成初始化,默认配置为每 1ms 触发一次中断,为HAL_Delay()提供时间基准。

相当于linux的时间戳,这个是毫秒级的,上电从0开始增加

// 1. 全局时间基准(SysTick中断中自增) volatile uint32_t g_tick_ms = 0; // 2. SysTick初始化(1ms中断,假设系统时钟72MHz) void SysTick_Init(void) { SysTick_Config(SystemCoreClock / 1000); // 72MHz/1000 = 72000,每计数72000次触发1ms中断 } // 3. SysTick中断服务函数(自动调用) void SysTick_Handler(void) { g_tick_ms++; } // 4. 通用非阻塞延时判断函数(核心) // 输入:延时目标(ms)、存储起始时间的指针(每个任务独立一个变量) // 返回:0=未到时间,1=延时完成 uint8_t NonBlock_Delay(uint32_t delay_ms, uint32_t *p_start_time) { uint32_t current_time = g_tick_ms; // 首次调用时记录起始时间 if (*p_start_time == 0) { *p_start_time = current_time; return 0; } // 判断时间差是否达标(处理溢出) if ((current_time - *p_start_time) >= delay_ms) { *p_start_time = 0; // 重置,方便下次使用 return 1; } return 0; } // 5. 主函数中使用(多任务无阻塞) int main(void) { SysTick_Init(); GPIO_Init(...); // 初始化LED等外设,根据自己情况设置 uint32_t beep_delay = 0; // 蜂鸣器的延时计时变量(独立) uint32_t led1_delay = 0; // LED1的延时计时变量(独立) uint8_t led1_cnt = 100; // 循环执行100次 while(1) { // 任务1:LED1每500ms翻转一次,执行 led1_cnt 次 if (led1_cnt && NonBlock_Delay(500, &led1_delay)) { GPIO_ToggleBits(GPIOA, GPIO_Pin_0) //管脚自己设置 led1_cnt --; // } // 任务2:蜂鸣器每1200ms响一次 if (NonBlock_Delay(1200, &beep_delay)) { GPIO_ToggleBits(GPIOB, GPIO_Pin_1); } // 其他任务可正常执行,不被延时阻塞 //对于stm32 同时执行几百个延迟没压力,看单片机的RAM } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 0:51:33

Nginx负载均衡

文章目录**Nginx代理服务**正向代理(内部上网) 客户端<-->代理->服务端反向代理 客户端->代理<-->服务端正向与反向代理的区别Nginx反向代理配置Nginx代理配置的语法Nginx负载均衡**常用负载均衡软件****Nginx负载均衡类型****Nginx负载均衡配置场景**Nginx …

作者头像 李华
网站建设 2026/6/25 20:19:43

16、深入解析IRC协议与僵尸网络检测

深入解析IRC协议与僵尸网络检测 在当今数字化的网络环境中,僵尸网络(Botnet)已成为网络安全的一大威胁。IRC(Internet Relay Chat)协议由于其开放性和灵活性,常被黑客利用来构建和控制僵尸网络。本文将深入探讨如何通过分析IRC协议和相关统计报告来检测僵尸网络的客户端…

作者头像 李华
网站建设 2026/6/24 16:42:13

21、CWSandbox 恶意软件分析:原理与报告解读

CWSandbox 恶意软件分析:原理与报告解读 1. API 挂钩技术 在调用进程的虚拟内存中, cwmonitor.dll 能够定位函数,可通过使用 GetProcAddress API 函数,或者手动解析包含 Windows DLL 模块的导出地址表(EAT)来实现。为了捕获对特定函数的所有调用,会将 JMP 指令作…

作者头像 李华
网站建设 2026/6/26 2:32:19

25、应对僵尸网络:策略与实践

应对僵尸网络:策略与实践 1. 僵尸网络威胁与预防措施 僵尸网络对系统安全构成了严重威胁,为了防止其感染系统,我们可以采取一系列措施。进行系统完整性检查、使用个人防火墙、加密软件,以及在计算机上运行杀毒、反间谍软件和反恶意软件工具,这些都能有效预防僵尸网络的入…

作者头像 李华
网站建设 2026/6/25 18:00:26

Kotaemon新员工入职培训内容生成

Kotaemon新员工入职培训内容生成 在企业智能化转型加速的今天&#xff0c;越来越多公司开始部署基于大语言模型&#xff08;LLM&#xff09;的智能客服系统。然而&#xff0c;现实中的落地挑战远比想象中复杂&#xff1a;知识更新滞后、回答“一本正经地胡说八道”、无法执行实…

作者头像 李华
网站建设 2026/6/26 1:20:13

13、游戏内存读写全攻略

游戏内存读写全攻略 在游戏破解的世界里,内存取证是一项既耗时又充满挑战的工作。不过,只要掌握了正确的方法和技巧,就能轻松应对各种难题。下面将详细介绍如何在游戏中检测值是否在映射中,以及如何获取游戏进程的标识符、句柄,进而实现对游戏内存的读写操作,同时还会涉…

作者头像 李华