我一个完全的 rust/嵌入式 菜鸟成功的跑起来了感觉很欣慰 φ(* ̄0 ̄)
准备工作
在淘宝买了一个 STM32F303 DISCOVERY https://m.tb.cn/h.4HGxlGM?sm=fc0c4f
按照这里的文档来准备的,建议跟着官方文档走,写的挺好 -> Setting up a development environment - Discovery (rust-embedded.org)
之前已经安装了 rust
cargo install itm
需要配置环境变量 path
bash
cargo install cargo-binutils rustup component add llvm-tools-preview
windows 上需要 PuTTY
USB驱动程序 这个下载站点恶心到我了,直接注册账号才能下载,填邮箱下载一直失败
验证
openocd -f D:\app2\xpack-openocd-0.10.0-15\scripts\interface\stlink-v2-1.cfg -f D:\app2\xpack-openocd-0.10.0-15\scripts\target\stm32f3x.cfg
执行此命令后靠近usb口的灯开始在红绿之间闪烁
尝试
注意 cd %TEMP% 命令我只在 cmd 中尝试成功了,powershell 不行
cd %TEMP% openocd -s C:\share\scripts -f interface/stlink-v2-1.cfg -f target/stm32f3x.cfg
arm-none-eabi-gdb -q -ex "target remote :3333" target/thumbv7em-none-eabihf/debug/led-roulette
这个命令要在 discovery\ 下面执行而非 discovery\src\05-led-roulette
注意看后面的 target/... 这个编译产物存在于 discovery\
我在 vscode 中 discovery\src\05-led-roulette 下一直执行 cargo go 失败,猜测是环境变量的问题,重启电脑后 ok
(gdb) 中执行 target remote :3333 的时候需要确保 openocd 命令 在正常运行,否则连不上的
运行效果
debug、vscode
这篇文章中有讲怎么在 vscode 中直接 debug 的,成功了❤
Rust 嵌入式开发环境搭建指南 (二):日常除虫 一文中也有讲怎么在 vscode 中 debug,但该文所用微处理器不同,我按照他的配置稍加改动也没有成功(应该是我太菜了)。
gpio
我之所以想来学习嵌入式就是为了这个功能,准确的说是为了利用程序对现实进行控制。
通过 rust-embedded/留给您探索的 部分可以得知单片机的一种输入( ADC )输出( DAC )模式
stm32f3xx-hal 有提供 adc的例子 ,通过这个例子和以前的 led 控制代码就可以利用代码来 控制/读取 单片机引脚的电压从而影响到现实世界了
ADC(模拟到数字) 与 DAC(数字到模拟)
引脚
功能
备注
pe8 N左侧的led 使用电线从左边第一排的3v连接到pe8可以点亮
pe9~pe15 按顺序右移一个位置的led

我非常迷惑的一个点,板子上的 pe8 和 ahbenr 的关联关系在哪里
寄存器
0b1100000000000000_1111000000000000 // 这后面的是pe15~pe0 的高电平控制 //
debug
命令 简写 功能
setp s 下一步
help
continue c 继续执行
print p 打印
disassemble /m 反汇编
info locals 打印本地变量
糟糕,玩崩了
init mode failed (unable to connect to the target)
我在尝试的时候突然弄得无法通过 这个命令 连接了
bash
WARNING: interface/stlink-v2-1.cfg is deprecated, please switch to interface/stlink.cfg Info : auto-selecting first available session transport "hla_swd". To override use 'transport select '. Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD Info : Listening on port 6666 for tcl connections Info : Listening on port 4444 for telnet connections Info : clock speed 1000 kHz Info : STLINK V2J37M26 (API v2) VID:PID 0483:374B Info : Target voltage: 2.885933 Error: init mode failed (unable to connect to the target)
幸运的是通过 google 发现了下面这段
I had same situation on Ubuntu. I solved this, using STM32CubeProgrammer.
On the ST-LINK configuration area:
1.
Serial number -> refresh to get your stlink serial
2.
Mode: Under reset
3.
Reset mode: Core reset
try to connect asap when power your board. When you connect you can do "full chip erease". It suppose to be ready for next usage. I hope it helps
我按照他所说的成功连接上了设备,但我并不会使用 STM32CubeProgrammer...
不过通过我的经验,按照如下步骤之后又可以成功的直接连接了
点击左侧下载图标
选择之前编译的二进制文件(改后缀为 .bin)
点击 start 按钮
这里会失败,但没有关系
断开连接
此时就可以直接通过前面学习的方法使用 openocd 连接了