startup.c

Немного изменим таблицу прерываний, добавив системные векторы:

/* table of Cortex vectors */
void *vector_table[] __attribute__ ((section(".vectors"))) = {
    &_estack,           /*! stack begin */
    /* Core interrupts */
    reset_handler,      /*!#0 cortex-m4 reset interrupt begin code of this */
    nmi_handler,        /*!#1 cortex-m4 non maskable interrupt */
    hard_fault_handler, /*!#2 cortex-m4 hardware fault interrupt */
    mem_manage_handler, /*!#3 cortex-m4 memory management interrupt */
    bus_fault_handler,  /*!#4 cortex-m4 bus fault interrupt */
    usage_fault_handler,/*!#5 cortex-m4 usage fault interrupt */

А также создадим обработчики для этих векторов:

/* reset handler */
void reset_handler(void) {
    /* call working code */
    work();
}
/* nmi handler */
void nmi_handler(void) {
    while (1);
}
/* hardware fault handler */
void hard_fault_handler(void) {
    while (1);
}
/* memory management handler */
void mem_manage_handler(void) {
    while (1);
}
/* bus fault handler */
void bus_fault_handler(void) {
    while (1);
}
/* usage fault handler */
void usage_fault_handler(void) {
    while (1);
}

Это необходимо для того чтобы логика программы не ломалась при исключительных ситуациях.