使用下载代替物理串口输出-STM32 Debug (printf) Viewer

使用下载代替物理串口输出-STM32 Debug

硬件要求

STM32的PB9、PB10引脚的串口1通常用作其他功能使用后,无法通过printf()函数打印输出想要调试输出查看变量或调试信息。现已使用另外一种方法实现printf()函数打印输出。

ST-Link要使用标准接口的下载器引脚就可以了,常规下载引脚有CLK、IO、GND、VCC外还需要一个特殊引脚TDO,位于STM32的PB3引脚。所以说如果没引PB3引脚(TDO)出来,基本上用不到这个文章了。
在这里插入图片描述

配置方法

本人使用的是STM32F1,demo使用hal库,下载器使用官方的ST-ling。
点击Keil工具栏的 Manage Run-Time Environment
在这里插入图片描述

将STDOUT,STDIN,STDERR勾选,并设置为ITM
在这里插入图片描述

点击工具栏的扳手在这里插入图片描述,进入Debug选项,选择Settings,进入Trace,设置Core Clock为72MHz,勾选Trace Enable,将ITM Stimulus Ports设置为0x00000001和0x00000000。点击确定。

这里是72Mhz,要看你的主频是多少了。
在这里插入图片描述

代码要求

重新添加printf打印输出的重定义函数

uart.c

//下载器UART输出
#if 1
//#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 
 
FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{ 	
	 ITM_SendChar(ch);  
	return ch;
}
#endif

之后跟普通串口一样,在需要打印的地方输入printf函数。

打印输出结果

烧录程序,进入在这里插入图片描述debug模式,按下图所示进行配置即可正常运行

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于如何在 STM32使用 printf 函数进行串口输出,通常需要进行以下步骤: 1. 确定要使用的 USART 端口和波特率 2. 在代码中配置 USART,并初始化时钟 3. 配置 printf 函数,使其将数据发送到 USART 端口 以下代码可以作为一个简单的示例来实现这一过程: ``` #include "stm32f4xx.h" #include <stdio.h> // 定义使用的 USART 端口 #define USART_PORT USART2 // 定义要使用的波特率 #define USART_BAUD 115200 int main(void) { // 启用 GPIOA 和 USART2 的时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 配置 USART 引脚 GPIO_InitTypeDef gpioInit; gpioInit.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; gpioInit.GPIO_Mode = GPIO_Mode_AF; gpioInit.GPIO_Speed = GPIO_Speed_50MHz; gpioInit.GPIO_OType = GPIO_OType_PP; gpioInit.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &gpioInit); // 配置 USART 应用 USART_InitTypeDef usartInit; usartInit.USART_BaudRate = USART_BAUD; usartInit.USART_WordLength = USART_WordLength_8b; usartInit.USART_StopBits = USART_StopBits_1; usartInit.USART_Parity = USART_Parity_No; usartInit.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART_PORT, &usartInit); // 配置 printf 函数 USART_Cmd(USART_PORT, ENABLE); setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); printf("Hello, world!\n"); while (1) { // 代码运行中,可以向 printf 函数传入需要输出的内容 } } ``` 此时,当代码运行时,使用 printf 函数输出的内容将通过 USART 端口进行发送。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢谢~谢先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值