STM32 Cube MX配置SYS Timebase Source的步骤详解

在 STM32 CubeMX 中设置 SYS Timebase Source(系统时间基准源)是为了指定 HAL(硬件抽象层)库用于时间管理和延迟功能(如 HAL_Delay)的时间源。默认情况下,它使用 SysTick,但根据项目需求(例如使用 FreeRTOS 时),你可以选择其他定时器作为时间基准源。以下是具体设置步骤:

设置步骤

  1. 打开 CubeMX 项目:
  2. 启动 STM32CubeMX 并加载你的项目(.ioc 文件),或者新建一个项目并选择目标 STM32 芯片。
  3. 进入 Pinout & Configuration 视图:
  4. 在左侧导航栏中,点击 System Core,然后选择 SYS
  5. 选择 Timebase Source:
  6. SYS 配置面板中,找到 Timebase Source 下拉菜单。
  7. 默认选项是 SysTick(系统滴答定时器)。你可以点击下拉菜单,选择其他可用定时器(如 TIM1、TIM2、TIM6 等),具体选项取决于你的 STM32 型号支持的定时器。
  8. 如果你使用 FreeRTOS,建议选择一个独立的定时器(如 TIM6),因为 FreeRTOS 通常会占用 SysTick 来实现任务调度。
  9. 确认定时器可用性:
  10. 如果某个定时器选项是灰色的,可能是因为该定时器已被其他外设占用,或者在多核 MCU(如 STM32H7)中未分配给当前核心。
  11. 在这种情况下,先检查 Timers 类别,确保目标定时器未被启用或分配给其他功能。
  12. 时钟配置(可选):
  13. 如果你选择了某个定时器作为 Timebase Source,建议进入 Clock Configuration 选项卡,检查该定时器的时钟源和分频设置,确保其频率适合时间基准需求(通常 1ms 滴答,即 1kHz)。
  14. 生成代码:
  15. 配置完成后,点击顶部工具栏的 Generate Code(或按 Alt + K),生成项目代码。
  16. CubeMX 会自动在生成的代码中初始化所选的 Timebase Source,例如在 stm32xx_hal_conf.h 和 stm32xx_hal_timebase_tim.c 中配置相应的定时器。

