JFlash/JFlashLite/JFlashSPI 下载烧录程序
JLinkConfig 升级固件
JLinkGDBServer 连接Target,设置为GDB server
JLinkRemoteServer 设置主机+Jlink为远程server
JLinkSWOViewer 查看SWO输出
JLinkRTTViewer 查看运行时log输出
JLinkLicenseManager
JLinkRegistration
JMem
JFlashSPI -> JFlashSPICLExe
JLinkRemoteServer -> JLinkRemoteServerCLExe
JLinkGDBServer -> JLinkGDBServerCLExe
JLinkRTTClient -> JLinkRTTClientExe
JLinkRTTLogger -> JLinkRTTLoggerExe
JLinkSWOViewer -> JLinkSWOViewerCLExe
JLinkExe
JLinkSTM32 -> JLinkSTM32Exe
JLinkGUIServerExe
JRunExe
JTAGLoadExe
步骤如下:
* 打开JFlash,[Create New Project]->选择型号,连接类型JTAG/SWD
* [File]->[Open data file],起始地址0x8000000
* [Target]->[connect]然后[Erase Chip]、[Program]
轻量版JFlash,仅保留芯片编程功能;完整版JFlash可以dump/check片上flash的内容
% vim CommandFile.jlink
h
loadbin OBJ/STM32_REG_TEST1.bin 0x8000000
r
g
qc
% JLinkExe -device stm32f103rc -autoconnect 1 -if SWD -speed 4000 -CommandFile CommandFile.jlink
《Mac开发STM32之调试工具》篇章,已经有讲到用JLinkExe进行烧录,这里直接写为单行命令完成
% JLinkRemoteServer -Port 19020
SEGGER J-Link Remote Server V6.80b
Compiled Jun 5 2020 17:43:10
'q' to quit '?' for help
Connected to J-Link with S/N 59700618
Waiting for client connections...
=》填入RemoteServer的IP:PORT,设置调试方式,连接
=》选择 USB/型号/调试方式&速度
=》这时候工具连接上,等待GDB client连接进来
% JLinkGDBServer -select USB -device STM32F103RC -endian little -if SWD -speed 4000 -noir -noLocalhostOnly
Connecting to J-Link...
J-Link is connected.
Firmware: J-Link V9 compiled Dec 13 2019 11:14:50
Hardware: V9.70
S/N: 59700618
Feature(s): RDI, FlashBP, FlashDL, JFlash, GDB
Checking target voltage...
Target voltage: 3.23 V
Listening on TCP/IP port 2331
Connecting to target...
Connected to target
Waiting for GDB connection...
% arm-none-eabi-gdb OBJ/STM32_REG_TEST1.elf
Reading symbols from OBJ/STM32_REG_TEST1.elf...done.
(gdb) target remote :2331
Remote debugging using :2331
0x08000bd0 in WWDG_IRQHandler ()
=》这里代表已经连接上了。gdb不带elf文件会看不到debug信息,不过也可以进入gdb交互界面后"(gdb)file target.elf"把symbol load进来
(gdb) load
Start address 0x8000b90, load size 3084
Transfer rate: 1003 KB/sec, 771 bytes/write.
=》load命令可以把elf文件下载到target板子上,另外一种下载程序的方式
(gdb) monitor reset
Resetting target
=》发"reset"给JLinkGDBServer执行;执行"monitor"查看GDB server支持的命令
=》monitor命令和gdb命令是GDB调试两种命令方式
在debug系统时,通常会用到printf。在单片机开发中,由于嵌入式设备不像主机,并没有标准输入输出设备(键盘/显示器),像printf/scanf/fopen/fclose等函数在底层没实现,我们需要把printf重定向到其他设备上去。这里介绍两种方式,
一种是串口方式,重定向到UART
一种是JLink方式,重定向到SWD模式的SWO接口或通过JLink RTT
在标准输入输出文件"stdio.h"中,printf调用fputc来发送字符
第一步:include “stdio.h"并重写fputc (GCC版本是__io_putchar)
在使用printf/fopen等函数会进入半主机模式,ARM的半主机机制就是利用PC代劳,将程序的标准输入输出透过仿真器切到PC上。因此要使用printf,需关掉半主机,在软件上做一些设置
第二步(方法1):MDK软件可以使用微库,钩上"Use MicroLIB”,就不会进入半主机模式
第二步(方法2):code里可以设置 __use_no_semihostin
#pragma import(__use_no_semihosting_swi)
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
_sys_exit(int x)
{
x = x;
}
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
while((USART1->SR&0X40)==0);
USART1->DR = (u8) ch;
return ch;
}
通过SWO进行调试需先连接SWO接口,SWO通过内核ITM模块实现
SWO:Serial Wire Output,串行线输出
ITM:Instrumentation Trace Macrocell,指令跟踪宏单元
PUTCHAR_PROTOTYPE
{
ITM_SendChar(ch);
return ch;
}
=》与uart的差异仅是重写函数的不同,其实就是发送字符方式不同
=》ITM_SendChar库函数,在core_cm3.h定义,直接拿来用即可
void ITM_SendString(const char *s)
{
while ( *s ) ITM_SendChar((int)*s++);
}
=》为了不和uart冲突,这里另外写一个string输出函数如上
=》设置 Device/CPUCLock后连接上可以看到输出log
% JLinkSWOViewerCL -device stm32f103rc
=》也可这条命令在终端看log
RTT相较于SWO,不用接多一根SWO引脚,而且性能更高(更推荐)
RTT:Real Time Transfer,实时传输
第一步:获取RTT code,并加到工程里
第二步:include SEGGER_RTT.h文件,调用SEGGER_RTT_printf打印
SEGGER_RTT_WriteString(0, "test \n");
SEGGER_RTT_printf(0, "test test %d \n", cnt++);
% JLinkRTTLogger -device STM32F103RC -if SWD -speed 4000 -rttchannel 0 RTT_debug.log
=》JLinkRTTLogger用于命令行保存log
% JLinkGDBServer -select USB -device STM32F103RC -endian little -if SWD -speed 4000 -noir -noLocalhostOnly
% JLinkRTTClient
###RTT Client: Connecting to J-Link RTT Server via localhost:19021 ...
###RTT Client: Connected.
=》JLinkRTTClient可以在终端印出log,但需要配合debugger才能使用;比如JLinkGDBServer先连接,或者JLinkExe先连接
JLinkExe -device stm32f103rc -autoconnect 1 -if SWD -speed 4000