startup.c

Для начала подключим заголовочный файл библиотеки Чана:

/* include headers */
#include "stm32f4xx.h"
#include "work.h"
#include "xprintf.h"

Затем объявим внешние переменные для секций данных - инициализированных и неинициализированных:

/* external vars */
extern unsigned long _estack;
extern unsigned long __text_end;
extern unsigned long __data_start;
extern unsigned long __data_end;
extern unsigned long __bss_start;
extern unsigned long __bss_end;

После в обработчик вектора сброса добавим перенос данных из флеш в ОЗУ:

void reset_handler(void) {
    unsigned long *src;
    unsigned long *dest;
   
    src = &__text_end;
    dest = &__data_start;
    if (src != dest)
        while(dest < &__data_end)
            *(dest++) = *(src++);
 
    dest = &__bss_start;
    while(dest < &__bss_end)
        *(dest++) = 0;
    /* call working code */
    work();
}

Ну и собственно в обработчик вектора таймера №4 мы добавим статическу переменную которую будем инкрементировать с каждым вызовом и выводить с помощью функции форматированного вывода xprintf:

/* timer4 irq handler */
void tim4_irq_hanlder(void) {
    static unsigned int counter;
    counter++;
   
    if (TIM4->SR & TIM_SR_UIF) {
        /* switch leds */
        LED_PORT->ODR ^= RED_LED;
        /* send test string */
        xprintf("counter: %d : %x : %b\n", counter, counter, counter);
        /* clear status bit */
        TIM4->SR &= ~TIM_SR_UIF;
    }
}