一文了解串口打印


之前的文章《STM32 串口詳解》介紹了串口驅動,串口在嵌入式領域不僅是一個通訊接口,還是一種調試工具,其好用程度不亞於硬件仿真。有些環境不方便連接Jlink進行硬件仿真,或者並不是必現的問題,我們需要定位出現問題的地方,可以選擇保存log的方式,但是需要后續讀取,且受到Flash大小的限制,如果可以放置一台計算機到現場,使用串口打印無疑是最好的辦法,在C語言中 printf函數輸出各種類型的數據,使用格式控制輸出各種長度的字符,甚至輸出各種各樣的圖案,需要將串口重定向到printf函數。

01、硬件打印

在STM32的應用中,我們常常對printf進行重定向的方式來把打印信息printf到我們的串口助手。在MDK環境中,我們常常使用MicroLIB+fputc的方式實現串口打印功能,即:串口重映射

代碼中記得添加一下頭文件

#include < stdio.h >

兼容不同IDE的putchar重映射。

#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__ */

當然也需要配置下串口,不需要配置中斷。

void UART_Init(void)
{
  USART_InitTypeDef USART_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
 
  /* Enable GPIO clock */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  /* Enable UART1 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  /* Connect PXx to USARTx_Tx*/
  GPIO_PinAFConfig(GPIOA, 9, GPIO_AF_USART1);
  
  /* Connect PXx to USARTx_Rx*/
  GPIO_PinAFConfig(GPIOA, 10, GPIO_AF_USART1);
  
  /* Configure USART Tx as alternate function  */
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Configure USART Rx as alternate function  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  
  /* USART configuration */
  USART_Init(USART1, &USART_InitStructure);
  
  /* Enable USART */
  USART_Cmd(USART1, ENABLE);
}

打印函數

PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(USART1, (uint8_t) ch);
 
  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}
 
  return ch;
}

不同的IDE也要對應的的配置。

Keil配置,需要勾選MicroLIB選項。

 

 

 IAR配置

 

 

 打印效果

 

 

 代碼和工程已經開源

代碼和Keil IAR工程開源地址:

https://github.com/strongercjd/STM32F207VCT6

 

02、IDE打印

有些時候,我們需要只是在辦公室調試,芯片沒有額外的串口提供我們調試,使用IDE打印也不失為一條好辦法。

2.1、IAR

代碼如下

  printf("\r\n======================================================================");
  printf("\r\n=               (C) COPYRIGHT 2020                                   =");
  printf("\r\n=                                                                    =");
  printf("\r\n=                ST207 USART_Printf                                  =");
  printf("\r\n=                                                                    =");
  printf("\r\n=                                           By Firefly               =");
  printf("\r\n======================================================================");
  printf("\r\n\r\n");

IAR打印效果

 

 配置方法,打開TerminalIO:進入調試->view->Terminal I/O

 

 

2.2、Keil

目前我還沒有找到解決辦法。網上可以找到勾選Use Simulator,但這是模擬調試的,並不是硬件調試,不符合我的要求。

歡迎大家分享自己的辦法,在評論區告訴大家。

代碼和IAR工程開源地址:

https://github.com/strongercjd/STM32F207VCT6

 

點擊查看本文所在的專輯,STM32F207教程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM