簡體   English   中英

用於捕獲未調用的 STM32F4 中斷處理程序

[英]STM32F4 interrupt handler for capture its not called

下面的代碼使用 TIM1 通道 3 的捕獲比較功能來捕獲 PE10 上的上升沿,但它不起作用,它沒有調用中斷處理程序。 我不太擅長這種嵌入式的東西,所以有人能告訴我我是否正確設置了嗎?

#include "STM32/stm32f4xx_tim.h"

void TIM1_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  /* TIM1 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  /* GPIOA clock enable */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

  /* TIM1 channel 3 pin (PE.10) configuration */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  /* Connect TIM pins to AF2 */
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_TIM1);

  /* Enable the TIM1 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  TIM_ICInitTypeDef  TIM_ICInitStructure;
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;

  TIM_ICInit(TIM1, &TIM_ICInitStructure);

  /* TIM enable counter */
  TIM_Cmd(TIM1, ENABLE);

  /* Enable the CC3 Interrupt Request */
  TIM_ITConfig(TIM1, TIM_IT_CC3, ENABLE);
}


void TIM1_CC_IRQHandler(void)
{
    // .................
}

int StartCapture()
{ 
  TIM1_Config();

  while(1); /* Infinite loop */
}

如果您的TIM1_CC_IRQHandler()被調用一次,那么 Drcog71 的答案是正確的。 但是,如果您的IRQHandler()從未被觸發,那么初始化就有問題。

這是您必須做對的事情的列表,否則 IRQ 將不會觸發。

1) 確保為您使用的引腳啟用了GPIO[A:E]時鍾。

2) 同樣,確保為您使用的TIMx啟用時鍾。 檢查您的TIMx住在哪里。 如果調用RCC_APB2PeriphClockCmd()的計時器,對生命APB1 ,編譯器將不會引發錯誤,但計時器不會有任何效果。

3) 仔細檢查您的引腳的 AF 是否與數據表的替代功能映射表匹配(例如AF1 == TIM1_CH3 )。

4) 在您的TIM_ICInitStructure ,確保TIM_Channel與您選擇的頻道匹配(在您的情況下為TIM_Channel_3 )。

5) 在 NVIC 中配置並啟用正確的 IRQ 通道,例如。 NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;

6)使能中斷: TIM_ITConfig(TIM1, TIM_IT_CC3, ENABLE);

7) 啟用你的定時器: TIM_Cmd(TIM1, ENABLE);

好吧,我想我的答案在 6 年后不需要了。 但也許其他面臨同樣問題的人會發現它。 如果用 C++ 編寫,可能會出現名稱沖突。 如果interupt函數的原始原型像C-function一樣定義,而你的實現是C++function所以它只是兩個不同的同名函數,interupt會嘗試調用一個空的C-function,甚至可能會陷入無限循環. 所以這就是為什么你的 c++ 函數可能會被更新。 要解決這個問題,只需定義您的函數,如 extern "C"。

也許中斷進入函數但不知道該怎么做,或者進入螞蟻標志仍然有效並且只進入一次,你錯過了清除中斷標志,試試這個:

  /**
    * @brief  Capture Compare Handler
    * @param  None
    * @retval None
    */
    void TIM1_CC_IRQHandler()
    {
        if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET)  <-- Add this
        {
            TIM_ClearITPendingBit(TIM1, TIM_IT_CC3); <-- This is important!

              //TODO

            }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM