2016-10-02 4 views
0

私は宛先再printf()ためにこのコードを使用しますが、それは私がSTM32F103RBT6STM32F10xでprintf()をリターゲットする方法は?

コンパイラを使用

#ifdef __GNUC__ 
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf 
    set to 'Yes') calls __io_putchar() */ 
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) 
#else 
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) 
#endif /* __GNUC__ */ 

PUTCHAR_PROTOTYPE 
{ 
    /* Place your implementation of fputc here */ 
     /* e.g. write a character to the LCD */ 
    lcd_Data_Write((u8)ch); 

     return ch; 
} 

動作しません。代わりにemBitzエディタでGCC

+0

おそらくhttp://stackoverflow.com/questions/39664071/how-to-make-printf-work-on-stm32f103/ – SamR

+0

の重複がある可能性があります。http://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32 –

答えて

1

戦車あなたベンスKaulics

私はtinyprintfライブラリを使用して、それは非常によく働いた:github link

1

を、あなた自身のprintf()機能を書くことができVariable Argument Functions(va_list)を使用してください。 va_listカスタム印刷機能付き

は、次のようになります。

#include <stdio.h> 
#include <stdarg.h> 
#include <string.h> 

void vprint(const char *fmt, va_list argp) 
{ 
    char string[200]; 
    if(0 < vsprintf(string,fmt,argp)) // build string 
    { 
     HAL_UART_Transmit(&huart1, (uint8_t*)string, strlen(string), 0xffffff); // send message via UART 
    } 
} 

void my_printf(const char *fmt, ...) // custom printf() function 
{ 
    va_list argp; 
    va_start(argp, fmt); 
    vprint(target, fmt, argp); 
    va_end(argp); 
} 

使用例:

uint16_t year = 2016; 
uint8_t month = 10; 
uint8_t day = 02; 
char* date = "date"; 

// "Today's date: 2015-12-18" 
my_printf("Today's %s: %d-%d-%d\r\n", date, year, month, day); 

(注)このソリューションはあなたに使用するための便利な機能を提供しながら、それは生送信するよりも遅いことデータを使用するか、またはさらにsprintf()を使用します。私はこのソリューションをAVRとSTM32の両方のマイクロコントローラで使用しました。

あなたはさらに periphery_tは単純 enumタイプである。このような vprint、修正することができる

void vprint(periphery_t target, const char *fmt, va_list argp) 
{ 
    char string[200]; 
    if(0 < vsprintf(string,fmt,argp)) 
    { 
     switch(target) 
     { 
      case PC: PC_send_str(string); 
       break; 
      case GSM: GSM_send_str(string); 
       break; 
      case LCD: LCD_print_str(string); 
       break; 
      default: LCD_print_str(string); 
       break; 
     } 
    } 
} 
2

_write関数をハイジャックしよう:

#define STDOUT_FILENO 1 
#define STDERR_FILENO 2 

int _write(int file, char *ptr, int len) 
{ 
    switch (file) 
    { 
    case STDOUT_FILENO: /*stdout*/ 
     // Send the string somewhere 
     break; 
    case STDERR_FILENO: /* stderr */ 
     // Send the string somewhere 
     break; 
    default: 
     return -1; 
    } 
    return len; 
} 
+0

私はSTM32F072でこのメソッドを使用しています。詳細はこちら。 http://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32/279945#279945 –

関連する問題