Векторы прерываний будут по-прежнему определены для вашего загрузчика в файле запуска (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");
}
В приведенном выше случае происходит вот что ...
- Векторы ISR по адресу
SysTick_Handler()
, как определено при загрузке.
SysTick_Handler()
перенаправляет на ISR приложения. Это делается путем считывания адреса ISR приложения из таблицы векторов приложения.
Пока вы не разрешаете прерывания для загрузчика, ISR должны нормально работать в вашем приложении с помощью перенаправлений. Если вы хотите разрешить прерывания для загрузчика, вам нужно проявить немного больше творчества.
person
embedded_guy
schedule
15.07.2014