营销型网站易网拓microsoft做网站
2026/6/28 20:01:01 网站建设 项目流程
营销型网站易网拓,microsoft做网站,可以做cps合作的棋牌网站6,建筑培训网官网证件查询个人学习笔记#xff0c;高手勿喷 起因#xff1a;在配置F103的CDC时#xff0c;当初使用HAL_Delay(20000)延迟函数#xff0c;在延迟期间无法收到电脑串口发来的信息#xff0c;后发现是使用了阻塞式延迟函数的#xff0c;所以无法收到。 后来改成非阻塞式的延迟函数高手勿喷起因在配置F103的CDC时当初使用HAL_Delay(20000)延迟函数在延迟期间无法收到电脑串口发来的信息后发现是使用了阻塞式延迟函数的所以无法收到。后来改成非阻塞式的延迟函数串口和延迟两不误所以记录在此以后随时调用SysTick 是 ARM Cortex-M 系列内核中集成的一个简单定时器主要用于提供周期性的中断或延时功能常被用作系统的心跳定时器。在嵌入式系统中它通常有以下作用提供系统时基用于实现延时函数如代码中的HAL_Delay()通过计数来控制时间间隔。周期性中断可配置为定期触发中断用于执行周期性任务如系统调度、定时采样等。在 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) { // 任务1LED1每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 } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询