打印

Python读STM32内部各种数据

[复制链接]
191|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小小的人呀|  楼主 | 2018-7-6 21:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
几个月前在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代码,然后又用半小时调试。一个半小时顶上了将近一个星期的工作量。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

399

主题

399

帖子

0

粉丝