STM32下KEIL5+ST_LINK实现ITM 调试之printf重定向

  1. ITM简介
    ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式
  2. stm32使用ITM调试
    MCU:stm32f103R8
    仿真器:st_link v2

IDE:MDK5.33

    1. 硬件连接
      ITM机制要求使用SWD方式接口,并需要连接SWO线,一般的四线SWD方式(VCC SDCLK,SDIO,GND)是不行的。标准的20针JTAG接口是可以的,只需要在MDK里设置使用SWD接口即可。

    1.  添加重定向文件
      将下面的文件保存成任意C文件,并添加到工程中。这里对这个文件简单说明一下,要知道我们的程序是在单片机上运行的,为什么printf可以输出到MDK窗口里去呢?这是因为 标准库中的printf实际上调用 fputc实现输出,所以我们需要自己编写一个fputc函数,这个函数会借助ITM(类似于USART)提供的寄存器,实现数据的发送,仿真器会收到这些数据,并发往PC机。

#include <stdio.h>

#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

struct __FILE { int handle; /* Add whatever you need here */ };
    FILE __stdout;
    FILE __stdin;
    
int fputc(int ch, FILE *f)
{
    if (DEMCR & TRCENA)
    {
        while (ITM_Port32(0) == 0);
        ITM_Port8(0) = ch;
    }
    return(ch);
}

    1. 配置JLINK的初始化配置文件

      将下面文件放置在你的工程下,并取任意名称,这里笔者取名为 STM32DBG.ini

      /******************************************************************************/
      /* STM32DBG.INI: STM32 Debugger Initialization File */
      /******************************************************************************/


      FUNC void DebugSetup (void) {
      // <h> Debug MCU Configuration
      // <o1.0> DBG_SLEEP <i> Debug Sleep Mode
      // <o1.1> DBG_STOP <i> Debug Stop Mode
      // <o1.2> DBG_STANDBY <i> Debug Standby Mode
      // <o1.5> TRACE_IOEN <i> Trace I/O Enable
      // <o1.6..7> TRACE_MODE <i> Trace Mode
      // <0=> Asynchronous
      // <1=> Synchronous: TRACEDATA Size 1
      // <2=> Synchronous: TRACEDATA Size 2
      // <3=> Synchronous: TRACEDATA Size 4
      // <o1.8> DBG_IWDG_STOP <i> Independant Watchdog Stopped when Core is halted
      // <o1.9> DBG_WWDG_STOP <i> Window Watchdog Stopped when Core is halted
      // <o1.10> DBG_TIM1_STOP <i> Timer 1 Stopped when Core is halted
      // <o1.11> DBG_TIM2_STOP <i> Timer 2 Stopped when Core is halted
      // <o1.12> DBG_TIM3_STOP <i> Timer 3 Stopped when Core is halted
      // <o1.13> DBG_TIM4_STOP <i> Timer 4 Stopped when Core is halted
      // <o1.14> DBG_CAN_STOP <i> CAN Stopped when Core is halted
      // </h>
      _WDWORD(0xE0042004, 0x00000027); // DBGMCU_CR
      _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
      }

      DebugSetup(); // Debugger Setup

      这里对这个文件做简单的解释,
      _WDWORD(0xE0042004, 0x00000027); // DBGMCU_CR
      这一句表示想 0xE0042004地址处写入 0x000000027,这个寄存器是各个位表示的含义在注释中给出了详细的解释。 0x27即表示
              BIT0 DBG_SLEEP
              BIT1 DBG_STOP
              BIT2 DBG_STANDBY
              BIT5 TRACE_IOEN
      注意,要使用ITM机制,必须要打开BIT5。

下图中注意两点
1). 这里的CoreClock是120M,因为笔者使用的是stm32F103r8这款芯片,并且时钟配置为64M,所以这里填入64M,如果你使用stm32F10x。即需要跟实际情况保持一致。
2). 最后一定要将 0处打勾,并将其他bit位上的勾去掉,最好与此图保持一致,除CoreClock外。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值