stm32_f103使用gcc编译的环境下printf打印函数的实现

stm32_f103使用gcc编译的环境下printf打印函数的实现

前记

  gcc编译使用的printf打印函数需要的底层函数是和其他编译器不同的,以前的是无法使用的,这里有两种方法,一种是使用gcc库里面的printf函数,自己实现底层IO函数_write。另外一种方法是自己定义 printf函数,这里给出两者实现方法及测试结果。

 

方法一

  假如要使用gcc库里面的printf函数,这里使用底层编译函数是_read()和_write(). 这里的read和write函数需要在system.c自己实现的,具体的实现方法如下所示:

#include  <errno.h>
#include  <sys/unistd.h> // STDOUT_FILENO, STDERR_FILENO

int _write(int file, char *data, int len)
{
   if ((file != STDOUT_FILENO) && (file != STDERR_FILENO))
   {
      errno = EBADF;
      return -1;
   }

   // arbitrary timeout 1000
   HAL_StatusTypeDef status =
      HAL_UART_Transmit(&huart1, (uint8_t*)data, len, 1000);

   // return # of bytes written - as best we can tell
   return (status == HAL_OK ? len : 0);
}

方法二

  其实,说白了只要找到串口写函数,还有另外一种巧妙的方法,就是自制printf函数,不使用库里面的,代码如下所示:

#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(fmt, argp);
    va_end(argp);
}

代码及运行结果

  在代码中,这里分别给出两种方法的运行结果,如下所示:

// uart init
MX_DEBUG_USART_Init();

/* 锟斤拷锟接帮拷锟斤拷锟斤拷始锟斤拷 */
KEY_GPIO_Init();

printf("test is init !

");
my_printf("test pressed my printf 

");


/* 锟斤拷锟斤拷循锟斤拷 */
while (1)
{    
if(KEY1_StateRead()==KEY_DOWN)
{
  LED1_ON;
  printf("key1 pressed!

");
  //my_printf("key1 pressed my printf 

");
}
if(KEY2_StateRead()==KEY_DOWN)
{
  LED2_ON;
  printf("key2 pressed!

");
  //my_printf("key2 pressed my printf 

");

}
if(KEY3_StateRead()==KEY_DOWN)
{
  LED1_OFF;
  LED2_OFF;
  printf("key3 pressed!

");
  //my_printf("key3 pressed my printf 

");

}
}

 运行结果:

stm32_f103使用gcc编译的环境下printf打印函数的实现

参考目录

  1 https://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32

    2 https://www.openstm32.org/forumthread1055