你好,世界! HEADS UP几位读者报道,即使用户手册(第21页)说明,使用ITM和iprint!下面显示的宏所需的STM32F3DISCOVERY上的“焊桥”SB10(见电路板背面)也 未焊接它应该是。

TL; DR您有两种方法可以解决此问题:焊接焊桥SB10或在SWO和PB3之间连接导线,如下图所示。

手动SWD连接

在我们开始做低级别的事情之前,再多一些有用的魔法。

闪烁LED就像嵌入式世界的“Hello,world”。

但是在本节中,我们将运行一个适当的“Hello,world”程序,将内容打印到笔记本电脑控制台。

转到06-hello-world目录。其中有一些入门代码:

![deny(unsafe_code)]

![no_main]

![no_std]

[allow(unused_imports)]

use aux6::{entry, iprint, iprintln};

[entry]

fn main() -> ! { let mut itm = aux6::init();

  1. iprintln!(&mut itm.stim[0], "Hello, world!");
  2. loop {}

}

该iprintln宏将消息,并将其输出格式单片机的ITM。ITM代表Instrumentation Trace Macrocell,它是SWD(串行线调试)之上的通信协议,可用于将消息从微控制器发送到调试主机。这种通信只有一种方式:调试主机不能向微控制器发送数据。

管理调试会话的OpenOCD可以接收通过此ITM 通道发送的数据并将其重定向到文件。

ITM协议适用于帧(您可以将它们视为以太网帧)。每个帧都有一个头和一个可变长度的有效载荷。OpenOCD将接收这些帧并将它们直接写入文件而不进行解析。因此,如果微控制器发送字符串“Hello,world!” 使用 iprintln宏,OpenOCD的输出文件将不会完全包含该字符串。

要检索原始字符串,必须解析OpenOCD的输出文件。我们将使用该 itmdump程序在新数据到达时执行解析。

您应该已经itmdump在安装章节中安装了该程序。

在新终端中,/tmp如果您使用的是* nix操作系统,则在目录中运行此命令%TEMP%;如果您运行的是Windows,则在目录中运行此命令。这应该与运行OpenOCD的目录相同。

注意从同一目录运行itmdump并openocd运行非常重要!

$ # itmdump terminal

$ # *nix $ cd /tmp && touch itm.txt

$ # Windows $ cd %TEMP% && type nul >> itm.txt

$ # both $ itmdump -F -f itm.txt 此命令将阻止itmdump现在正在观看itm.txt文件。将此终端保持打开状态

好的。现在,让我们构建入门代码并将其闪存到微控制器中。

为避免将—target thumbv7em-none-eabihf标志传递给每个Cargo调用,我们可以在.cargo / config中设置默认目标:

[target.thumbv7em-none-eabihf] runner = “arm-none-eabi-gdb” rustflags = [ “-C”, “link-arg=-Tlink.x”, “-C”, “linker=arm-none-eabi-ld”, “-Z”, “linker-flavor=ld”, ]

+[build] +target = “thumbv7em-none-eabihf” 现在,如果—target没有指定货物将假定目标是thumbv7em-none-eabihf。

$ cargo run Reading symbols from target/thumbv7em-none-eabihf/debug/hello-world…done. (..) Loading section .vector_table, size 0x400 lma 0x8000000 Loading section .text, size 0x27c4 lma 0x8000400 Loading section .rodata, size 0x744 lma 0x8002be0 Start address 0x8002980, load size 13064 Transfer rate: 18 KB/sec, 4354 bytes/write. Breakpoint 1 at 0x8000402: file src/06-hello-world/src/main.rs, line 10. Note: automatically using hardware breakpoints for read-only addresses.

Breakpoint 1, main () at src/06-hello-world/src/main.rs:10 10 let mut itm = aux6::init(); 请注意,.gdbinitCargo项目的根源是一个。它与我们在上一节中使用的非常相似。

在我们执行iprintln!声明之前。我们必须指示OpenOCD将ITM输出重定向到itmdump正在观看的同一文件中。

(gdb) # globally enable the ITM and redirect all output to itm.txt (gdb) monitor tpiu config internal itm.txt uart off 8000000

(gdb) # enable the ITM port 0 (gdb) monitor itm port 0 on 一切都应该准备好了!现在执行iprintln!语句。

(gdb) next 12 iprintln!(&mut itm.stim[0], “Hello, world!”);

(gdb) next 14 loop {} 您应该在itmdump终端中看到一些输出:

$ itmdump -F -f itm.txt (..) Hello, world! 太棒了吧?iprintln在接下来的部分中,您可以随意用作日志记录工具。

下一个:这不是全部!该iprint!宏不使用ITM的唯一的事情。:-)