Настройка прерывания в периферии



Тут надо смотреть конкретную периферию и какие биты за что отвечают. Обычно есть бит события, например, есть у UART бит события TXE, а для включения прерывания на это событие есть бит конфигурации TXEIE. Вообще это характерно, что есть какой то event, а бит разрешения прерывания для него зовется как [чето там]IE.

Для примера далеко ходить не буду и покажу разрешение прерываний для входов внешних прерываний — EXTI.

2 // Разрешаем прерывания в периферии для выводов 1 и 2. EXTI->IMR |=(EXTI_IMR_MR1 | EXTI_IMR_MR2);

 

Теперь прерывание активно и работает.

Особенности обработки прерываний

Вложенность прерываний

NVIC поддерживает прерывания с различными приоритетами, которые могут прерывать друг друга. При этом, могут возникнуть различные ситуации, обработка которых по-разному оптимизирована.

1. Приостановка низкоприоритетного прерывания
В этой ситуации, обработка низкоприоритетного прерывания прекращается. Следующие 12 циклов выполняется сохранение в стек нового набора данных и запускается обработка высокоприоритетного прерывания. После его обработки, содержимое стека автоматически извлекается и возобновляется обработка низкоприоритетного прерывания.
Больших отличий от прерывания основной программы не наблюдается.
2. Непрерывная обработка прерываний
Эта ситуация может возникнуть в двух случаях: если два прерывания имеют одинаковый приоритет и возникают одновременно, если низкоприоритетное прерывание возникает во время обработки высокоприоритетного.
В этом случае, промежуточные операции над стеком не производятся. Происходит только загрузка адреса обработчика низкоприоритетного прерывания и переход к его выполнению. Отказ от операций над стеком экономит 6 тактов. Переход к следующему прерыванию происходит не за 12 тактов, а всего за 6.
3. Запаздывание высокоприоритетного прерывания
Ситуация возникает, если высокоприоритетное прерывание происходит во перехода к обработке низкоприоритетного (за те самые 12 тактов). В этом случае переход к высокоприоритетному прерыванию будет происходить не менее 6 тактов с момента его возникновения (время необходимое для загрузки адреса обработчика прерывания и перехода к нему). Возврат в низкоприоритетное уже описан выше.

При написании обработчика есть ряд тонких моментов. Дело в том, что тут, в отличии от AVR далеко не все флаги событий снимаются аппаратно при переходе по вектору. ОЧЕНЬ часто флаг события надо сбрасывать вручную. Иначе при выходе из прерывания оно тутже сгенерится вновь и мы снова окажемся в обработчике. Причем это НЕ ОТНОСИТСЯ к Pendind флагам NVIC!!! Они сбрасывается на периферии и только там.
Для EXTI, после того как я обслужил это прерывание, я делаю сброс флага события в блоке прерываний EXTI:

1 2 // Сброс флага события EXTI->PR |= EXTI_PR_PR2;

Конкретно по флагам событий и тому как они сбрасываются надо внимательно читать описания битов в User Manual. Там обычно описано чем бит ставится и чем сбрасывается.

Приоритеты прерываний

NVIC приоритетный контроллер. По дефолту более высокий уровень приоритета имеют только группа FIQ. У остальных же он одинаковый. За приоритет отвечает группа регистров IPRx всего их там двадцать (но вообще может быть до 60). В каждом регистре по четыре 8 битных поля, каждое поле отвечает за один вектор. От 0 (помним, что номера считаются от External Interrupt, исключая FIQ группу) до 80. Конечно у STM32 нет 80 векторов, это число взято с запасом. В IRP0 лежат приоритеты с 0 по 3 вектор, в IRP1 с 4 по 7 и так далее до 80го.

Поле приоритета 8ми разрядное. Значит теоретически приоритетов может быть 256 штук. Но это только в теории, это возможности ядра в принципе. А конкретно в STM32F103 реально рулят только старшие четыре бита. Образуя таким образом 16 уровней приоритетов. Чем меньше номер уровня, тем он главней. После RESET у всех 0000. Байт приоритета можно прописать в ручную, поставив его в тетраду нужного поля или вызвать функцию CMSIS:


Дата добавления: 2020-01-07; просмотров: 218; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!