杂记:STM32 调试信息打印实现方式

杂记:STM32 调试信息打印实现方式

  • 一、引言
  • 二、使用 USART 串口打印
  • 原理
  • (二)实现步骤
  • 硬件连接
  • 代码实现
  • 使用 ST – LINK 调试器 ITM 打印
  • (一)原理
  • (二)实现步骤
  • 硬件连接
  • 代码实现
  • 四、使用 Semihosting 打印
  • (一)原理
  • (二)实现步骤
  • 硬件连接
  • 代码实现
  • 五、对比USART1与STLINK调试器输出打印
  • 5.1 硬件依赖性
  • 5.2 适用场景
  • 5.3 性能
  • 5.4 使用方便性
  • 一、引言

    在 STM32 开发过程中,调试信息打印是一种非常实用的调试手段。通过打印关键信息,开发者可以实时了解程序的运行状态,快速定位和解决问题。本文将介绍几种常见的 STM32 调试信息打印实现方式,并给出相应的代码示例和图文说明。

    二、使用 USART 串口打印

    原理

    USART(通用同步异步收发传输器)是 STM32 常用的通信接口,通过配置 USART 并将调试信息以字符形式发送出去,上位机(如电脑)使用串口调试助手接收并显示这些信息。

    (二)实现步骤

    硬件连接

    将 STM32 开发板的 USART 引脚(TX、RX)通过 USB 转串口模块连接到电脑的 USB 接口。例如,使用 STM32F103 系列,通常 USART1 的 TX 为 PA9,RX 为 PA10。

    代码实现

    #include "stm32f1xx_hal.h"
    #include <stdio.h>
    
    UART_HandleTypeDef huart1;
    
    // 重定向 fputc 函数
    int fputc(int ch, FILE *f)
    {
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_USART1_UART_Init(void);
    
    int main(void)
    {
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
        MX_USART1_UART_Init();
    
        while (1)
        {
            printf("Hello, USART!\r\n");
            HAL_Delay(1000);
        }
    }
    

    使用 ST – LINK 调试器 ITM 打印

    (一)原理

    ITM(Instrumentation Trace Macrocell)是 ARM Cortex – M 内核提供的一种调试功能,通过 ST – LINK 调试器将调试信息从芯片传输到开发环境(如 Keil MDK)中显示。

    (二)实现步骤

    硬件连接

    使用 ST – LINK 调试器通过 SWD 或 JTAG 接口连接 STM32 开发板。

    代码实现

    #include "stm32f1xx_hal.h"
    #include <stdio.h>
    
    // 使能 ITM
    #define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))
    #define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))
    #define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))
    #define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))
    #define TRCENA          0x01000000
    
    int fputc(int ch, FILE *f)
    {
        if (DEMCR & TRCENA)
        {
            while (ITM_Port32(0) == 0);
            ITM_Port8(0) = ch;
        }
        return(ch);
    }
    
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    
    int main(void)
    {
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
    
        while (1)
        {
            printf("Hello, ITM!\r\n");
            HAL_Delay(1000);
        }
    }
    

    四、使用 Semihosting 打印

    (一)原理

    Semihosting 是 ARM 提供的一种机制,允许运行在目标芯片上的代码与主机(开发环境)进行交互,通过主机的标准输入输出设备进行调试信息的打印。

    (二)实现步骤

    硬件连接

    使用 ST – LINK 调试器通过 SWD 或 JTAG 接口连接 STM32 开发板。

    代码实现

    配置半主机模式在Keil中,可以通过以下步骤启用半主机模式:

    1. 打开项目选项(Project -> Options for Target)。
    2. 在“Debug”选项卡中,选择“Settings”。
    3. 在“Semihosting”部分,启用“Semihosting”选项。
    #include "stm32f1xx_hal.h"
    #include <stdio.h>
    
    // 重定向 fputc 函数
    extern int __io_putchar(int ch);
    int fputc(int ch, FILE *f)
    {
        return __io_putchar(ch);
    }
    
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    
    int main(void)
    {
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
    
        while (1)
        {
            printf("Hello, Semihosting!\r\n");
            HAL_Delay(1000);
        }
    }
    

    五、对比USART1与STLINK调试器输出打印

    5.1 硬件依赖性

    • USART1:需要硬件串口支持,需要连接串口线或USB转串口模块。
    • STLINK:不需要硬件串口,但需要调试器支持半主机模式。

    5.2 适用场景

    • USART1:适用于需要在目标硬件上直接查看调试信息的场景,如嵌入式系统开发。• STLINK:适用于需要在开发环境中查看调试信息的场景,如调试阶段。

    5.3 性能

    • USART1:性能较高,适合大量数据输出。
    • STLINK:性能较低,适合少量调试信息输出。

    5.4 使用方便性

    • USART1:需要配置串口和重定向 printf 函数。
    • STLINK:配置简单,直接使用 printf 函数即可。

    作者:Geek__1992

    物联沃分享整理
    物联沃-IOTWORD物联网 » 杂记:STM32 调试信息打印实现方式

    发表回复