1.开发环境搭建参照专栏mini2440Windows + WSL2 (Ubuntu) -Mini2440 开发环境操作手册 -CSDN博客

2.使用流水灯项目中的代码:Mini2440 流水灯实验(wsl+docker)-CSDN博客

3.OpenOCD安装参照mo_zhi_yan的博客:OpenOCD下载和安装教程(附安装包)-CSDN博客

OpenOCD的安装步骤略去,正文只阐述怎么配置调试环境。

硬件准备:J-Link及转接板、friendly arm mini2440开发板(S3C2440芯片)、板载电源线、USB转串口线、USB-A口线

这里有一个有意思的现象,当电源线连接,板子拨到off位或者拔去电源线,直接用jlink供电时蜂鸣器会报警。这是因为只用J-link提供的电压不稳导致的,引脚电平乱飘,从而触发了蜂鸣器。J-Link 的信号脚不是用来当电源用的,电流过大可能烧坏 J-Link 的驱动芯片,所以我们要把电源线连上并且拨到on位。请严格执行“先拔 J-Link,再关板子电源”的操作习惯。

拨到on位后,连线示意图:

一、环境配置

1.准备OpenOCD内mini2440的配置文件:

进入OpenOCD文件安装目录E:\OpenOCD-20250710-0.12.0\share\openocd\scripts

查看board文件夹,搜索mini2440.cfg,位于安装目录:E:\OpenOCD-20250710-0.12.0\share\openocd\scripts\board

查看target文件夹,搜索samsung_s3c2440.cfg ,位于安装目录:E:\OpenOCD-20250710-0.12.0\share\openocd\scripts\target

查看interface文件夹,搜索jlink.cfg,位于安装目录:E:\OpenOCD-20250710-0.12.0\share\openocd\scripts\interface

2.配置J-link驱动

进入此步之前,确保你的硬件已经全部连好。

以管理员身份运行 Zadig

点击菜单栏的 Options -> 勾选 List All Devices

在下拉列表中找到 J-Link(或者是 BULK interface,或者是 Segger J-Link),在WinUSB模式下直接点击Reinstall Driver覆盖之前自己打的segger驱动,并且要关闭相关服务和keil、IAR类似的编译器。

⚠️ 副作用: 当你把驱动换成 WinUSB 后,OpenOCD 可以用了,但是 Keil MDK、IAR 和 Segger 官方工具(J-Link Commander/Flash)将无法识别 J-Link

3.在 Windows 上启动OpenOCD Server

把板子拨到nand重新启动。

进入E:\OpenOCD-20250710-0.12.0\share\openocd\scripts路径

按下 ctrl+L 在地址栏直接输入cmd,cmd弹出页面就是该路径

输入指令:

openocd -f interface/jlink.cfg -f board/mini2440.cfg

不要关闭这个命令行窗口,把它挂在后台,它现在是你的调试服务器。

4.VScode环境配置

打开vscode,并连接到wsl,在项目根目录创建.vscode文件夹,并在文件夹根目录创建launch.json文件,项目使用专栏文章中的流水灯项目,代码依次复制即可:Mini2440 流水灯实验(wsl+docker)-CSDN博客

或者直接下载资源也可以:【免费】mini2440裸机流水灯项目资源资源-CSDN下载

在launch.json中复制以下配置代码,并且保存文件:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug mini2440 (Final)",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/mini2440.elf",
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb-multiarch",
            "targetArchitecture": "arm",
            

            "setupCommands": [
                { "text": "target extended-remote 127.0.0.1:3333" },
                
                { "text": "file ${workspaceFolder}/build/mini2440.elf" },
                { "text": "monitor reset init" },
                { "text": "monitor mww 0x56000010 0x00155550" }, 
                { "text": "load" },
                { "text": "break main" },
                
            ],
            
            "stopAtEntry": false, 
            "externalConsole": false,
            "logging": {
                "engineLogging": true
            }
        }
    ]
}

二、开始调试

1.进入调试

 确保那个黑色 OpenOCD 窗口还在运行。

在 VS Code 按 F5(或点击左侧调试图标 -> 绿色播放键)。

成功进入调试页面,底部变为橙色,我们设置的是在main中加了断点

  

再次按下F5进入调试,逐步按下F10可以在板子上明确看到LED灯全亮到全灭,然后再进入流水灯的逻辑依次亮起熄灭,也可以在左侧变量区依次监视变量的变化和寄存器的数值。 

2.为什么一次F5不够?

  • 刚进入调试时 (State 1)

    • GDB 连接后,通常会停在程序的第一条指令(通常是 0x00000000_start 汇编入口)。

    • 此时,Stack Pointer (SP, 堆栈指针) 还没有被初始化,它的值可能是 0 或随机值。

    • 变量区为空:因为局部变量是存在栈里的,栈都没准备好,GDB 自然读取不到任何变量。

  • 按下 F5 后 (State 2)

    • CPU 开始全速运行,跑过了 start.S (启动文件)。

    • 汇编代码里有一句 ldr sp, =0x3xxxxxxx (初始化堆栈)。

    • 然后跳转到 main 函数,触发了我们设置的断点。

    • 变量区有数据了:此时 SP 已经指向了正常的 SDRAM 地址,C 语言环境准备就绪,GDB 就能读出数据了。

3.为什么要使用OpenOCD?

  • 免费且跨平台: OpenOCD 是完全开源和免费的。可以在 Windows、Linux (WSL) 或 macOS 上运行它,无需支付许可证费用。

  • 兼容 GNU 生态: 它是 GNU 工具链(GCC/GDB)生态系统中的标准组成部分,与WSL 中使用的 arm-none-eabi-gdb 完美配合。

  • 可定制性高: 它的所有配置都基于简单的 Tcl 脚本 (.cfg 文件)。当面对像 S3C2440 这种非主流芯片时,可以自己编写或修改配置文件,以支持特定的 JTAG 接口、芯片复位序列或 Flash/SDRAM 初始化。

  • 调试器接口: 它可以支持几乎所有主流的低成本或开源调试器,例如 FTDI 芯片、J-Link(部分功能)、ST-Link(被广泛使用)、各种 Wiggler 兼容的 JTAG 适配器等。

  • 芯片支持: 它不仅支持现代的 ARM Cortex-M 芯片,还保留了对 ARM7、ARM9 (如 S3C2440) 等老架构的支持。对于mini2440 来说,OpenOCD 可能是少数几个仍然提供可行 JTAG 调试方案的免费工具之一。

4.大功告成

至此我们的现代WSL+OpenOCD调试环境搭建完成。

看得出来这比keil中的调试步骤要难得多,但是遇到小众的芯片keil就没办法了,openocd如果不存在相应的cfg文件大不了就自己写三个cfg,没有什么能难得住我们前进的脚步。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