几个月前在CSDN发现有大神通过SEGGER官方推出的RTT功能,在不使用UART的情况下,实现STM32数据的打印。
但是使用RTT的方式,需要在STM32代码中添加RTT相关的代码,而且RTT的窗口不是特别友好,不能把打印的数据存储到外部文件中,只能一点儿一点儿的复制出来。
后来又在百度搜到使用Python,通过J-link读写STM32寻址空间中的数据的方法。
该方法主要是Python通过库“PyLink”,调用JLinkARM.dll文件的功能,实现读取STM32寻址空间中的数据。
今天简单在这里写一下,防止自己忘记的同时,也分享给大家。
首先需要自己安装Python(我用的Python3),可以百度安装方法,记得添加环境变量,其他不多介绍(但是真的觉得Python万能!!!)。
要使用Python读取STM32内部数据,需要安装Python库——PyLink (官网:https://pylink.readthedocs.io/en/latest/installation.html)。
在PowerShell中输入“pip install pylink-square”,等待安装。
完成之后,插上J-link和STM32开发板,开发板上电(不需要keil进入Debug状态,更不需要在工程代码中添加附加代码,只需要记住想要读取或写入数据的首地址)。
然后在PowerShell中输入Python代码,或自己写一个 .py的文件,来实现。
另外,切记,在打开PowerShell的文件夹中,或执行Python文件的文件夹中,一定要复制一个JLinkARM.dll文件,比如附件图片中这样。
import pylink #添加库文件
jlink = pylink.JLink() #创建jlink对象
jlink.open('xxxxxxxxx') #xxxxxxxxx替换成J-link的SN码,可以在keil -> Options for Target -> Debug -> Settings -> J-link/J-Trace Adapter -> SN 栏中复制,注意保留两个单引号
jlink.connect('STM32H743II') #这里填入自己的单片机型号,注意保留两个单引号
jlink.memory_read16(0x38000000,128) #这里以16位bit的方式读取数据(可以是8位、16位、32位、64位,详细参考官网),从地址0x38000000开始,读取128个数据。该函数的输出结果是一个列表。
pylink库中其他API请参考官网。
在完成以上的操作之后,我自己又实现了一步比较骚气(请原谅理工男想不出文雅的词汇)的操作。
我把上述最后一步,输出的列表,通过Python库——xlsxwriter,存储到了excel文档中。这样,只要运行一下.py文件,就会自动生成xlsx文件,而且里边写好了我想要读取的数据。
全部代码如下:
import pylink
import xlsxwriter
number = 1024
jlink = pylink.JLink()
jlink.open('xxxxxxxxxx')
jlink.connect('STM32H743II')
list = jlink.memory_read16(0x38000000,number)
workbook = xlsxwriter.Workbook('ADCData.xlsx')
worksheet = workbook.add_worksheet()
for i in range(number):
if (i%4 == 0):
worksheet.write('A'+str((i/4)+1),list)
if (i%4 == 1):
worksheet.write('B'+str((i/4)+1),list)
if (i%4 == 2):
worksheet.write('C'+str((i/4)+1),list)
if (i%4 == 3):
worksheet.write('D'+str((i/4)+1),list)
workbook.close()
前边第一张插图文件夹中的“ADCData.xlsx”,就是自动生成的excel文件。文件中的数据,就是我想要读取的数据。
另外,如果内存中的数据是float格式的,那么在STM32内存中,这些数据是以一种我们看不太懂得存储方式存储的。不过别怕,Python仍然有解决办法。
import struct
def bytesToFloat(int32_t):
h4 = int32_t&0x000000ff
h3 = (int32_t&0x0000ff00)>>8
h2 = (int32_t&0x00ff0000)>>16
h1 = (int32_t&0xff000000)>>24
ba = bytearray()
ba.append(h1)
ba.append(h2)
ba.append(h3)
ba.append(h4)
return struct.unpack("!f",ba)[0
上边这个Python函数,输入STM32内存中的数据,会返回一个非整数。它的功能就是把STM32内存中的float数据,转换成我们能够正常看懂的小数形式的。
最后总结一下:
搞纯软件的程序员都在说“人生苦短,我用Python”,这句话真不是白说的。
原本大概需要调试几十次,而且每次调试需要导出的1024个数据,如果不用Python,通过串口或者RTT,大概我一个星期的工作量就交代清楚了。
后来有了Python和PyLink库,搞了一个小时的Python代码,然后又用半小时调试。一个半小时顶上了将近一个星期的工作量。 |