1 J-Link简介
J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器。配合IAR EWAR,ADS,KEIL,WINARM,RealView等集成开发环境支持所有ARM7/ARM9/ARM11,Cortex M0/M1/M3/M4, Cortex A5/A8/A9等内核芯片的仿真,是学习开发ARM最好最实用的开发工具。
J-link 软件包的工具很多,有J-Flash,J-Link Commander,J-Link GDB Server,J-Link RTT Viewer,J-Mem等小工具组成,本文讲解J-link读写MCU内部Flash的相关软件。
2 J-link下载与安装
下载地址:https://www.segger.cn/downloads/jlink/
J-link从V750以后,Windows就有64位的软件。
笔者这里下载的是JLink_Windows_x86_64_V754d.exe。下载后直接安装即可,这样就不再赘述了。
3 J-link读写MCU内部Flash
下面以STM32为例进行讲解,当然其他MCU也是试用的,只要有JTAG或SWD接口即可。
3.1 使用J-Flash下载程序
这里使用J-Flash将程序下载到MCU的内部Flash中。打开J-Flash,在安装完J-Link驱动就会有该软件。
首次使用就需要新建工程,如图所示。
然后就选择相应的芯片。
根据板子的芯片类型选择即可。
接下来将前面编译好的程序拖动进入J-Flash。J-Flash支持Hex、Bin等多种文件类型。笔者这里选择的是HEX文件类型。如果烧写的是Bin文件,还需要指定烧写的起始地址,因为Bin文件是不包含烧写地址的。
然后点击‘Connect’。
然后按F7或者点击‘Production Programming’即可下载。
值得注意的是,要想生成HEX文件,需要在Keil配置输出文件。
如果要想生成bin文件,需要在KEIL的User选项中,如下图添加这两项:
fromelf --bin --output=…/Output/STM32F103.bin …/Output/STM32F103.axf
编译完成后就会在Output目录下生成bin文件。
烧写成功之后,此时程序还没有运行,点击Target->Manual Programming->Start Application,或者按快捷键F9,程序才开始运行,或者按复位键也可以让程序运行。
如果想让每次下载完成后,程序自动运行,而不用复位。可以使用工程配置下的自动运行选项。打开Option->Project Setting,切换到Production选项,勾选Start Application,就可以让程序自动运行。
当然啦,也可下载任意bin文件到MCU的内部Flash中。另外也可手动进行烧写。
3.2 使用J-Flash读取Flash
打开J-Flash,和上一节一样,选择相应的芯片,然后点击‘Connect’。
选择Target->Manual Programming ->Read Back,一共有三个选项,用于读取不同的Flash地址范围。
Selected sectors
被选择的扇区,可以在工程配置选项Project settings->Flash,查看哪些扇区被选择了。
Entire chip
整个Flash区域,一般选择这个选项,读取整个Flash区域的程序
Range
手动指定读取的Flash地址范围。
笔者这里选择Range,指定读取Flash的内容。
等待片刻即可读取完成。
选项File-> Save data file或者是Save data file as,保存读取的数据。
然后即可对比烧写的数据和读取数据是否一致,可以用作程序的校验。
3.3 使用J-Mem读取Flash
打开J-Mem,选择相应的芯片,然后点击‘OK’。
如果连接正常就可以看到MCU的4G内存空间的内容。
笔者这里使用的是STM32F1,是Cortex-M3的内核,Cortex-M3存储器映射结构如下图所示。
Cortex-M3是32位的内核,因此其PC指针可以指向2^32=4G的地址空间,也就是0x0000_0000——0xFFFF_FFFF这一大块空间。根据图中描述,Cortex-M3内核将0x0000_0000——0xFFFF_FFFF这块4G大小的空间分成8大块:代码、SRAM、外设、外部RAM、外部设备、专用外设总线-内部、专用外设总线-外部、特定厂商等,因此使用该内核的设计者必须按照这个进行各自芯片的存储器结构设计。
Cortex-M3存储器结构和STM32存储器结构:
图中可以很清晰的看到,STM32的存储器结构和Cortex-M3的很相似,不同的是,STM32加入了很多实际的东西,如:Flash、SRAM等。可以看到Flash的地址是0x08000000。
这里就可以指定到Flash中,读取相应的内容。
当然也可以保存相应地址的内容。
点击右键,选择“Save”。
然后选择保存路径,设置其实地址。
即可保存任意数据。