例子:
test connection
stm32loader -p /dev/tty.SLAB_USBtoUART
dump content of FLASH memory
stm32loader -p /dev/tty.SLAB_USBtoUART -d
save content of FLASH memory
stm32loader -p /dev/tty.SLAB_USBtoUART -r file.bin
write bin file to FLASH from selected address
stm32loader -p /dev/tty.SLAB_USBtoUART -a 0x08003000 -w file.bin
mass erase, write bin file to FLASH, verify and execute application
stm32loader -p /dev/tty.SLAB_USBtoUART -m -w file.bin -f -x
help
stm32loader -h
原理:
通过串口通讯(Pyserial库)对进入bootload状态的STM32单片机进行指令发送,将KEIL生成的bin文件下载到单片机flash中
步骤:
- 发送0X7f进行连接STM32 返回值 0X1f或者0x79
- 发送0x00+0xff(异或运算 0x00^0xff) 询问单片机bootversion 返回值:
[121, 11, 34, 0, 1, 2, 17, 33, 49, 67, 99, 115, 130, 146, 121]
第三个为版本号0x22 即2.2 - 发送0x02+0xfd(异或运算 0x02^0xff) 询问单片机chip id返回值:
[121, 1, 4, 16, 121] b'\x79\x01\x04\x10\x79'
第三、四个为版本号0410 - 发送下载指令,写入flash数据
KEIL生成bin文件: (KEIL4好像无效,5能正常使用)
$K\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L
Pyvisa替代: 特别注意pyserial 3.0 以上版本不支持xp!!!
后续将pyserial用Pyvisa替代,注意事项:
- 从缓冲区读取需要注意read的截止符,会提前终止,必须不断循环读取,直到字节达到指定长度。
- 读取字节
data , _= rms.visalib.read(serial_port.session, serial_port.bytes_in_buffer)
data0 = list(data)
print(":".join(['%02x' % d for d in data0])) #按位取值
- write后需要ms级才能刷新缓冲区,需要延时0.1s才能进行read操作!!