startup.c

Как обычно добавим вектор и обработчик для прерывания таймера:

    0,                  /*!%29 TIM3                         */                  
    tim4_irq_hanlder,   /*!%30 TIM4                         */                  
    0,                  /*!%31 I2C1 Event                   */
/* timer4 irq handler */
void tim4_irq_hanlder(void) {
    if (TIM4->SR & TIM_SR_UIF) {
        static unsigned char byte;
        byte++;
        /* switch leds */
        LED_PORT->ODR ^= RED_LED;
        /* send test byte */
        usart_sendb(USART1, byte);
        /* clear status bit */
        TIM4->SR &= ~TIM_SR_UIF;
    }
}

От обработчика в примере Прерывание по переполнению, этот отличается тем, что мы переключаем лишь один светодиод - красный и заодно отправляем байт значение которого предварительно инкрементируется. На выходе мы получаем таблицу ASCII.