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

相关资料: 从零开始学习嵌入式

我一个完全的 rust/嵌入式 菜鸟成功的跑起来了感觉很欣慰 φ(* ̄0 ̄)

准备工作

在淘宝买了一个 STM32F303 DISCOVERY https://m.tb.cn/h.4HGxlGM?sm=fc0c4f

image.png

尝试

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

image.png运行效果

debug、vscode

  • Debugging Rust ARM CortexM Programs with Visual Studio Code - DEV Community 🎉

  • 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 继续执行
    print 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. 1.

      Serial number -> refresh to get your stlink serial

    2. 2.

      Mode: Under reset

    3. 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

    --- stackoverflow/questions/38092674

    我按照他所说的成功连接上了设备,但我并不会使用 STM32CubeProgrammer...

    image.png

    不过通过我的经验,按照如下步骤之后又可以成功的直接连接了

    • 点击左侧下载图标

    • 选择之前编译的二进制文件(改后缀为 .bin)

    • 点击 start 按钮

      • 这里会失败,但没有关系

    • 断开连接

    image.png

    此时就可以直接通过前面学习的方法使用 openocd 连接了

    by 崮生 from 崮生 • 一些随笔 🎨,欢迎 赞助本文
    本文欢迎分享与聚合,全文转载未经授权( 联系我)不许可。