Страницы

четверг, 28 ноября 2013 г.

Перенаправление printf() в C для STM32

В целях вывода отладочной информации при использовании Debug не в пошаговом режиме удобно выводить текущие значения переменных с помощью стандартной функции C printf(). Для этого в проект добавляем кроме стандартных файлов startup_stm32f10x_md.s и system_stm32f10x.c создаем файл  retarget.c  листинг которого представлен ниже и подключаем его в проект


#include <stdio.h>
#include <stm32f10x.h>

#pragma import(__use_no_semihosting_swi)

#define ECHO_FGETC

volatile int ITM_RxBuffer=0x5AA55AA5; /* Buffer to transmit data towards debug system. */

struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;

int fputc(int ch, FILE *f) {
  return (ITM_SendChar((uint32_t)ch));
}

unsigned char backspace_called;
unsigned char last_char_read;
int r;

int fgetc(FILE *f)
{
    /* if we just backspaced, then return the backspaced character */
    /* otherwise output the next character in the stream */
    if (backspace_called == 1)
    {
      backspace_called = 0;
    }
    else {
        do {
            r = ITM_ReceiveChar();
        } while (r == -1);
        
        last_char_read = (unsigned char)r;

#ifdef ECHO_FGETC
        ITM_SendChar(r);
#endif
    }

    return last_char_read;
}

/*
** The effect of __backspace() should be to return the last character
** read from the stream, such that a subsequent fgetc() will
** return the same character again.
*/

int __backspace(FILE *f)
{
    backspace_called = 1;
    return 0;
}

int ferror(FILE *f) {
  /* Your implementation of ferror */
  return EOF;
}

void _ttywrch(int ch) {
  ITM_SendChar((uint32_t)ch);
}

void _sys_exit(int return_code) {
  while (1);    /* endless loop */
}

создаем файл main.c для демонстрации работы функции printf()

#include "stdio.h"
//#include <stm32f10x.h> // Required by CMSIS

int main(void) {
int j = 0;
unsigned char i =0;

while (1) {
j++;
if (j==1000000) {
j = 0;
if (i==0xFF) i = 0;
printf("Value of i: %d\n", i);
i++;
}
}
}
Запускаем Debugger и выбираем View -> Serial Windows->  Debug printf() Viever. После запуска программы на выполнение, наблюдаем вывод в окне Debug printf() Viever

По материалам из

Комментариев нет:

Отправить комментарий

ваше мнение...