zoukankan      html  css  js  c++  java
  • 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 
    
    ");
    
    }
    }

     运行结果:

    参考目录

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

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

  • 相关阅读:
    CSP-S2019 括号树
    [CQOI2007]余数求和
    CF1000E We Need More Bosses
    [HAOI2009]毛毛虫
    ls命令
    HTML的标签 属性 等等
    虚拟机安装Tools
    1.1 什么是安全渗透
    004-Kali Linux安装-熟悉环境
    003-Kali Linux 安装-持久加密USB安装、熟悉环境、熟悉BASH命令
  • 原文地址:https://www.cnblogs.com/dylancao/p/12312584.html
Copyright © 2011-2022 走看看