[英]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.