从零开始学习嵌入式-尝试
相关资料:
我一个完全的 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
-
arm-none-eabi-gdb
GNU Toolchain | GNU Arm Embedded Toolchain Downloads – Arm Developer -
OpenOCD Releases · xpack-dev-tools/openocd-xpack (github.com)
-
需要配置环境变量 path
-
-
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口的灯开始在红绿之间闪烁
-
-
-
尝试
-
Flash it - Discovery (rust-embedded.org)
-
注意
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
Debugging Rust ARM CortexM Programs with Visual Studio Code - DEV Community 🎉
-
这篇文章中有讲怎么在 vscode 中直接 debug 的,成功了❤
-
在
Rust 嵌入式开发环境搭建指南 (二):日常除虫 一文中也有讲怎么在 vscode 中 debug,但该文所用微处理器不同,我按照他的配置稍加改动也没有成功(应该是我太菜了)。
gpio 
我之所以想来学习嵌入式就是为了这个功能,准确的说是为了利用程序对现实进行控制。
通过 rust-embedded/留给您探索的 部分可以得知单片机的一种输入(ADC)输出(DAC)模式
stm32f3xx-hal 有提供 adc的例子 ,通过这个例子和以前的 led 控制代码就可以利用代码来 控制/读取 单片机引脚的电压从而影响到现实世界了
RTRM - Discovery (rust-embedded.org)
STM32F303xB/C/D/E, STM32F303x6/8, STM32F328x8, STM32F358xC, STM32F398xE advanced ARM®-based MCUs 第51页中描述了 gpio 与 寄存器地址的对应关系
ADC(模拟到数字) 与 DAC(数字到模拟)
引脚 |
功能 |
备注 |
---|---|---|
pe8 | N左侧的led | 使用电线从左边第一排的3v连接到pe8可以点亮 |
pe9~pe15 | 按顺序右移一个位置的led |
我非常迷惑的一个点,板子上的 pe8 和 ahbenr
的关联关系在哪里
0b1100000000000000_1111000000000000
// 这后面的是pe15~pe0 的高电平控制
//
debug
命令 | 简写 | 功能 |
---|---|---|
setp | s | 下一步 |
help | ||
continue | c | 继续执行 |
p | 打印 | |
disassemble /m | 反汇编 | |
info locals | 打印本地变量 |
糟糕,玩崩了
init mode failed (unable to connect to the target)
我在尝试的时候突然弄得无法通过
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 <transport>'.
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 连接了
链接到此文档的相关文档
by 崮生 from 崮生 • 一些随笔 🎨,欢迎 赞助本文
本文欢迎分享与聚合,全文转载未经授权( 联系我)不许可。