[STM32F4] STM32F411 的定时器级联问题

[复制链接]
236|5
地瓜patch 发表于 2025-11-3 10:39 | 显示全部楼层 |阅读模式
我在 STM32CubeIDE 开发 F411 项目想用定时器级联功能。
TIM2【主定时器】——> TIM5(或 TIM9)【从定时器】
STM32F4 的手册(RM390)中没有关于外设互连矩阵功能的描述,但我在 G4 的手册(RM0440)中找到了相关内容。
根据手册,TIM2 应将其 TRGO 信号发送到 ITR1 通道。
在我的测试中,使用 ITR1 无法正常工作,必须改用 ITR0 才行。
如果在 TIM5 中使用 ITR1,主定时器 TIM2 就无法工作。
使用 ITR2 和 ITR3 不会影响 TIM2,但 TIM5 无法从 TIM2 获取时钟。代码如下:
有高手了解 STM32F4 的外设互连矩阵功能吗?
==========================================
Excerpt of the code generated by CubeIDE
==========================================
********************************************
TIM_Callback.c
********************************************
#include "main.h"
extern int cnt, cnt2 ;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
         if (htim->Instance == TIM2) {
             HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
             cnt ++ ;
         }
         if (htim->Instance == TIM9) {
             HAL_GPIO_TogglePin(LD0_GPIO_Port, LD0_Pin);
             cnt2++ ;
        }
}
********************************************
main.c :  Only 2 lines below.
****
/* USER CODE BEGIN 2 */
     HAL_TIM_Base_Start_IT(&htim9) ;
     HAL_TIM_Base_Start_IT(&htim2) ;
/* USER CODE END 2 */
  while (1)  {  }
***

****************************************************
** Timer Settigs: generated by CubeIDE
****************************************************
/**
  * @brief TIM2 Initialization Function  ==> With 80MHz clock, output 100Hz
  * @param None
  * @retval None
  */
static void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */

TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};

/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */

htim2.Instance = TIM2;
  htim2.Init.Prescaler = 80-1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 10000-1;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
  Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
  Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
  Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
  /* USER CODE END TIM2_Init 2 */
}

/**
* @brief TIM9 Initialization Function  ==> With 100Hz clock from ITRx, output 25Hz
* @param None
* @retval None
*/
static void MX_TIM9_Init(void)
{
/* USER CODE BEGIN TIM9_Init 0 */
/* USER CODE END TIM9_Init 0 */

TIM_SlaveConfigTypeDef sSlaveConfig = {0};

/* USER CODE BEGIN TIM9_Init 1 */
  /* USER CODE END TIM9_Init 1 */

htim9.Instance = TIM9;
htim9.Init.Prescaler = 0;
htim9.Init.CounterMode = TIM_COUNTERMODE_UP;
htim9.Init.Period = 4-1;
htim9.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim9.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim9) != HAL_OK)
{
  Error_Handler();
}
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;
sSlaveConfig.InputTrigger = TIM_TS_ITR0;
if (HAL_TIM_SlaveConfigSynchro(&htim9, &sSlaveConfig) != HAL_OK)
{
  Error_Handler();
}
/* USER CODE BEGIN TIM9_Init 2 */
  /* USER CODE END TIM9_Init 2 */
}
******* End of File ******

海滨消消 发表于 2025-11-5 17:09 | 显示全部楼层
用内部触发
cr315 发表于 2025-11-5 17:09 | 显示全部楼层
STM32F411 的定时器级联需依赖固定的 ITRx 映射,而非 G4 的灵活矩阵。
cr315 发表于 2025-11-5 17:10 | 显示全部楼层
TIM2 的 TRGO 必须连接到 ITR0 才能触发 TIM9
香水城 发表于 2025-11-5 17:41 | 显示全部楼层
本帖最后由 香水城 于 2025-11-5 17:44 编辑

F411应该看RM0483,TIMER的级联要根据手册描述来,没法随意。
48715690b1bc9488f2.png 70187690b1b88ea747.png

2143267f630e8cd127.png
713176808abf94c9cf.png
 楼主| 地瓜patch 发表于 2025-11-5 21:12 | 显示全部楼层
香水城 发表于 2025-11-5 17:41
F411应该看RM0483,TIMER的级联要根据手册描述来,没法随意。

感谢版主,得认真研究一下手册和指南
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

2021

主题

15489

帖子

31

粉丝
快速回复 在线客服 返回列表 返回顶部