从零开始学习嵌入式-尝试

相关资料: 从零开始学习嵌入式
我一个完全的 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口的灯开始在红绿之间闪烁

尝试

bash
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 命令 在正常运行,否则连不上的
运行效果

使用vscode 的 debug 功能,而非在命令行中使用gdb

这篇文章中有讲怎么在 vscode 中直接 debug 的,成功了❤
Rust 嵌入式开发环境搭建指南 (二):日常除虫 一文中也有讲怎么在 vscode 中 debug,但该文所用微处理器不同,我按照他的配置稍加改动也没有成功(应该是我太菜了)。

debug

命令简写功能
setps下一步
help
continuec继续执行
printp打印
disassemble /m反汇编
info locals打印本地变量

println!

在同一个目录下分别执行
bash
openocd -s C:\share\scripts -f interface/stlink-v2-1.cfg -f target/stm32f3x.cfg
bash
# both itmdump -F -f itm.txt
然后再运行 cargo run 即可

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(数字到模拟)
引脚
功能
备注
pe8N左侧的led使用电线从左边第一排的3v连接到pe8可以点亮
pe9~pe15按顺序右移一个位置的led

我非常迷惑的一个点,板子上的 pe8 和 ahbenr 的关联关系在哪里
寄存器
0b1100000000000000_1111000000000000 // 这后面的是pe15~pe0 的高电平控制 //

糟糕,玩崩了

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 连接了