打印
[STM32WBA]

【STM32WBA52CG测评】-5- 定时器模块TIM模块产生1微秒延迟

[复制链接]
1731|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 南来之风 于 2023-7-31 22:42 编辑

#申请原创# 目前ST官方库有1ms的延迟函数:HAL_Delay(),但是有时候需要用到1us延迟,官方没有提供HAL库供我们调用。此时可以使用功能强大的TIM模块来产生任意时间点延迟,并最终实现呼吸灯效果。

关于TIM模块的基本用法,可以参考我的上一篇帖子:【STM32WBA52CG测评】-4- 定时器模块TIM例程分析 https://bbs.21ic.com/icview-3318482-1-1.html


本次我们将修改main.h中TIM模块相关参数,实现一个1us的中断,然后在ISR中,放置一个计数器,之后封装一个微秒延迟接口供主函数调用。


/* USER CODE BEGIN Private defines */
/*
    In this example TIM2 input clock (TIM2CLK)  is set to APB1 clock (PCLK1),
    since APB1 prescaler is equal to 1.
      TIM2CLK = PCLK1
      PCLK1 = HCLK
      => TIM2CLK = HCLK = SystemCoreClock
    To get TIM2 counter clock at 2 MHz, the Prescaler is computed as following:
    Prescaler = (TIM2CLK / TIM2 counter clock) - 1
    Prescaler = (SystemCoreClock /2 MHz) - 1

    Note:
     SystemCoreClock variable holds HCLK frequency and is defined in system_stm32wbaxx.c file.
     Each time the core clock (HCLK) changes, user had to update SystemCoreClock
     variable value. Otherwise, any configuration based on this variable will be incorrect.
     This variable is updated in three ways:
      1) by calling CMSIS function SystemCoreClockUpdate()
      2) by calling HAL API function HAL_RCC_GetSysClockFreq()
      3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
  ----------------------------------------------------------------------- */

/* Compute the prescaler value to have TIMx counter clock equal to 2000000 Hz (2 MHz) */

#define PRESCALER_VALUE (uint32_t)(((SystemCoreClock) / (2000000)) - 1)

  /* Initialize TIMx peripheral as follows:
       + Period = 10000 - 1
       + Prescaler = (SystemCoreClock/1000000) - 1
       + ClockDivision = 0
       + Counter direction = Up
  */

#define PERIOD_VALUE (2 - 1);
上面的代码,把TIM模块100MHz的时钟,通过预分频器后得到2MHz的时钟,接着定义Period参数为1,这样就是2MHz/(Period + 1) = 1MHz

每1us进入如下函数执行,其中myCounter是一个静态全局变量:
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Period elapsed callback in non blocking mode
  * @param  htim : TIM handle
  * @retval None
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        myCounter++;
        BSP_LED_Toggle(LD3);
}


接着封装一个延迟函数:
void my_delay_us(uint32_t Nus){
        
        uint32_t i = myCounter;
        while((myCounter - i ) <= Nus){
                ;
        }        
}


主函数中通过如下简单的延迟,即可实现呼吸灯的效果

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
                for(i = 0; i < interVal; i++){
                        BSP_LED_Off(LD1);
                        my_delay_us(i);
                        BSP_LED_On(LD1);
                        my_delay_us(interVal-i);                        
                }
                for(i = 0; i < interVal; i++){
                        BSP_LED_On(LD1);
                        my_delay_us(i);
                        BSP_LED_Off(LD1);
                        my_delay_us(interVal-i);                        
                }         

  }

最终效果:



使用特权

评论回复
沙发
rosemoore| | 2023-8-7 07:34 | 只看该作者
定时超时如何计算?               

使用特权

评论回复
板凳
belindagraham| | 2023-8-7 07:58 | 只看该作者
stm32的定时器怎么做1秒的周期

使用特权

评论回复
地板
fengm| | 2023-8-7 08:04 | 只看该作者
STM32定时器模块TIM模块提供了多种定时器模式,包括单向计数模式、双向计数模式、脉冲模式等。不同的定时器模式会影响定时器的计数速度和延迟时间,需要选择合适的定时器模式来减少或避免产生1微秒延迟的问题。

使用特权

评论回复
5
mnynt121| | 2023-8-7 17:15 | 只看该作者
一个变量在us定时器中断中去累加

使用特权

评论回复
6
nomomy| | 2023-8-7 19:09 | 只看该作者
通用定时器进行微秒级延迟该如何设置分频系数

使用特权

评论回复
7
jackcat| | 2023-8-9 15:55 | 只看该作者
可以通过它的计时器进行延时设置。

使用特权

评论回复
8
hilahope| | 2023-8-9 16:16 | 只看该作者
void delay_us(uint16_t us) {
  uint16_t count_val = us;  // 设置延迟的计数值

  __HAL_RCC_TIM2_CLK_ENABLE();  // 使能TIM2时钟

  TIM_HandleTypeDef htim2;
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 71;  // 预分频因子为72-1
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = count_val;  // 设置计数值
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim2);

  HAL_TIM_Base_Start(&htim2);  // 启动定时器

  while (__HAL_TIM_GET_COUNTER(&htim2) < count_val);  // 轮询检查计数器的值,直到达到延迟时间

  HAL_TIM_Base_Stop(&htim2);  // 停止定时器
  __HAL_RCC_TIM2_CLK_DISABLE();  // 关闭TIM2时钟
}

使用特权

评论回复
9
mikewalpole| | 2023-8-9 21:17 | 只看该作者
STM32定时器模块TIM模块是一种用于产生定时器的模块,可以用于实现各种定时器功能。

使用特权

评论回复
10
beacherblack| | 2023-8-14 14:40 | 只看该作者
在使用STM32定时器模块TIM模块时,可能会遇到产生1微秒延迟的问题。

使用特权

评论回复
11
gygp| | 2023-8-14 19:15 | 只看该作者
对于1微秒的延迟,通常需要使用较高的定时器时钟频率和较小的预分频器和计数器值,以确保精确性和准确性。

使用特权

评论回复
12
heweibig| | 2023-8-14 20:06 | 只看该作者
1微秒的延迟的问题是不好搞

使用特权

评论回复
13
Undshing| | 2023-8-14 23:11 | 只看该作者
可以修改hal库达到1us延时

使用特权

评论回复
14
南来之风|  楼主 | 2023-8-15 08:19 | 只看该作者
Undshing 发表于 2023-8-14 23:11
可以修改hal库达到1us延时

谢佬,那修改后会影响1ms那个不?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

252

帖子

2

粉丝