2013-11-14 2 views
2

Я только что разрешил принимать прерывания для UART3, но я получаю жесткую ошибку, как только я отправляю данные. Вот как я его инициализации:LPC1769 Прерывание UART, вызывающее жесткую ошибку

LPC_UART_TypeDef *uart; 

LPC_SC->PCONP |= 1 << 25; 
LPC_PINCON->PINSEL1 |= 0b1111 << 18; 

uart = LPC_UART3; 
uart->FCR = 0b111; // Reset FIFOs 
uart->LCR = 0b10000011; 
uart->DLL = 12; 
uart->DLM = 0; 
uart->FDR = 0xe5; 
uart->LCR = 0b00000011; 
uart->IER = 1; // Enable RBR interrupt 

NVIC_EnableIRQ(UART3_IRQn); 

Согласно GDB, мой ISR даже не получить удар. Я подтвердил, что он находится в моей векторной таблице в нужном месте, с правильным адресом плюс бит 0 (для режима Thumb-2, как и для всех моих других обработчиков). Фактически, когда я заменяю ISR пустой функцией, я по-прежнему получаю ошибку. Вот результат моего обработчика ошибок:

Hard fault FORCED 
    r0 = 0000000a 
    r1 = 0000000b 
    r2 = 000002ed 
    r3 = 00000000 
    r12 = 00000000 
    lr = fffffffd 
    pc = 00000000 
    psr = 60000218 
BFAR = e000ed38 
CFSR = 00020000 
DFSR = 00000000 
AFSR = 00000000 
SHCSR = 00070000 

Ни LR, ни ПК не выглядят очень полезными. Это первый IRQ, который я добавил. Все остальные записи таблицы векторов - SysTick и ниже.

Как я могу узнать, что вызывает неисправность?

Вот мой вектор стол:

.word zeptos_msp_top 
.word zeptos_reset_isr 
.word 0 /* NMI */ 
.word zeptos_hardfault_isr_shim 
.word zeptos_memmanage_isr 
.word zeptos_busfault_isr 
.word zeptos_usagefault_isr 
.word 0 /* Reserved */ 
.word 0 /* Reserved */ 
.word 0 /* Reserved */ 
.word 0 /* Reserved */ 
.word zeptos_svc_isr 
.word 0 /* DebugMon */ 
.word 0 /* Reserved */ 
.word zeptos_pendsv_isr 
.word zeptos_systick_isr 
.word 0 /* WDT */ 
.word 0 /* Timer 0 */ 
.word 0 /* Timer 1 */ 
.word 0 /* Timer 2 */ 
.word 0 /* Timer 3 */ 
.word 0 /* Timer 4 */ 
.word 0 /* UART 0 */ 
.word 0 /* UART 1 */ 
.word 0 /* UART 2 */ 
.word zeptos_uart3_isr 

ответ

1

0x00 для PC регистра выглядит suspicous как 0x00000000 в таблице векторов. Проверьте правильность таблицы векторов прерываний, обработчик для UART3 на lpc176x находится в позиции 24.

Запись в таблице ((uint32_t*)0x00000)[24] должна указывать на ваш обработчик плюс большой палец.

+0

Я трижды проверил его, и я уверен, что это правильно. Я добавил его на мой вопрос на всякий случай. – Derecho

+0

OH. MY. БОГ. У меня был дополнительный таймер IRQ там - нет таймера 4! Спасибо, что заставило меня проверить это снова! – Derecho

Смежные вопросы