Ноя 19 2010

Прерывания в Cortex M3. Часть 3

В предыдущей части (http://32bit.me/?p=842) были рассмотрены основные функции работы с прерываниями микроконтроллера LPC17хх. Однако, рассмотренные функции не работают с особым видом прерываний ядра Cortex M3 — системными исключениями. Ниже будет рассмотрена работа с системными исключениями на примере системного исключения SysTick. Также будет рассмотрено одно исключение из тех правил работы с прерываниями, которые рассматривались в части 2.

Адреса обработчиков системных исключений находятся там же, где и адреса обработчиков прерываний, а именно в таблице адресов прерываний, находящейся в проектах IAR в файле cstartup_M.s. Оттуда можно скопировать имя функции обработчика нужного прерывания и вставить его в проект. Для обработчика системного исключения таймера SysTick заголовок функции-обработчика будет выглядеть так:

void SysTick_Handler(void)

Для обеспечения корректной работы обработчика необходимо , как минимум, назначить системному исключению приоритет и сбросить его в неактивное состояние после обработки (т.е., всё так же, как и у обычного прерывания). Но приоритеты системных исключений назначаются не в регистрах NVIC, а в регистрах системного блока управления (System control block), которые называются SHPR1 — SHPR3 (для разнообразия, они нумеруются, начиная с 1, а не с 0, т.е. регистра SHPR0 не существует). Приоритет системного исключения SysTick задаётся в регистре SHPR3, в битах [31:24]. Адрес регистра SHPR3 равен 0xE000ED20, и мы можем записать:

unsigned long  * pSHPR3 = (unsigned long *)0xE000ED20;

* pSHPR3 = SYS_TICK_PRIORITY << 24;

Сброс прерывания SysTick в неактивное состояние осуществляется с помощью регистра ICSR того же системного блока управления.

Обработчик системного исключения SysTick выглядит так:

void SysTick_Handler(void)
{
//тело обработчика

//...

//сброс прерывания
ICSR_bit.PENDSTCLR = 1;
}

И, в заключение, ещё одна особенность, на этот раз связанная с обработкой прерывания Repetitive Interrupt Handler. У этого прерывания сброс в неактивное состояние нужно выполнять так:

RICTRL_bit.RITINT = 1;

Здесь RICTRL — регистр управления самого таймера RIT. Сброс прерывания в контроллере NVIC выполнится при этом автоматически.

  • Александр

    Мне статья помогла разобраться с SysTick. Есть одно замечание: адрес регистра SHPR3 равен 0xE000ED20.

  • arktur04

    Спасибо за комментарий, Александр!
    Конечно же, 0xE000ED20, исправил.

  • Dmitry

    Задумайтесь о цикле похожих описаний связки LPC1768 + IAR — на просторах интернета крайне мало русскоязычной информации.
    Искреннее спасибо за публикации.

  • arktur04

    Я не совсем понимаю, что подразумевается под «связкой». Компилируете программу IAR’ом и прошиваете, вот и вся связка.
    Или Вас интересует IAR как таковой?

  • Dmitry

    Синтаксис IAR…

  • Unreal_2009

    Спасибо за полезный материал.