5回答

0收藏

[分享] 【GD32F207测评】3.不用MicroLib重定向Printf串口打印输出

GD32 GD32 4802 人阅读 | 5 人回复 | 2016-01-26

呵呵,有个函数很关键:
  1. static char _buffer[256];
  2. void EvbUart1Printf(char* fmt, ...)
  3. {
  4.     int i;
  5.     va_list ap;
  6.     va_start(ap, fmt);
  7.     vsprintf(_buffer, fmt, ap);
  8.     va_end(ap);

  9.     for (i = 0; _buffer[i] != '\0'; i++)
  10.     {
  11.         EvbUart1WriteByte(_buffer[i]);
  12.     }
  13. }
复制代码
该函数必须包含
#include <stdio.h>#include <stdlib.h>
#include <stdarg.h>

以上三个头文件,有了它,你就可以直接用printf了,不需要选上MicroLib
原理很简单,高手略过,见笑了,嘻嘻~~~
  1. /*************************************************************************************************
  2. *                                     Trochili RTOS Kernel                                      *
  3. *                                  Copyright(C) 2015 LIUXUMING                                  *
  4. *                                        www.trochili.com                                       *
  5. *************************************************************************************************/


  6. #include "colibri_bsp_uart.h"


  7. void Uart1Config(u32 buad)
  8. {
  9.     /* Configure the GPIO ports */
  10.     GPIO_InitPara  GPIO_InitStructure;
  11.     USART_InitPara  USART_InitStructure;
  12.     //NVIC_InitPara NVIC_InitStructure;

  13.     /* Enable GPIOA clock */
  14.     RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_GPIOB, ENABLE );
  15.     /* Enable USART1 APB clock */
  16.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_USART1, ENABLE );
  17.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_AF, ENABLE);
  18.     GPIO_InitStructure.GPIO_Pin     = GPIO_PIN_6 ;
  19.     GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_AF_PP;
  20.     GPIO_InitStructure.GPIO_Speed   = GPIO_SPEED_50MHZ;
  21.     GPIO_Init( GPIOB , &GPIO_InitStructure);
  22.     GPIO_InitStructure.GPIO_Pin     = GPIO_PIN_7;
  23.     GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_IN_FLOATING;;
  24.     GPIO_Init( GPIOB , &GPIO_InitStructure);

  25.     GPIO_PinRemapConfig(GPIO_REMAP_USART1, ENABLE);
  26.    
  27.     //USART_DeInit(USART1 );
  28.     USART_InitStructure.USART_BRR                 = 115200;
  29.     USART_InitStructure.USART_WL                  = USART_WL_8B;
  30.     USART_InitStructure.USART_STBits              = USART_STBITS_1;
  31.     USART_InitStructure.USART_Parity              = USART_PARITY_RESET;
  32.     USART_InitStructure.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE;
  33.     USART_InitStructure.USART_RxorTx              = USART_RXORTX_RX | USART_RXORTX_TX;
  34.     USART_Init(USART1, &USART_InitStructure);

  35.     /* USART enable */
  36.     USART_Enable(USART1, ENABLE);         
  37.                
  38. #if 0
  39.     /* Enable the USARTx Interrupt */
  40.     NVIC_InitStructure.NVIC_IRQ = USART1_IRQn;
  41.     NVIC_InitStructure.NVIC_IRQPreemptPriority = 0;
  42.     NVIC_InitStructure.NVIC_IRQSubPriority = 0;
  43.     NVIC_InitStructure.NVIC_IRQEnable = ENABLE;
  44.     NVIC_Init(&NVIC_InitStructure);

  45.     /* Enable the USART1 Receive interrupt */
  46.     USART_INT_Set(USART1, USART_INT_RBNE, ENABLE );
  47.           USART_INT_Set(USART1, USART_INT_IDLEF, ENABLE );
  48.        
  49.           NVIC_InitPara NVIC_InitStructure;
  50.        
  51. #endif
  52. }


  53. /*************************************************************************************************
  54. *  功能:向串口1发送一个字符                                                                    *
  55. *  参数:(1) 需要被发送的字符                                                                   *
  56. *  返回:                                                                                       *
  57. *  说明:                                                                                       *
  58. *************************************************************************************************/
  59. void EvbUart1WriteByte(char c)
  60. {
  61.     USART_DataSend(USART1, c);
  62.     while (USART_GetBitState(USART1, USART_FLAG_TBE) == RESET);
  63. }

  64. void EvbUart1WriteByte2(char c)
  65. {
  66.     USART_DataSend(USART1, c);
  67. }
  68. /*************************************************************************************************
  69. *  功能:向串口1发送一个字符串                                                                  *
  70. *  参数:(1) 需要被发送的字符串                                                                 *
  71. *  返回:                                                                                       *
  72. *  说明:                                                                                       *
  73. *************************************************************************************************/
  74. void EvbUart1WriteStr(const char* str)
  75. {

  76.     while (*str)
  77.     {
  78.         USART_DataSend(USART1, * str++);
  79.         while (USART_GetBitState(USART1, USART_FLAG_TBE) == RESET);
  80.     }
  81. }


  82. /*************************************************************************************************
  83. *  功能:从串口1接收一个字符                                                                    *
  84. *  参数:(1) 存储接收到的字符                                                                   *
  85. *  返回:                                                                                       *
  86. *  说明:                                                                                       *
  87. *************************************************************************************************/
  88. void EvbUart1ReadByte(char* c)
  89. {
  90.     while (USART_GetBitState(USART1, USART_FLAG_RBNE) == RESET);
  91.     *c = (USART_DataReceive(USART1));
  92. }


  93. static char _buffer[256];
  94. void EvbUart1Printf(char* fmt, ...)
  95. {
  96.     int i;
  97.     va_list ap;
  98.     va_start(ap, fmt);
  99.     vsprintf(_buffer, fmt, ap);
  100.     va_end(ap);

  101.     for (i = 0; _buffer[i] != '\0'; i++)
  102.     {
  103.         EvbUart1WriteByte(_buffer[i]);
  104.     }
  105. }

  106. void EvbUart1EnableRxInt(void)
  107. {
  108.     /* Enable the USART1 Receive interrupt */
  109.     USART_INT_Set( USART1, USART_INT_RBNE, ENABLE );

  110. }

  111. void EvbUart1EnableTxInt(void)
  112. {
  113.     /* Enable the USART1 Transmoit interrupt */
  114.     USART_INT_Set( USART1, USART_INT_TBE, ENABLE );
  115. }

