2016-10-29 12 views
3

인터럽트를 사용하여 내 STM32F746ZG 장치에서 주기적으로 직렬 문자열을 보내려고합니다. 대부분의 코드는 stm32cubemx에 의해 자동 생성됩니다. 하드웨어 중단 점 (jlink)이 각 인터럽트마다 설정되어 있지만 초기화시 한 번만 경과 함수를 입력합니다. 내가 임의로 디버거를 일시 중지하면 예상대로 0과 1000 사이의 카운터 값이 표시됩니다. 그래서 나는 카운터가 매 초마다 리셋된다는 것을 안다. 내부 클럭은 16MHz에서 실행됩니다.STM32 HAL 타이머 인터럽트가 트리거되지 않음

내 임베디드 기기 사용 경험이 BBB, Raspberry 및 Arduino 's로 제한됩니다. 다른 예제와 튜토리얼을 시도했지만 지금은 더 이상 알지 못합니다. 어떤 도움이나 제안을 많이 주시면 감사하겠습니다.

내 주요 기능 :

int main(void) { 

    HAL_Init(); 
    SystemClock_Config(); 
    MX_GPIO_Init(); 
    MX_RTC_Init(); 
    MX_TIM1_Init(); 

    if (HAL_TIM_Base_Start(&htim1) != HAL_OK) { 
     Error_Handler(); 
    } 

    if (HAL_TIM_Base_Start_IT(&htim1) != HAL_OK) { 
     Error_Handler(); 
    } 

    while (1) { 
     cnt = __HAL_TIM_GetCounter(&htim1); 
    } 
} 

TIM1 초기화 :

static void MX_TIM1_Init(void) { 

    TIM_ClockConfigTypeDef sClockSourceConfig; 
    TIM_MasterConfigTypeDef sMasterConfig; 

    htim1.Instance = TIM1; 
    htim1.Init.Prescaler = 16000; 
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP; 
    htim1.Init.Period = 1000; 
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 
    htim1.Init.RepetitionCounter = 0x0; 
    if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { 
     Error_Handler(); 
    } 

    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; 
    if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) { 
     Error_Handler(); 
    } 

    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; 
    sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET; 
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; 
    if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) 
      != HAL_OK) { 
     Error_Handler(); 
    } 

} 

내 Base_MspInit 기능 :

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) 
{ 

    GPIO_InitTypeDef GPIO_InitStruct; 
    if(htim_base->Instance==TIM1) 
    { 
    /* Peripheral clock enable */ 
    __HAL_RCC_TIM1_CLK_ENABLE(); 
    /* Peripheral interrupt init */ 
    HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 0, 0); 
    HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn); 
    HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0); 
    HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn); 
    HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, 0, 0); 
    HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn); 
    HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 0); 
    HAL_NVIC_EnableIRQ(TIM1_CC_IRQn); 
    } 
} 

내 TIM IRQ 핸들러 함수 :

void TIM1_UP_TIM10_IRQHandler(void) 
{ 
    HAL_TIM_IRQHandler(&htim1); 
} 
,691,363 HAL_TIM_PeriodElapsedCallback를 호출 (210)

HAL IRQ 처리기 :

void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) 
{ 
    /* Capture compare 1 event */ 
    if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET) 
    { 
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) !=RESET) 
    { 
     { 
     __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); 
     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; 

     /* Input capture event */ 
     if((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00) 
     { 
      HAL_TIM_IC_CaptureCallback(htim); 
     } 
     /* Output compare event */ 
     else 
     { 
      HAL_TIM_OC_DelayElapsedCallback(htim); 
      HAL_TIM_PWM_PulseFinishedCallback(htim); 
     } 
     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; 
     } 
    } 
    } 
    /* Capture compare 2 event */ 
    if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET) 
    { 
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) !=RESET) 
    { 
     __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2); 
     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; 
     /* Input capture event */ 
     if((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00) 
     {   
     HAL_TIM_IC_CaptureCallback(htim); 
     } 
     /* Output compare event */ 
     else 
     { 
     HAL_TIM_OC_DelayElapsedCallback(htim); 
     HAL_TIM_PWM_PulseFinishedCallback(htim); 
     } 
     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; 
    } 
    } 
    /* Capture compare 3 event */ 
    if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) != RESET) 
    { 
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) !=RESET) 
    { 
     __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3); 
     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; 
     /* Input capture event */ 
     if((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00) 
     {   
     HAL_TIM_IC_CaptureCallback(htim); 
     } 
     /* Output compare event */ 
     else 
     { 
     HAL_TIM_OC_DelayElapsedCallback(htim); 
     HAL_TIM_PWM_PulseFinishedCallback(htim); 
     } 
     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; 
    } 
    } 
    /* Capture compare 4 event */ 
    if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET) 
    { 
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) !=RESET) 
    { 
     __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4); 
     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; 
     /* Input capture event */ 
     if((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00) 
     {   
     HAL_TIM_IC_CaptureCallback(htim); 
     } 
     /* Output compare event */ 
     else 
     { 
     HAL_TIM_OC_DelayElapsedCallback(htim); 
     HAL_TIM_PWM_PulseFinishedCallback(htim); 
     } 
     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; 
    } 
    } 
    /* TIM Update event */ 
    if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET) 
    { 
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) !=RESET) 
    { 
     __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE); 
     HAL_TIM_PeriodElapsedCallback(htim); 
    } 
    } 
    /* TIM Break input event */ 
    if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) != RESET) 
    { 
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) !=RESET) 
    { 
     __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK); 
     HAL_TIMEx_BreakCallback(htim); 
    } 
    } 

    /* TIM Break input event */ 
    if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK2) != RESET) 
    { 
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) !=RESET) 
    { 
     __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK); 
     HAL_TIMEx_BreakCallback(htim); 
    } 
    } 

    /* TIM Trigger detection event */ 
    if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET) 
    { 
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) !=RESET) 
    { 
     __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER); 
     HAL_TIM_TriggerCallback(htim); 
    } 
    } 
    /* TIM commutation event */ 
    if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) != RESET) 
    { 
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) !=RESET) 
    { 
     __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM); 
     HAL_TIMEx_CommutationCallback(htim); 
    } 
    } 
} 

내 콜백 함수 :

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { 
    if (htim->Instance == TIM1) { 
     char frame[20] = "123456789\r\n"; 
     HAL_UART_Transmit(&huart1, frame, 20, 10); 
    } 
} 

답변

2

위의 코드는 정확했다. 중단 점은 "임시 하드웨어"중단 점이었습니다.이를 "하드웨어"중단 점으로 변경했을 때 카운터 오버플로가 발생하여 해당 기간에 도달했음을 나타냅니다.

너무 오래 ;-)

+1

참고 동일한 코드 쳐다의 전형적인 예 : 당신은 지금 자신의 대답을 받아 들일 수 있습니다. –