我在 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 ******
|
|