2017-10-14 17 views
0

J'ai généré du code CubeMX. Je veux que la minuterie 2 déclenche le minuteur 3. Si un dépassement de capacité sur le minuteur 2 se produit, le minuteur 3 devrait compter jusqu'à 1. J'ai essayé quelques configurations mais rien n'a fonctionné - aucune interruption sur le minuteur3 Quand j'ai réglé le déclencheur de sortie (minuteur 2)Déclencheurs de temporisation STM32F7 Minuteur

sMasterConfig.MasterOutputTrigger 

à la même valeur que (timer 3)

sSlaveConfig.SlaveMode 

je n'ai toujours pas d'interruption sur minuterie 3

Ceci est la pleine configurationcode des deux minuteries:

TIM_HandleTypeDef htim2; 
    TIM_HandleTypeDef htim3; 

    /* TIM2 init function */ 
    void MX_TIM2_Init(void) 
    { 
     TIM_ClockConfigTypeDef sClockSourceConfig; 
     TIM_MasterConfigTypeDef sMasterConfig; 

     htim2.Instance = TIM2; 
     htim2.Init.Prescaler = 54; 
     htim2.Init.CounterMode = TIM_COUNTERMODE_UP; 
     htim2.Init.Period = 250; 
     htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4; 
     htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; 
     if (HAL_TIM_Base_Init(&htim2) != HAL_OK) 
     { 
     _Error_Handler(__FILE__, __LINE__); 
     } 

     sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; 
     if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) 
     { 
     _Error_Handler(__FILE__, __LINE__); 
     } 

     sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; 
     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; 
     if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) 
     { 
     _Error_Handler(__FILE__, __LINE__); 
     } 

    } 
    /* TIM3 init function */ 
    void MX_TIM3_Init(void) 
    { 
     TIM_SlaveConfigTypeDef sSlaveConfig; 
     TIM_MasterConfigTypeDef sMasterConfig; 

     htim3.Instance = TIM3; 
     htim3.Init.Prescaler = 1; 
     htim3.Init.CounterMode = TIM_COUNTERMODE_UP; 
     htim3.Init.Period = 8000; 
     htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 
     htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; 
     if (HAL_TIM_Base_Init(&htim3) != HAL_OK) 
     { 
     _Error_Handler(__FILE__, __LINE__); 
     } 

     sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; 
     sSlaveConfig.InputTrigger = TIM_TS_ITR0; 
     if (HAL_TIM_SlaveConfigSynchronization(&htim3, &sSlaveConfig) != HAL_OK) 
     { 
     _Error_Handler(__FILE__, __LINE__); 
     } 

     sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; 
     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; 
     if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) 
     { 
     _Error_Handler(__FILE__, __LINE__); 
     } 
    } 
+1

Essayez d'abord les registres. C'est beaucoup plus facile et vous ne devez pas compter sur ce bloatware HAL –

Répondre

2

Config struct doivent être initialisés.

void MX_TIM2_Init(void) 
    { 
     TIM_ClockConfigTypeDef sClockSourceConfig; 

Structures définies dans un corps de la fonction ne sera pas initialisés, auront une valeur imprévisible champs ne sont pas explicitement initialisés.

 TIM_ClockConfigTypeDef sClockSourceConfig = {}; 

En utilisant ce formulaire, vous marquez tous les champs avant usage.

déclencheur d'entrée incorrect

sSlaveConfig.InputTrigger = TIM_TS_ITR0; 

L'utilisation ITR0 fait TIM3 esclave de TIM1. La valeur correcte est TIM_TS_ITR1. Voir la table de connexion de déclenchement interne TIMx à la fin de la description du registre de contrôle du mode esclave TIMxTIMx_SMCR dans le Manuel de référence.

Un exemple de travail sans HAL

Eh bien, il utilise encore quelques macros utiles de HAL.

void TIM3_IRQHandler(void) { 
    if(TIM3->SR & TIM_SR_UIF) { 
     TIM3->SR = ~TIM_SR_UIF; 
     do_something(); 
    } 
} 

void starttimers(void) { 
    NVIC_EnableIRQ(TIM3_IRQn); 
    __HAL_RCC_TIM2_CLK_ENABLE(); 
    __HAL_RCC_TIM3_CLK_ENABLE(); 

    TIM3->ARR = 8000;    // slave timer period 
    // trigger selection TS=001 ITR1 = TIM2, slave mode SMS=0111 external clock mode 1 
    TIM3->SMCR = TIM_TS_ITR1 | TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2; 
    TIM3->DIER = TIM_DIER_UIE;  // interrupt on update event (timer overflow) 
    TIM3->CR1 = TIM_CR1_CEN;  // enable timer 3 

    TIM2->PSC = 54;     // prescaler preload 
    TIM2->EGR = TIM_EGR_UG;   // update prescaler 
    TIM2->ARR = 250;    // master timer period 
    TIM2->CR2 = TIM_TRGO_UPDATE; // master mode selection MMS=010 Update event 
    TIM2->CR1 = TIM_CR1_CEN;  // enable timer 2 
} 
+1

C'est exactement ce que j'écris toujours - les registres. Clair, facile, lisible et maintenable. Pas la "magie" derrière le bloatware HAL pour ceux qui sont trop paresseux pour lire et comprendre le RM. Upvoting –