0
Источники информации по ядру Cortex-M — в ARMv7-M ARM, Cortex-M3/M4/… TRM, ARM Infocenter (все на arm.com) и книга The Definitive Guide to the ARM Cortex-M3, 2 издание. Документация STM32 со всем этим практически не пересекается — описывает только свою периферию, электрические параметры микросхем и т. п. В этом главная сложность изучения микроконтроллеров с ядром Cortex.

По обсуждаемой теме можно посмотреть гл. 7.4 в The Definitive Guide, только оттуда не очень понятно, что некоторые interrupt inputs остаются asserted, пока их специально не сбросить. Но если внимательно почитать RM0008 (10.2.4), окажется, что EXTI держит соответствующую линию IRQ, пока пользователь не сбросит бит в PR. То же самое и в других местах, где одно прерывание может вызываться несколькими событиями (хотя бы UART).
  • avatar
  • Thorn
  • 21 января 2012, 23:52
0
NVIC_ClearPendingIRQ(EXTI9_5_IRQn); сбрасывает флаг «прерывание ожидает» в NVIC, однако линия запроса прерывания остается активной, поэтому NVIC немедленно ставит этот флаг снова. Чтобы указать, что прерывание обработано, надо трогать не NVIC, а контроллер внешних прерываний (EXTI), из которого эта линия и выходит. У него есть регистр EXTI->PR, в котором предусмотрены биты для каждой ноги. Эти биты должны сбрасываться пользователем после обработки прерывания.

Сделано это доя того, чтобы не терять события. Если вы зашли в прерывание, чтобы обработать событие (фронт/спад) на ноге 9, а в это время произошло событие на ноге 8, сразу же произойдет еще одно такое же прерывание (если нет более приоритетных). Иначе бы на ногу 8 вы не отреагировали. (Конечно, механизм зависит от правильной очистки флагов пользователем — обработал ногу 9, сбросил 9-й бит в EXTI->PR).
  • avatar
  • Thorn
  • 21 января 2012, 22:44