注意事项

  • SysTick vs 定时器:
  • SysTick 是 Cortex-M 内核内置的简单定时器,适合基本应用。但在 RTOS(如 FreeRTOS)中,SysTick 通常被 RTOS 占用,因此 HAL 需要一个独立的定时器来避免冲突。
  • 使用专用定时器(如 TIM6)可以提高系统的模块化,但会占用一个硬件资源。
  • FreeRTOS 的特殊情况:
  • 如果启用了 FreeRTOS,CubeMX 会在生成代码时提示:“When FreeRTOS is used, it is strongly recommended to use a HAL timebase source other than the SysTick”。此时,必须选择一个定时器,否则可能导致时间管理混乱。
  • 中断优先级:
  • 生成代码后,检查 NVIC(嵌套向量中断控制器)设置,确保所选定时器的中断优先级正确配置(通常在 System Core -> NVIC 中)。默认优先级可能需要根据应用调整。
  • 代码验证:
  • 生成代码后,查看 main.c 中的 HAL_Init() 函数调用,它会初始化时间基准。可以用调试器验证时间基准是否正常工作,例如通过 HAL_Delay 测试延迟是否准确
  • Nucleo F401RE开发板举例:

    在 STM32F401RE 芯片上,使用 STM32 CubeMX 将 SYS Timebase Source 设置为 TIM10,TIM10 的频率取决于其时钟源和分频配置。以下是计算和设置 TIM10 频率的详细步骤:

    1. TIM10 的时钟源

  • STM32F401RE 是基于 Cortex-M4 的单核 MCU。
  • TIM10 是一个 16 位通用定时器,挂接在 APB2 总线上。因此,TIM10 的时钟源来自 APB2 时钟
  • 在 STM32F401RE 中,APB2 时钟的频率由系统时钟 (HCLK) 和 APB2 预分频器 (APB2 Prescaler) 决定。
  • 2. 默认时钟配置

    在 STM32 CubeMX 的 Clock Configuration 视图中:

  • 默认情况下,STM32F401RE 的系统时钟 (SYSCLK) 可以配置为最高 84 MHz(通过 HSE 或 PLL)。
  • APB2 时钟 (PCLK2) 通常由 HCLK 分频得出:
  • 如果 APB2 预分频器设置为 1,则 PCLK2 = HCLK。
  • 如果 HCLK = 84 MHz,且 APB2 预分频器 = 1,则 PCLK2 = 84 MHz。
  • TIM10 的输入时钟 (TIM10CLK) 是 PCLK2 的频率,但需要注意定时器时钟的倍频规则:
  • 如果 APB2 预分频器 > 1,则 TIM10CLK = PCLK2 × 2。
  • 如果 APB2 预分频器 = 1,则 TIM10CLK = PCLK2。
  • 假设默认配置为 HCLK = 84 MHz,APB2 预分频器 = 1,则:

  • PCLK2 = 84 MHz
  • TIM10CLK = 84 MHz
  • 3. TIM10 的实际频率

    TIM10 的“频率”通常指其计数频率或中断频率,这取决于以下两个参数:

  • 预分频器 (Prescaler, PSC):将 TIM10CLK 分频。
  • 自动重载值 (Auto-Reload Register, ARR):决定计数器溢出的周期。
  • 在 CubeMX 中,当你将 SYS Timebase Source 设置为 TIM10 时,生成的代码会自动配置 TIM10 以产生 1ms 的时间基准(即 1kHz 的中断频率),这是 HAL 库的标准设置。

    计算公式: fTIM10=TIM10CLK(PSC+1)×(ARR+1) f_{TIM10} = \frac{TIM10CLK}{(PSC + 1) \times (ARR + 1)} fTIM10​=(PSC+1)×(ARR+1)TIM10CLK​

    CubeMX 默认设置
  • 假设 TIM10CLK = 84 MHz。
  • CubeMX 通常配置:
  • PSC = 83(预分频器从 0 开始计数,所以 PSC + 1 = 84)。
  • ARR = 999(从 0 计数到 999,共 1000 个周期)。
  • 则: fTIM10=84,000,000(83+1)×(999+1)=84,000,00084×1000=1000 Hz=1 kHz f_{TIM10} = \frac{84,000,000}{(83 + 1) \times (999 + 1)} = \frac{84,000,000}{84 \times 1000} = 1000 \, \text{Hz} = 1 \, \text{kHz} fTIM10​=(83+1)×(999+1)84,000,000​=84×100084,000,000​=1000Hz=1kHz
  • 这对应于 1ms 的时间间隔,符合 HAL 时间基准的要求。
  • 4. 在 CubeMX 中验证和调整

  • 步骤:
    1. 在 CubeMX 的 Pinout & Configuration 中,进入 System Core -> SYS,将 Timebase Source 设为 TIM10。
    2. 打开 Clock Configuration,确认 APB2 时钟频率(例如 84 MHz)。
    3. 生成代码后,检查 stm32f4xx_hal_conf.h 和 stm32f4xx_hal_timebase_tim.c 文件,确认 TIM10 的 PSC 和 ARR 值。
    4. HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
      {
        RCC_ClkInitTypeDef    clkconfig;
        uint32_t              uwTimclock = 0U;
      
        uint32_t              uwPrescalerValue = 0U;
        uint32_t              pFLatency;
      
        HAL_StatusTypeDef     status;
      
        /* Enable TIM10 clock */
        __HAL_RCC_TIM10_CLK_ENABLE();
      
      /* Get clock configuration */
        HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
      
        /* Compute TIM10 clock */
            uwTimclock = HAL_RCC_GetPCLK2Freq();
      
        /* Compute the prescaler value to have TIM10 counter clock equal to 1MHz */
        uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);
      
        /* Initialize TIM10 */
        htim10.Instance = TIM10;
      
        /* Initialize TIMx peripheral as follow:
      
        + Period = [(TIM10CLK/1000) - 1]. to have a (1/1000) s time base.
        + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
        + ClockDivision = 0
        + Counter direction = Up
        */
        htim10.Init.Period = (1000000U / 1000U) - 1U;
        htim10.Init.Prescaler = uwPrescalerValue;
        htim10.Init.ClockDivision = 0;
        htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
        htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      
        status = HAL_TIM_Base_Init(&htim10);
        if (status == HAL_OK)
        {
          /* Start the TIM time Base generation in interrupt mode */
          status = HAL_TIM_Base_Start_IT(&htim10);
          if (status == HAL_OK)
          {
          /* Enable the TIM10 global Interrupt */
              HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
            /* Configure the SysTick IRQ priority */
            if (TickPriority < (1UL << __NVIC_PRIO_BITS))
            {
              /* Configure the TIM IRQ priority */
              HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, TickPriority, 0U);
              uwTickPrio = TickPriority;
            }
            else
            {
              status = HAL_ERROR;
            }
          }
        }
      
       /* Return function status */
        return status;
      }
  • 调整频率:
  • 如果需要不同的频率(例如 10kHz),可以在 CubeMX 的 TIM10 配置中手动设置 PSC 和 ARR,或者在生成代码后修改初始化参数。
  • 5. 结果

    对于 STM32F401RE,若系统时钟配置为 84 MHz,APB2 预分频器 = 1,则 TIM10 的输入时钟 (TIM10CLK) 为 84 MHz。作为 SYS Timebase Source,默认配置下 TIM10 的中断频率为 1 kHz(1ms 周期)。如果你需要其他频率,可以调整 PSC 和 ARR。

  •  

    作者:Zhao Jing

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 Cube MX配置SYS Timebase Source的步骤详解

    发表回复