Прерывания в 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. При его вызове появляется окно, в котором задается имя функции, а из выпадающего списка можно выбрать текстовый вариант вектора прерывания.

Interrupt Assistant

Пример

Для примера приведена программа под STM32VL Discovery, переключающая встроенный синий светодиод при нажатии пользовательской кнопки.

 

//Обработчик прерывания

void intext0() iv IVT_INT_EXTI0 ics ICS_AUTO { EXTI_PR = 0x0000001; //Очистка флага прерывания EXTI GPIOC_ODR.B8=~GPIOC_ODR.B8; //}

//Основная программа

void main() { //Настройка портов GPIO_Digital_Output(&GPIOC_BASE, _GPIO_PINMASK_8|_GPIO_PINMASK_9); GPIO_Config(&GPIOA_BASE, _GPIO_PINMASK_0,_GPIO_CFG_MODE_INPUT | _GPIO_CFG_PULL_NO);   EXTI_IMR = 0x00000001; //Разрешение прерывания по линии 0 EXTI_RTSR = 0x00000001; //Прерывание по фронту NVIC_IntEnable(IVT_INT_EXTI0); //Разрешение прерывания от EXTI0 EnableInterrupts(); //Разрешение обработки прерывания while(1){ //Бесконечный цикл с миганием GPIOC_ODR.B9 = ~GPIOC_ODR.B9; delay_ms(1000); }}

 

 

You have no rights to post comments