cortexm / pyswd Goto Github PK
View Code? Open in Web Editor NEWPython SWD Debugging library for ST-Link/V2
License: MIT License
Python SWD Debugging library for ST-Link/V2
License: MIT License
Hi Pavel,
I just installed swd and wrote a small program to start with. But it does not find my ST-Link V3 nor a STM32-Nucleo board. I found issue #15 which looked for all devices and copied that to my program, so I hav this now:
#!/usr/bin/env python3
# coding: utf-8
import sys
import swd
import usb
def main ():
devices = []
# dev = usb.core.find(idVendor = 0x0483, idProduct = 0x374B, iProduct = 0x5, find_all = True)
dev = usb.core.find(find_all = True)
for device in dev:
devices.append (device)
print (hex(device.idVendor), hex(device.idProduct), device.serial_number)
STLink = swd.Swd (swd_frequency=4000000, serial_no='')
print (STLink)
if __name__ == '__main__':
sys.exit(main())
it produces this output:
0x4f2 0xb613 None
0x4f2 0xb604 0001
Traceback (most recent call last):
File "E:\Projects\Software\Python\PySWD_Test\source\PySWD_Test.py", line 22, in <module>
sys.exit(main())
File "E:\Projects\Software\Python\PySWD_Test\source\PySWD_Test.py", line 17, in main
STLink = swd.Swd (swd_frequency=4000000, serial_no='')
File "C:\Users\Martin\AppData\Roaming\Python\Python310\site-packages\swd\swd.py", line 15, in __init__
driver = _Stlink(
File "C:\Users\Martin\AppData\Roaming\Python\Python310\site-packages\swd\stlink\__init__.py", line 114, in __init__
usb = _usb.StlinkUsb(serial_no, debug=debug)
File "C:\Users\Martin\AppData\Roaming\Python\Python310\site-packages\swd\stlink\usb.py", line 222, in __init__
raise NoDeviceFoundException()
swd.stlink.usb.NoDeviceFoundException
With the upper dev = ... line nothing is found
I changed idProduct to 0x374B (instead of 0x374F as in issue #15), because I found this value in Windows device manager.
I'm running Python 3.10 under Win 10
(also swd.Swd () does not accept a keyword argument 'logger': error message is :TypeError: Swd.init() got an unexpected keyword argument 'logger')
Thanks for any help
Martin
Line 42 in 1fc3d85
on slow commands (for example EEPROM write) it can raise error, although it is not an error, in that cases, just wait until it will be OK
Hi Pavel,
well, the question is in the title. If yes, then some instructions on installing would be appreciated.
Thanks a lot.
Martin
firstly thanks what a splendid piece of tidy python!
i found that it was not setting the jtag speed as expected because the hash is unordered. i made a fix, do you want a pull request for it?
When trying to load write_mem a very large piece of data
.local/lib/python3.7/site-packages/swd/swd.py", line 180, in write_mem
del chunk[:chunk_size32]
TypeError: 'bytes' object does not support item deletion
Hi, I'm getting an error while using the read_mem() function
I think the error happens when using read_mem() with a (size > 4) and (size % 4 != 0)
ST-Link version: ST-Link/V2-1 V2J28M18
import swd
import time
dev = swd.Swd()
while True:
print('reading')
data = list(dev.read_mem(0x20000000, 5))
print(data)
time.sleep(1)
First read is successful but Exception is thrown at second read. ST-Link needs to be unpluged and repluged to make it work again.
Traceback (most recent call last):
File "swd\stlinkcom.py", line 77, in write
count = self._dev.write(self.PIPE_OUT, data, tout)
File "Python\Python36-32\lib\site-packages\usb\core.py", line 948, in write
self.__get_timeout(timeout)
File "Python\Python36-32\lib\site-packages\usb\backend\libusb1.py", line 824, in bulk_write
timeout)
File "Python\Python36-32\lib\site-packages\usb\backend\libusb1.py", line 920, in __write
_check(retval)
File "Python\Python36-32\lib\site-packages\usb\backend\libusb1.py", line 595, in _check
raise USBError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBError: [Errno 10060] Operation timed out
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 8, in <module>
data = list(dev.read_mem(0x20000000, 5))
File "swd\swd.py", line 147, in read_mem
yield from self._drv.read_mem8(address, chunk_size)
File "swd\_log.py", line 29, in wrapper
ret = func(*args, **kwargs)
File "swd\stlink.py", line 370, in read_mem8
return self._com.xfer(cmd, rx_length=size)
File "swd\_log.py", line 29, in wrapper
ret = func(*args, **kwargs)
File "swd\stlinkcom.py", line 185, in xfer
self._dev.write(command, tout)
File "swd\_log.py", line 29, in wrapper
ret = func(*args, **kwargs)
File "swd\stlinkcom.py", line 80, in write
raise StlinkComException("USB Error: %s" % err)
swd.stlinkcom.StlinkComException: USB Error: [Errno 10060] Operation timed out
Hello, How to install properly?
I run under Windows.
I've installed packages pyswd 1.0.0 and pyusb 1.1.1 by just "pip install pyswd" command. When I run python and after import swd package, firstly I try to initialize by "dev = swd.Swd()" I get error "No backend available".
Please help me.
When no target is connected it is not possible to get the target voltage.
example:
print(swd.Swd().get_target_voltage())
Gives:
swd.stlink.StlinkException: Get IDCODE error
When debugging connection issues it is good to be able to determine if the target is powered. This is also a first indication for if the connector or adapter is connected properly.
Hello,
the Pipy version is still stuck at version 1.0.0 which was released 2 years ago.
Create another release to make available the bug fixes in usb.py as they are quite necessary.
Thanks.
It is a nice tool !
Is there any plan to support CMSIS-DAP, Ulink2, etc?
CortexM(sdw.Swd()).get_idcode()
gets the Stlinks IDCODE(or some other value from it) rather than the target IDCODE.
To get the target IDCODE you must use:
sdw.Swd().get_mem32(0xE0042000)
Consider changing the function name?
example get_idcode() = 2BA01477 (corresponding to Cortex ®-M4 with FPU r0p1) STM32F446xx
example swd.get_mem32(0xE0042000) = 10006430 (F103 XL REV.A)
I wonder if read_mem and write_mem with the suffixes 8, 16, 32 all use and store data in bytes.
So what memory view do I get for write_mem32 (0x20000000, [1, 2, 3, 4])?
01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 = interpreting data as 32 bit values?
01 02 03 04 00 00 00 00 00 00 00 00 00 00 00 00 = interpreting data as 8 bit values but write them in 32 bit accesses?
The same reverse for read_memX
It seems, that data is always in bytes (??) Is there a way to get 32bit data in and out or must I do the processing on my own?
I do not know if this is normal but it takes more than 10 seconds to connect for me.
import time
import libusb_package
import usb.core
import usb.backend.libusb1
libusb1_backend = usb.backend.libusb1.get_backend(find_library=libusb_package.find_library)
import swd
x = time.time()
dev = swd.Swd()
y = time.time()
print('CONNECTED in {} seconds'.format(y-x))
# py -3 swdspeedtest.py
CONNECTED in 12.987221956253052 seconds
I would like to get connection speed closer to 2 seconds or less.
Perhaps it is related to libusb not pyswd? Any suggestions?
Dose it can't support write data to flash memery? When I write data to flash,like write address 0x08000000 in stm32f103cb,it can not work!
Getting a "module 'swd' has no attribute 'stlink'" error
Downgrading to commit d8f25cd (before the stlink driver was split into a sub-module) resolves the error.
Is there a way to disconnect the Swd interface?
I have noticed that some stlinkv2 versions do not work as expected
I use the following python code:
import swd
dev = swd.Swd()
print(dev.get_version().str)
print(dev.get_target_voltage())
print(dev.get_idcode())
cm = swd.CortexM(dev)
cm.halt()
cm.reset()
cm.run()
print(cm.get_reg('PC'))
And get the following output:
$ python3 swdtest.py
ST-Link/V2 V2J38S7
3.23
463475831
Traceback (most recent call last):
File "swdtest.py", line 14, in <module>
print(cm.get_reg('PC'))
File "/usr/local/lib/python3.8/dist-packages/swd/cortexm.py", line 61, in get_reg
return self._swd.get_reg(CortexM._get_reg_index(reg))
File "/usr/local/lib/python3.8/dist-packages/swd/swd.py", line 58, in get_reg
return self._drv.get_reg(register)
File "/usr/local/lib/python3.8/dist-packages/swd/stlink/__init__.py", line 251, in get_reg
_check_status(status)
File "/usr/local/lib/python3.8/dist-packages/swd/stlink/__init__.py", line 56, in _check_status
raise StlinkException(_com.StlinkCom.STATUS.MESSAGES[status])
swd.stlink.StlinkException: Command error
With a different stlinkv2
$ python3 swdtest.py
ST-Link/V2 V2J33S7
3.23
463475831
0
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.