stm32 阻塞式延时 与 非阻塞式延时

这里写自定义目录标题

示例

阻塞场景

c 复制代码
    tickstart = HAL_GetTick();
    /* Wait till RTC is in INIT state and if Time out is reached exit */
    while ((READ_BIT(hrtc->Instance->ISR, RTC_ISR_INITF) == 0U) && (status != HAL_TIMEOUT))
    {
      if ((HAL_GetTick()  - tickstart) > RTC_TIMEOUT_VALUE)
      {
        status = HAL_TIMEOUT;
        hrtc->State = HAL_RTC_STATE_TIMEOUT;
      }

实现

1 阻塞式延时

c 复制代码
static uint32_t timer_tick, timer_period;
void LPTIM2_Init(uint16_t period_ms) // 低功耗定时器2初始化(周期近似1ms)
{	
	timer_period = period_ms;
	//...
}
void LPTIM2_IRQHandler(void) 	
{
    if ((LPTIM2->ISR & LPTIM_ISR_ARRM) != 0) {
		timer_tick_inc();
        LPTIM2->ICR |= LPTIM_ICR_ARRMCF; // 清除重载中断标志
    }
}
uint32_t timer_get_tick(void)
{
  return timer_tick;
}

void timer_tick_inc(void)
{
  timer_tick += timer_period;
}
/**
 * @brief  阻塞式延时函数,确保至少等待 m_delay 个时间单位。
 * @param  m_delay 期望延时的基数单位(单位由 timer_period 决定,如毫秒)。
 * @note   实际延时可能比 m_delay 多 1 个 timer_period,以保证最小等待时间。
 * 		   需要 LPTIM2_Init
 */
void timer_delay(uint32_t m_delay)
{
  uint32_t tickstart = timer_get_tick();
  uint32_t wait = m_delay;

  /* 增加一个 timer_period 避免在计时器更新边界时等待不足 */
  if (wait < 0xFFFFFFFFU) // 防止溢出
  {
    wait += timer_period; // 确保延时可靠性,但会使总延时增加一个 timer_period
  }

  /* 阻塞等待,直到满足时间差 */
  while ((timer_get_tick() - tickstart) < wait)
  {
  }
}

2 非阻塞式延时

复制代码
/**
 * @brief  检查自指定起始时间起是否已超时。
 * @param  start   起始时间点(需通过 timer_get_tick() 获取)。
 * @param  timeout 超时阈值(单位与 timer_get_tick() 的时间单位一致)。
 * @return bool    - true: 已超时
 *                 - false: 未超时
 */
bool is_timeout(unsigned int start, unsigned int timeout) {
    return timer_get_tick() - start > timeout;
}
相关推荐
某林21220 小时前
ROS2与STM32通信详解
stm32·单片机·嵌入式硬件
EVERSPIN1 天前
MCU微控制器,N32H47x高性能MCU机器人关节控制方案
单片机·嵌入式硬件·机器人·mcu微控制器
0南城逆流01 天前
【STM32】知识点介绍三:哈希算法详解
stm32·嵌入式硬件·哈希算法
云山工作室1 天前
基于STM32单片机的正激式开关电源设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·课程设计·毕设
芯希望1 天前
芯伯乐700mA线性稳压器XBLW L78M05H/L78M12H:稳定可靠,简化电源设计
单片机·嵌入式硬件
lingzhilab1 天前
零知IDE——STM32F407VET6驱动SHT40温湿度传感器与ST7789实现智能环境监测系统
stm32·单片机·嵌入式硬件
贝塔实验室1 天前
Altium Designer 6.3 PCB LAYOUT教程(四)
驱动开发·嵌入式硬件·硬件架构·硬件工程·信息与通信·基带工程·pcb工艺
星辰pid1 天前
stm32的gpio模式到底该怎么选择?(及iic,spi,定时器原理介绍)
stm32·单片机·嵌入式硬件
brave and determined1 天前
可编程逻辑器件学习(day3):FPGA设计方法、开发流程与基于FPGA的SOC设计详解
嵌入式硬件·fpga开发·soc·仿真·电路·时序·可编程逻辑器件
axuan126511 天前
10.【NXP 号令者RT1052】开发——实战-RT 看门狗(RTWDOG)
单片机·嵌入式硬件·mcu