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
  }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值