STM32 Cube MX配置SYS Timebase Source的步骤详解
在 STM32 CubeMX 中设置 SYS Timebase Source(系统时间基准源)是为了指定 HAL(硬件抽象层)库用于时间管理和延迟功能(如 HAL_Delay)的时间源。默认情况下,它使用 SysTick,但根据项目需求(例如使用 FreeRTOS 时),你可以选择其他定时器作为时间基准源。以下是具体设置步骤:
设置步骤
- 打开 CubeMX 项目:
- 启动 STM32CubeMX 并加载你的项目(.ioc 文件),或者新建一个项目并选择目标 STM32 芯片。
- 进入 Pinout & Configuration 视图:
- 在左侧导航栏中,点击 System Core,然后选择 SYS。
- 选择 Timebase Source:
- 在 SYS 配置面板中,找到 Timebase Source 下拉菜单。
- 默认选项是 SysTick(系统滴答定时器)。你可以点击下拉菜单,选择其他可用定时器(如 TIM1、TIM2、TIM6 等),具体选项取决于你的 STM32 型号支持的定时器。
- 如果你使用 FreeRTOS,建议选择一个独立的定时器(如 TIM6),因为 FreeRTOS 通常会占用 SysTick 来实现任务调度。
- 确认定时器可用性:
- 如果某个定时器选项是灰色的,可能是因为该定时器已被其他外设占用,或者在多核 MCU(如 STM32H7)中未分配给当前核心。
- 在这种情况下,先检查 Timers 类别,确保目标定时器未被启用或分配给其他功能。
- 时钟配置(可选):
- 如果你选择了某个定时器作为 Timebase Source,建议进入 Clock Configuration 选项卡,检查该定时器的时钟源和分频设置,确保其频率适合时间基准需求(通常 1ms 滴答,即 1kHz)。
- 生成代码:
- 配置完成后,点击顶部工具栏的 Generate Code(或按 Alt + K),生成项目代码。
- CubeMX 会自动在生成的代码中初始化所选的 Timebase Source,例如在 stm32xx_hal_conf.h 和 stm32xx_hal_timebase_tim.c 中配置相应的定时器。
注意事项
Nucleo F401RE开发板举例:
在 STM32F401RE 芯片上,使用 STM32 CubeMX 将 SYS Timebase Source 设置为 TIM10,TIM10 的频率取决于其时钟源和分频配置。以下是计算和设置 TIM10 频率的详细步骤:
1. TIM10 的时钟源
2. 默认时钟配置
在 STM32 CubeMX 的 Clock Configuration 视图中:
假设默认配置为 HCLK = 84 MHz,APB2 预分频器 = 1,则:
3. TIM10 的实际频率
TIM10 的“频率”通常指其计数频率或中断频率,这取决于以下两个参数:
在 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 默认设置
4. 在 CubeMX 中验证和调整
- 在 CubeMX 的 Pinout & Configuration 中,进入 System Core -> SYS,将 Timebase Source 设为 TIM10。
- 打开 Clock Configuration,确认 APB2 时钟频率(例如 84 MHz)。
- 生成代码后,检查 stm32f4xx_hal_conf.h 和 stm32f4xx_hal_timebase_tim.c 文件,确认 TIM10 的 PSC 和 ARR 值。
-
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; }
5. 结果
对于 STM32F401RE,若系统时钟配置为 84 MHz,APB2 预分频器 = 1,则 TIM10 的输入时钟 (TIM10CLK) 为 84 MHz。作为 SYS Timebase Source,默认配置下 TIM10 的中断频率为 1 kHz(1ms 周期)。如果你需要其他频率,可以调整 PSC 和 ARR。
作者:Zhao Jing