编程ARM微控制器的标准(低成本)方法是使用Eclipse,并在其中插入复杂的工具链.Eclipse肯定有它的优点,但我想要独立于这个IDE.我想发现当我构建(编译 - 链接 - 闪存)我的软件以及运行调试会话时幕后发生的事情.为了更深入地理解,从命令行运行整个过程会很棒.
注意:我使用的是64位Windows 10.但这里解释的大部分内容也适用于Linux系统.请使用管理员权限打开所有命令终端.这可以为您节省很多问题.
1.构建软件
第一个"使命"完成了.我现在能够通过命令行编译和链接我的软件到二进制文件.bin
和.elf
图像.成功的关键是找出Eclipse为特定项目提供make文件的位置.一旦你知道它们在哪里,你所要做的就是打开一个命令终端,然后输入GNU make
命令.
你不再需要Eclipse了!特别是如果您可以阅读(并理解)makefile并在项目进展时根据您的需要进行调整.
请注意,在安装SW4STM32(System Workbench for STM32)之后,我在以下文件夹中找到了GNU工具(编译器,链接器,make实用程序,GDB,...):
C:\Ac6\SystemWorkbench\plugins\fr.ac6.mcu.externaltools.arm-none.win32_1.7.0.201602121829\tools\compiler\
Run Code Online (Sandbox Code Playgroud)
接下来,我在硬盘上创建了一个新文件夹,并将所有这些GNU工具复制到其中:
C:\Apps\AC6GCC
|-> arm-none-eabi
|-> bin
'-> lib
Run Code Online (Sandbox Code Playgroud)
我将这些条目添加到"环境路径变量":
- C:\Apps\AC6GCC\bin
- C:\Apps\AC6GCC\lib\gcc\arm-none-eabi\5.2.1
Run Code Online (Sandbox Code Playgroud)
Huray,现在我已经在我的系统上启动并运行了所有GNU工具!我将以下build.bat
文件放在与以下文件夹相同的文件夹中makefile
:
@echo off
echo.
echo."--------------------------------"
echo."- BUILD -"
echo."--------------------------------"
echo.
make -j8 -f makefile all
echo.
Run Code Online (Sandbox Code Playgroud)
运行这个bat文件应该可以胜任!如果一切顺利,您将获得一个.bin
和一个.elf
二进制文件作为编译的结果.
2.闪烁和调试固件
自然的后续步骤是将固件刷新到芯片并启动调试会话.在Eclipse中,只需"点击一个按钮" - 至少如果为您的微控制器正确配置了Eclipse.但是幕后会发生什么?我从Dominic Rath(OpenOCD的开发者)那里阅读(部分)硕士论文.你可以在这里找到它:http://openocd.net/.这是我学到的:
单击"调试"图标时,Eclipse将启动OpenOCD软件.Eclipse还为OpenOCD提供了一些配置文件 - 这样OpenOCD就知道如何连接到微控制器."如何连接"并非易事.OpenOCD需要找到合适的USB驱动程序来连接JTAG适配器(例如STLink).JTAG适配器及其USB驱动器通常由您的芯片制造商提供(例如STMicroelectronics).Eclipse还将配置文件移交给OpenOCD,该文件描述了微控制器的规格.一旦OpenOCD知道所有这些事情,它就可以与目标设备建立可靠的JTAG连接.
OpenOCD启动两个服务器.第一个是TCP端口4444上的Telnet服务器.它可以访问OpenOCD CLI(命令行界面).Telnet客户端可以连接并向OpenOCD发送命令.这些命令可以是简单的"停止","运行","设置断点",......
这些命令可能足以调试你的微控制器,但很多人已经熟悉Gnu调试器(GDB).这就是为什么OpenOCD还在TCP端口3333上启动GDB服务器.GDB客户端可以连接到该端口,并开始调试微控制器!
Gnu调试器是一个命令行软件.很多人更喜欢可视化界面.这正是Eclipse所做的.Eclipse启动了一个连接到OpenOCD的GDB客户端 - 但这对用户来说都是隐藏的.Eclipse提供了一个图形界面,可以在幕后与GDB客户端进行交互.
我已经做了一个数字来解释所有这些事情:
>>启动OpenOCD …
我正在尝试用gdb创建一个小单元测试,用于由OpenOCD控制的嵌入式mcu (这使我可以通过gdb服务器控制我的目标).
所以我想用gdb的一些脚本来自动执行此操作.
我想为gdb写一些或多或少的脚本:
有任何想法吗?
关于如何在python gdb脚本中执行此操作的示例将是很好的.
谢谢约翰
注意:
假设我们有这个基本结构,或多或少进入test_failed()或test_success(),具体取决于函数start_test()返回的内容.
void test_failed() {
while(1);
}
void test_success() {
while(1);
}
int main(void) {
int status = start_test();
if( status > 0 ) {
test_failed();
}
test_success();
while(1);
}
Run Code Online (Sandbox Code Playgroud)
在gdb中手动执行此操作是非常紧张的,
(gdb) break test_success
Breakpoint 1 at 0x20: file src/main.c, line 9.
(gdb) break test_failed
Breakpoint 2 at 0x18: file src/main.c, line 5.
(gdb) cont
Continuing.
Breakpoint 1, test_success () at src/main.c:9
9 while(1);
(gdb) …
Run Code Online (Sandbox Code Playgroud) 我正在寻找有关正确的GDB/OpenOCD初始化和运行命令(外部工具)的帮助,以便在Eclipse中用于flash和ram调试,以及需要合并到flash文件的make文件中的正确修改或添加内容为这个mcu建造,如果这当然重要.
mcu:STM32F103VET6
我正在使用带有Zylin嵌入式CDT的Eclipse Helios,Yagarto Tools和Bins,OpenOCD .4,以及一个Olimex ARM-USB-OCD Jtag适配器.
我已经配置了ARM-USB-OCD并将其作为外部工具添加到Eclipse中.为了初始化OpenOCD,我在Eclipse中使用了以下命令.电路板配置文件引用stm32 mcu:
"openocd -f interface/olimex-arm-usb-ocd-h.cfg -f board/stm32f10x_128k_eval.cfg"
当我在Eclipse中运行它时,一切似乎都在工作(GDB接口,OpenOCD找到mcu等).我也可以telnet到OpenOCD并运行命令.所以,我被困在下一部分; 用于flash和ram调试的初始化和命令,以及擦除闪存.
我阅读了几个教程,并搜索了网络,但未能找到任何特定的处理器.我是新手,所以我可能不会认识到一个公平的产品.
JIMT
我正在使用Launchpad的 gcc-arm-none-eabi 4.9-2015q2来编译STM32F0,现在我想使用该集合中的arm-none-eabi-gdb进行调试.我的ST-Link v2是Nucleo F411RE板的一部分,附带外部硬件(STM32F0目标).闪烁F0工作正常,所以我得出结论,我的SWD连接是好的.
现在我想启动OpenOCD,但它失败了:
$ openocd -f interface/stlink-v2.cfg -f target/stm32f0x.cfg
Open On-Chip Debugger 0.9.0 (2015-07-26-16:02)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
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
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
none separate
Info : Unable to match requested speed 1000 kHz, using …
Run Code Online (Sandbox Code Playgroud) 我有一块NUCLEO-F401RE 板(带有STM32F401RE),它在大部分情况下工作正常。最近,我按照“ Mastering STM32 ”一书中的教程进行操作,其中提到安装OpenOCD。
在此之前我也一直在关注,并且我能够连接到我的开发板并刷新它,没有任何问题。
但在尝试让 OpenOCD 工作后,这不再可能了。每次我尝试连接到我的开发板时,我都会收到以下错误消息:
未检测到 ST-LINK
我已经尝试多次更新驱动程序、重新启动开发板、重新安装ST-LINK实用程序、切换 USB 电缆、重置开发板并重新安装所有内容,并且我还尝试了按住重置按钮并尝试擦除芯片。不幸的是,到目前为止,这些都对我不起作用。
这是我的主板的图片:
在我的桌面上,我使用 Windows 10。在我的主板上,我使用FreeRTOS。
[
我也尝试过使用 ST-LINK 升级来更新我的主板上的固件,但没有成功。尝试此操作时,我要么无法选择我的设备(使用.jar应用程序时),要么在使用.exe应用程序时,我只收到以下错误消息:
未检测到 ST-Link 设备
请连接并重试
有解决办法吗?
我无法获得可靠的调试设置。我在网络上的一些论坛上看到过类似标题的其他主题,但情况似乎不同。
设置:
现在,有一个序列,每次经过一番挣扎后,我都能够与调试器连接,但是单步执行和读取变量的工作并不那么可靠,以至于我暂时相信我所看到的。但是,即使到了调用堆栈不会充满明显的无意义条目并且只有很少的地方的地步,也是很累的。
例子:
OpenOCD 输出:
GNU ARM Eclipse 64 位开放式片上调试器 0.10.0-dev-00287-g85cec24-dirty (2016-01-10-10:31) 根据 GNU GPL v2 许可 有关错误报告,请阅读 http://openocd.org/doc/doxygen/bugs.html 信息:自动选择第一个可用的会话传输“hla_swd”。要覆盖使用“传输选择”。 信息:选定的传输接管了低级目标控制。与普通 JTAG/SWD 相比,结果可能有所不同 适配器速度:500 kHz 适配器_nsrst_delay:100 没有分开 没有分开 信息:无法匹配请求的速度 500 kHz,使用 480 …
我正在尝试设置一个 eclipse 开发环境来使用 stm32f303 nucleo 32 板。 http://www.st.com/en/evaluation-tools/nucleo-f303k8.html
到目前为止,所有工具似乎都已正确安装并正常工作:我已经成功编译并启动了用于 stm32f4 发现的 openocd 调试器,当我连接 stm32f303 nucleo 32 板并启动 openocd 时,板上的 LED 指示它已连接。(我已经刷了黑板。)
当我逐步调试时,问题是 openocd 丢失了,这似乎与 openocd 开始时给我的消息有关(查找粗线):
Open On-Chip Debugger 0.9.0 (2015-05-19-12:09)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
none separate
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
Info : Unable to match requested speed 1000 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试从Raspberry Pi 3计算模块GPIO中闪存基于皮质m0的SoC,但它仍然会出现相同的错误.
错误:无法初始化调试端口
我正在关注这个https://learn.adafruit.com/programming-microcontrollers-using-openocd-on-raspberry-pi?view=all和本教程https://movr0.com/2016/09/02/use -raspberry-pi-23-as-a-jtagswd-adapter /.编译和安装没有问题.
cortex m0 SoC是一款采用ISP1302模块封装的Nordic Semiconductor nRF51822蓝牙芯片.
模块GND和3.3V直接连接到Compute模块dev-kit,SWDCLK和SWDIO按照教程在GPIO 25,24上连接.SRST或TRST没有连接.
配置文件如下:
source [find interface/raspberrypi2-native.cfg]
bcm2835gpio_swd_nums 25 24
transport select swd
# target
source [find target/nrf51.cfg]
init
targets
Run Code Online (Sandbox Code Playgroud)
(我bcm2835gpio_srst_num 18
从raspberrypi2-native.cfg中删除了)
执行 sudo openocd -f config.cfg
树莓派CM3在选项core_freq=250
打开的情况下运行,/boot/config.txt
我需要此选项才能可靠地访问UART1.我认为它可能与时钟有关,但不确定如何更改/修复它.
我尝试了几种reset_config
没有改变错误的组合.完整初始化堆栈如下:
Open On-Chip Debugger 0.10.0+dev-00111-gca9dcc8 (2017-04-24-15:30)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
BCM2835 GPIO nums: swclk = 25, swdio = 24
cortex_m reset_config sysresetreq
adapter …
Run Code Online (Sandbox Code Playgroud) 我正在开发Cortex-M3微控制器(STM32系列)上的应用程序.我正在尝试使用Visual Studio Code作为调试器接口,使用ST-Link v2 JTAG探针.我设法配置OpenOCD与我的设备通信,VSCode运行本地GDB并连接到OpenOCD.
现在我想在开始调试时让VSCode与GDB同时启动OpenOCD.我有以下launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Pipe Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/path/to/program.elf",
"stopAtEntry": false,
"cwd": "${workspaceFolder}/gcc-arm-none-eabi",
"environment": [],
"externalConsole": true,
"pipeTransport": {
"pipeProgram": "X:\\path\\to\\openocd-0.10.0\\bin-x64\\openocd.exe",
"pipeArgs": ["-f", "vscode.ocd"],
"pipeCwd": "${workspaceFolder}"
},
"MIMode": "gdb"
},
{
"name": "(gdb) Attach",
"type": "cppdbg",
"request": "launch",
"cwd": "${workspaceFolder}/gcc-arm-none-eabi",
"program": "${workspaceFolder}/path/to/program.elf",
"MIMode": "gdb",
"targetArchitecture": "arm",
"miDebuggerPath": "X:\\path\\to\\gcc-arm-none-eabi-4_8-2014q2-20140609-win32\\bin\\arm-none-eabi-gdb.exe",
"miDebuggerServerAddress": "127.0.0.1:3333"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的vscode.ocd文件如下:
source [find interface/stlink-v2.cfg]
transport select "hla_swd"
source stm32l1.cfg
stm32l1.cpu configure -event gdb-attach halt …
Run Code Online (Sandbox Code Playgroud) 我拥有一块STM32F4Discovery板,它包含一个STM32F4微控制器和一个ST-LINKv2调试器接口.我想在这个设置上做一些简单的C编程,并希望使用免费的工具来完成它.
这就是我所知道的:
这是我不知道的:如何将这些碎片组合成一个连贯的整体.我相信所有必要的活动部件都存在,但我对如何组装它们感到茫然.我找到了点点滴滴,通常以"安装Eclipse Indigo"之类的东西开头.是否有简单的教程,步骤列表或要检查的内容?