Опрос загрузчика LPC1114 и прерывания пользовательских приложений

Keil UV4 Dev System, LPC1114 Запуск загрузчика: 0x0000.0000-0x0000.2000, пользовательское приложение: 0x0000.2000-0x0000.6000

Вопрос - Как настроить загрузчик с помощью опроса и пользовательского приложения с использованием прерываний

Я имел в виду NXP appnote 10995 и перенаправление прерываний, однако в этой ситуации загрузчик не использует прерывания, а приложение пользователя использует. Когда пользовательское приложение генерирует прерывание, вектор прерывания LPC114 находится в секторе 0 (загрузчик).

Я понимаю, что вектор прерывания, расположенный в секторе 0, должен каким-то образом перенаправлять обработчик прерывания, расположенный в 0x0000.2000, но нужно ли по-прежнему включать код прерывания в загрузчик, чтобы разрешить функцию перенаправления из обработчика прерывания?


person whitedog    schedule 15.07.2014    source источник


Ответы (1)


Векторы прерываний будут по-прежнему определены для вашего загрузчика в файле запуска (startup_LPC11xx.s), даже если ваш загрузчик их не использует. Как минимум, требуются начальное значение указателя стека, вектор сброса, вектор NMI и векторы аппаратной неисправности.

К сожалению, в своем предыдущем ответе я сделал неверное предположение относительно вашего процессора. Cortex-M0 не имеет возможности изменять смещение таблицы векторов, как это делает Cortex-M3.

Итак, в случае вашего процессора (M0) загрузка и приложение используют одну и ту же таблицу векторов при возникновении прерывания, которое определяется загрузкой. Итак, любые прерывания, которые вы планируете использовать в своем приложении, должны быть определены вашей загрузкой, чтобы они перенаправлялись на ISR приложения. Вы делаете это, определяя свои функции ISR как функции перенаправления, чтобы вызывалась ISR, созданная для вашего приложения.

Пример, приведенный в упомянутой вами заметке по применению, выполняет именно то, что я описал:

void SysTick_Handler(void) 
{ 
    /* Re-direct interrupt, get handler address from 
       application vector table */ 
    asm volatile("ldr r0, =0x203C"); 
    asm volatile("ldr r0, [r0]"); 
    asm volatile("mov pc, r0"); 
} 

В приведенном выше случае происходит вот что ...

  1. Векторы ISR по адресу SysTick_Handler(), как определено при загрузке.
  2. SysTick_Handler() перенаправляет на ISR приложения. Это делается путем считывания адреса ISR приложения из таблицы векторов приложения.

Пока вы не разрешаете прерывания для загрузчика, ISR должны нормально работать в вашем приложении с помощью перенаправлений. Если вы хотите разрешить прерывания для загрузчика, вам нужно проявить немного больше творчества.

person embedded_guy    schedule 15.07.2014
comment
Спасибо за четкие предложения. Один элемент, VTOR недоступен на LPC1114. - person whitedog; 15.07.2014
comment
Прости за это. Я должен был сначала проверить ваше устройство. Я еще разберусь с этим и вернусь к вам. - person embedded_guy; 15.07.2014
comment
Вот ... в этом должно быть немного больше смысла. - person embedded_guy; 15.07.2014
comment
Итак, загрузчик использует опрос systick с отключенным прерыванием, а пользовательское приложение использует systick с включенным прерыванием. Я загружаю пользовательское приложение по адресу 0x2000 с полным стиранием, затем загружаю загрузчик с стиранием только сектора. Запустите отладку из загрузчика и посмотрите опрос systick, затем по истечении времени ожидания перейдите к пользовательскому приложению, которое должно запустить прерывание systick и разрешить точку останова в загрузчике, чтобы увидеть результат прерывания - еще не происходит .. Есть ли способ просмотреть загрузчик и пользовательское приложение в отладке ? - person whitedog; 15.07.2014
comment
@ user3613165, я не пробовал, но вы можете создать один образ как с загрузкой, так и с приложением, что позволит вам отлаживать и то, и другое. Обычно я запускаю приложение в режиме отладки, где оно записывается на чип, начиная с 0x00000000. Я использую #define, чтобы убедиться, что я выполняю некоторые элементы настройки, которые обычно выполняются при загрузке (осциллятор и т. Д.). Затем я запускаю приложение в режиме отладки без загрузки устройства. В этом случае я бы проверил, настроена ли ISR приложения и работает так, как я предполагал (без загрузки). - person embedded_guy; 15.07.2014
comment
Затем я загружал и приложение, и загрузку, чтобы убедиться, что загрузка правильно перенаправлена ​​на приложение во время прерывания. - person embedded_guy; 15.07.2014
comment
Осталась только проблема (... я надеюсь) при переходе к пользовательскому приложению и включении прерываний, в конечном итоге в Default_Handler - person whitedog; 16.07.2014
comment
@ user3613165 Звучит как отдельный вопрос, требующий отладки вашей реализации. Пожалуйста, проголосуйте за и выберите это как ответ, если он отвечает на ваш вопрос, как написано выше. Когда вы публикуете новый вопрос о том, почему ваши прерывания не работают (и показываете разделы кода, в которых вы настраиваете свои прерывания), я буду рад помочь! - person embedded_guy; 16.07.2014
comment
Ах, ... еще недостаточно очков, когда включено голосование! Хотя большая помощь - спасибо, добавлю голос, как только позволят баллы! - person whitedog; 16.07.2014
comment
@ user3613165 В этом есть смысл. Я не знал, что у вас должно быть минимальное количество баллов, чтобы проголосовать за. Я заметил, что вы еще не приняли ответов ни на один из ваших вопросов. За каждый принятый ответ вы получаете два балла. - person embedded_guy; 16.07.2014