复制代码
头文件:
  1. #ifndef _TCL_COLIBRI_UART_H
  2. #define _TCL_COLIBRI_UART_H


  3. #include "gd32f20x.h"

  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <stdarg.h>

  7. #define printf EvbUart1WriteStr

  8. extern  void Uart1Config(u32 buad);

  9. extern void EvbUart1ReadByte(char* c);
  10. extern void EvbUart1WriteByte(char c);
  11. extern void EvbUart1WriteStr(const char* str);
  12. extern void EvbUart2Config(void);
  13. extern void EvbUart2ReadByte(char* c);
  14. extern void EvbUart2WriteByte(char c);
  15. extern void EvbUart2WriteStr(const char* str);


  16. extern void EvbUart1Printf(char* fmt, ...);

  17. #endif /* _TCL_COLIBRI_UART_H */
复制代码


原工程代码下载:


分享到:
回复

使用道具 举报

回答|共 5 个

倒序浏览

沙发

caizhiwei

发表于 2016-1-26 20:42:15 | 只看该作者

来呗,同学们MDK5
1.Colibri_GD32F207-LCD.zip (5.98 MB, 下载次数: 9)
板凳

caizhiwei

发表于 2016-1-26 20:43:27 | 只看该作者

         printf("\r\nHello,GD32!");
地板

奋斗哥

发表于 2016-1-27 09:22:26 | 只看该作者

好多代码
5#

jameswang

发表于 2016-1-28 09:26:38 | 只看该作者

学习学习
6#

yanhaijian

发表于 2016-1-30 16:34:06 | 只看该作者

这个重载实用性很高。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条