轻量版JFlash,仅保留芯片编程功能;完整版JFlash可以dump/check片上flash的内容
《Mac开发STM32之调试工具》篇章,已经有讲到用JLinkExe进行烧录,这里直接写为单行命令完成
https://blog.csdn.net/u010105424/article/details/106875832-device stm32f103rc 设备类型-autoconnect 1 自动连接设备-if SWD -speed 4000 连接方式和速度-CommandFile CommandFile.jlink 自动执行的交互命令通过网络远程JLink
=》填入RemoteServer的IP:PORT,设置调试方式,连接
=》选择 USB/型号/调试方式&速度 =》这时候工具连接上,等待GDB client连接进来
=》这里代表已经连接上了。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++);第三步:JLinkRTTViewer查看
% 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