Прерывания в mikroC for ARM
Разработчики из Mikroelektronika значительно упростили жизнь любителям микроконтроллеров, реализовав в компиляторе mikroC множество дополнительных функций настройки оборудования и работы с ним. Несколько особняком стоит система прерываний STM32. С одной стороны приняты меры по упрощению организации прерываний, с другой большая часть настроек все равно выполняется вручную.
Система прерываний микроконтроллеров STM32 работает с несколькими блоками и требует задания относительно большого числа параметров. Данная настройка никак не реализована в среде программирования microC, поэтому выполняется исключительно через присваивание значений соответствующим регистрам.
Разрешение обработки прерываний
Разрешение и запрет на обработку прерываний на уровне ядра процессора можно осуществить с помощью функций:
unisgned long EnableInterrupts();
unsigned long DisableInterrupts();
Использование не влияет на конкретные вектора процессора. Данные функции возвращают состояние регистра ядра PRIMASK. В приниципе, использование функции EnableInterrupts() не обязательно, если перед обработка прерываний на уровне ядра не была запрещена.
Для разрешения или запрещения отдельных векторов в контроллере NVIC реализованы следующие функции:
void NVIC_IntEnable(const unsinged long ivt);
void NVIC_IntDisable(const unsigned long ivt);
В качестве аргумента используется номер вектора прерываний, который может быть задан в текстовой форме, либо в виде числа. Найти информацию по номерам векторов можно в технической документации на процессор. Непосредственно текстовую форму можно помотреть, вызвав Code Assistant с помощью комбинаций клавиш CTRL+SPACE, либо вызвав файл описания процессора CTRL+ALT+D.
Обработчики прерываний
Для организации обработчика прерывания используется следующая конструкция:
void interrupt() org 0xC00 iv IVT_INT_TIMER0A ics ICS_OFF {}
Здесь: interrupt() – имя функции, которое можно выбрать произвольно
Iv – зарезервированное слово, информирующее компилятор о назначении функции в качестве обработчика прерываний.
IVT_INT_TIMER0A – вектор прерываний.
Ics – зарезервированное слово, отвечающее за автоматическое сохранение окружения процессора при вызове прерывания. Может иметь два аргумента: ICS_OFF – окружение не сохраняется, ICS_AUTO – окружение сохраняется автоматически.
Org – задание адреса начала обработчика прерывания
Несколько облегчить формирование заголовка процедуры призван инструмент под названием Interrupt Assistant. При его вызове появляется окно, в котором задается имя функции, а из выпадающего списка можно выбрать текстовый вариант вектора прерывания.
Пример
Для примера приведена программа под STM32VL Discovery, переключающая встроенный синий светодиод при нажатии пользовательской кнопки.