[STM32] Mac开发STM32之JLink常用方法

Mac开发STM32之JLink常用方法

一、JLink组件

APP

JFlash/JFlashLite/JFlashSPI     下载烧录程序
JLinkConfig                      升级固件
JLinkGDBServer                  连接Target,设置为GDB server
JLinkRemoteServer               设置主机+Jlink为远程server
JLinkSWOViewer                  查看SWO输出
JLinkRTTViewer                  查看运行时log输出
JLinkLicenseManager
JLinkRegistration
JMem

Command

 JFlashSPI -> JFlashSPICLExe
 JLinkRemoteServer -> JLinkRemoteServerCLExe
 JLinkGDBServer -> JLinkGDBServerCLExe
 JLinkRTTClient -> JLinkRTTClientExe
 JLinkRTTLogger -> JLinkRTTLoggerExe
 JLinkSWOViewer -> JLinkSWOViewerCLExe
 JLinkExe
 JLinkSTM32 -> JLinkSTM32Exe
 JLinkGUIServerExe
 JRunExe
 JTAGLoadExe

二、烧录

JFlash

[STM32] Mac开发STM32之JLink常用方法_第1张图片

步骤如下:
* 打开JFlash,[Create New Project]->选择型号,连接类型JTAG/SWD
* [File]->[Open data file],起始地址0x8000000
* [Target]->[connect]然后[Erase Chip]、[Program]

JFlashLite

[STM32] Mac开发STM32之JLink常用方法_第2张图片
轻量版JFlash,仅保留芯片编程功能;完整版JFlash可以dump/check片上flash的内容

JLinkExe命令行烧录

% 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进行烧录,这里直接写为单行命令完成

  • https://blog.csdn.net/u010105424/article/details/106875832
  • -device stm32f103rc 设备类型
  • -autoconnect 1 自动连接设备
  • -if SWD -speed 4000 连接方式和速度
  • -CommandFile CommandFile.jlink 自动执行的交互命令

三、远程连接

JLinkRemoteServer

[STM32] Mac开发STM32之JLink常用方法_第3张图片
通过网络远程JLink

JLinkRemoteServer command方式

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

JLinkGDBServer试试连接

[STM32] Mac开发STM32之JLink常用方法_第4张图片
[STM32] Mac开发STM32之JLink常用方法_第5张图片
=》填入RemoteServer的IP:PORT,设置调试方式,连接

四、GDB连接

JLinkGDBServer

[STM32] Mac开发STM32之JLink常用方法_第6张图片
=》选择 USB/型号/调试方式&速度
[STM32] Mac开发STM32之JLink常用方法_第7张图片
=》这时候工具连接上,等待GDB client连接进来

JLinkGDBServer command方式

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

GDB client连接

% 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调试两种命令方式

五、log系统

在debug系统时,通常会用到printf。在单片机开发中,由于嵌入式设备不像主机,并没有标准输入输出设备(键盘/显示器),像printf/scanf/fopen/fclose等函数在底层没实现,我们需要把printf重定向到其他设备上去。这里介绍两种方式,
一种是串口方式,重定向到UART
一种是JLink方式,重定向到SWD模式的SWO接口或通过JLink RTT

uart串口

在标准输入输出文件"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;
}

JLinkSWOViewer

通过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输出函数如上
[STM32] Mac开发STM32之JLink常用方法_第8张图片
=》设置 Device/CPUCLock后连接上可以看到输出log
% JLinkSWOViewerCL -device stm32f103rc
=》也可这条命令在终端看log

JLinkRTTViewer

RTT相较于SWO,不用接多一根SWO引脚,而且性能更高(更推荐)
RTT:Real Time Transfer,实时传输
第一步:获取RTT code,并加到工程里
[STM32] Mac开发STM32之JLink常用方法_第9张图片
第二步:include SEGGER_RTT.h文件,调用SEGGER_RTT_printf打印

SEGGER_RTT_WriteString(0, "test \n");
SEGGER_RTT_printf(0, "test test %d \n", cnt++);

第三步:JLinkRTTViewer查看
[STM32] Mac开发STM32之JLink常用方法_第10张图片

% 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

你可能感兴趣的:(STM32)