当前位置: 首页 > news >正文

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 } }
http://www.cnnetsun.cn/news/127425.html

相关文章:

  • 20、微软 Windows Vista 使用指南:账户管理与数据保护
  • 15、活动目录用户与组管理操作指南
  • 17、活动目录计算机对象与组织单位管理指南
  • 12、Ourmon:网络监控与异常检测工具全解析
  • 22、恶意软件分析与检测全解析
  • 产品解读 | Ftrans SFT:信创浪潮下的FTP替代革命者
  • 继何恺明DyT后,LayerNorm再遭暴击!简单erf函数竟成Transformer新宠
  • C语言链表2
  • 蜣螂优化(DBO)算法在工程实际中求目标函数最小值的例子:压力容器设计成本最小化的4变量4约束...
  • 12、游戏内存中常见数据结构解析
  • 21、游戏响应式黑客技术全解析
  • 26、游戏隐藏与反检测技术全解析
  • Kotaemon网络安全问答:CVE漏洞快速查询
  • Kotaemon能否自动识别问题紧急程度?
  • 复杂时序场景的突围:金仓数据库是凭借什么超越InfluxDB?
  • 特价股票投资中的跨境投资策略与风险管理
  • 为分析经理制定全面的仪表板策略
  • MATLAB实现神经网络的模式识别
  • 17、在 Linux 系统中运行 Windows 程序及优化工作流
  • Kotaemon索引构建优化:FAISS vs HNSW性能对比
  • Kotaemon在低资源环境下的轻量化改造方案
  • 16、企业 Linux 桌面迁移与后台基础设施搭建指南
  • 19、数据迁移与备份:从 Windows 到 Linux 的全面指南
  • Kotaemon销售谈判策略建议:促成交易技巧
  • 特征工程中的特征构造技巧:大数据分析的创新实践
  • 32、Linux在不同场景下的应用优势与案例分析
  • 26、深入了解GNU Lesser General Public License
  • Hive实战任务 - 9.2 统计总分与平均分
  • Hive实战任务 - 9.3 实现学生信息排序和统计
  • 1、深入解析 Windows 2000 终端服务与 Citrix MetaFrame 配置