2017-10-14 253 views
0

我用CubeMX生成了一些代碼。 我想讓定時器2觸發定時器3. 如果定時器2發生溢出定時器3應該向上計數1. 我嘗試了一些配置,但沒有任何工作 - 沒有中斷在定時器3 當我設置輸出觸發器(定時器2)STM32F7定時器觸發器定時器

sMasterConfig.MasterOutputTrigger 

到相同的值(定時器3)

sSlaveConfig.SlaveMode 

我有計時器3

仍然沒有中斷這是完整configurationcode來自兩個定時器:

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

先嚐試註冊。這很容易,你不必依賴這個HAL bloatware –

回答

2

配置結構應該初始化。在函數體定義

void MX_TIM2_Init(void) 
    { 
     TIM_ClockConfigTypeDef sClockSourceConfig; 

結構不會被初始化,沒有初始化的字段會得到一些不可預測的值。

 TIM_ClockConfigTypeDef sClockSourceConfig = {}; 

使用此表格將在使用前明確清零所有字段。

錯誤輸入觸發

sSlaveConfig.InputTrigger = TIM_TS_ITR0; 

使用ITR0使得TIM3TIM1從屬。正確的值是TIM_TS_ITR1。請參閱參考手冊中TIMx從模式控制寄存器TIMx_SMCR說明末尾的TIMx內部觸發器連接表。

工作示例不HAL

那麼,它仍然使用從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

這正是我總是寫的 - 註冊。清晰,簡單,易讀和可維護。對於那些懶得閱讀和理解RM的人來說,不是HAL英國媒體報道軟件背後的「魔力」。 Upvoting –