Для начала подключим заголовочный файл библиотеки Чана:
/* 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;
}
}