博客
关于我
一文了解串口打印
阅读量:398 次
发布时间:2019-03-05

本文共 3329 字,大约阅读时间需要 11 分钟。

之前的文章《》介绍了串口驱动,串口在嵌入式领域不仅是一个通讯接口,还是一种调试工具,其好用程度不亚于硬件仿真。有些环境不方便连接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工程开源地址:

 

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工程开源地址:

 

点击查看本文所在的专辑,

 

转载地址:http://rhqzz.baihongyu.com/

你可能感兴趣的文章
mysql 多字段删除重复数据,保留最小id数据
查看>>
MySQL 多表联合查询:UNION 和 JOIN 分析
查看>>
MySQL 大数据量快速插入方法和语句优化
查看>>
mysql 如何给SQL添加索引
查看>>
mysql 字段区分大小写
查看>>
mysql 字段合并问题(group_concat)
查看>>
mysql 字段类型类型
查看>>
MySQL 字符串截取函数,字段截取,字符串截取
查看>>
MySQL 存储引擎
查看>>
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>
mysql 存储过程每隔一段时间执行一次
查看>>
mysql 存在update不存在insert
查看>>
Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
查看>>
Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
查看>>
Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
查看>>
Mysql 学习总结(89)—— Mysql 库表容量统计
查看>>
mysql 实现主从复制/主从同步
查看>>
mysql 审核_审核MySQL数据库上的登录
查看>>
mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
查看>>