stm32f427 бит ожидания прерывания очищен - PullRequest
0 голосов
/ 30 апреля 2018

Я новичок в плате stm32f427 и копаю немного глубже. Я думаю, что в Интернете, особенно stackoverflow, люди вроде бы согласились с этим, просто пример:

void EXTI9_5_IRQHandler(void) {

/* Make sure that interrupt flag is set */
if (EXTI_GetITStatus(EXTI_Line5) != RESET) {
    /* Do your stuff when PB5 is changed */


    /* Clear interrupt flag */
    EXTI_ClearITPendingBit(EXTI_Line5);
}
} 

Этот обработчик, как все объяснили, должен делать все, что вам нужно внутри, и должен сбрасывать флаг ожидания при выходе из прерывания, и люди утверждают, что бит ожидания является флагом прерывания.

Однако, в моем случае и во многих случаях, таких как здесь , они сначала очищают этот бит, но многие люди утверждают, что выполнение этого убьет вашу функциональность прерывания, так как вы очистите бит, как только получите его , Однако это не так, и, более того, это совершенно противоположно. Если я сначала не сделаю очистку, мой код никогда не будет работать.

Я хочу выяснить причину этого. Может ли кто-нибудь любезно объяснить?

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

Как упомянуто до очистки флага прерывания, не выполняется немедленно. Другими словами, команде требуется несколько тактов для достижения контроллера прерываний, прежде чем флаг прерывания будет окончательно очищен. Тем временем процессор продолжает выполнять код вашего обработчика прерываний параллельно . Таким образом, если вы выходите из своего ISR сразу после вызова EXTI_ClearITPendingBit (…), ISR остается до , флаг прерывания фактически сбрасывается. К сожалению, в результате обработчик прерывания будет немедленно вызван снова, поскольку флаг прерывания еще не был очищен. На самом деле обработчик прерываний будет вызываться ровно дважды, потому что флаг прерывания наверняка будет сброшен после второго вызова. У меня была такая же проблема несколько лет назад, и мне потребовалось некоторое время, чтобы выяснить причину. В качестве наилучшей практики я могу рекомендовать очистить флаг прерывания в начале вашего ISR. Это неправда, что вы убиваете свою функцию прерывания, делая это на устройстве STM32x (явно: это не общая рекомендация). Ядро CORTEX-M «знает», что оно находится в ISR, и не «забывает» его, когда вы сбрасываете флаг прерывания. Подробное объяснение этого выходит за рамки этого ответа. Но вы можете быть абсолютно уверены, что ваш ISR выполняется правильно, если вы это сделаете. Чтобы сообщить вам, я (непрерывно) работаю с контроллерами STM32 уже около 15 лет.

0 голосов
/ 01 мая 2018

Флаг должен быть очищен в начале. Операция очистки требует некоторого времени для распространения по шине. Если вы очистите его непосредственно перед выходом из обработчика, вам нужно использовать инструкцию барьера, прочитать флаг обратно (в некоторых случаях он не работает) или оставить достаточно времени для распространения операции. В противном случае вы можете получить «призрачные» прерывания.

...