From 5cdfbe3818c0c326607ff4529df3928463d1f53e Mon Sep 17 00:00:00 2001 From: vc4 <287920192@qq.com> Date: Tue, 27 Feb 2024 16:17:02 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=BF=9B=E5=85=A5bootloader?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91=EF=BC=8C=E5=90=8C=E6=97=B6=E6=93=8D?= =?UTF-8?q?=E4=BD=9Cdtr/rts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hc32flash.py | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/hc32flash.py b/hc32flash.py index 7a02201..c6ead99 100755 --- a/hc32flash.py +++ b/hc32flash.py @@ -2,6 +2,7 @@ import os, sys, time, struct import serial +import serial.tools.list_ports import argparse version = "0.1.2" @@ -190,12 +191,14 @@ class TransportError(Exception): class SerialTransport(): def __init__(self, port, baud): - self.port = port - self.baud = baud self.serial = None try: self.serial = serial.Serial(port, baud) + self.serial.rts = False + self.serial.dtr = False + self.serial.rts = True + self.serial.dtr = True except serial.SerialException as e: raise TransportError(str(e)) from None @@ -220,12 +223,26 @@ class SerialTransport(): self.serial.close() def goto_bootloader(self): - self.serial.rts = True - time.sleep(0.1) - self.write(b'\x18\xFF'*10, flush=False) - self.serial.rts = False - ack = self.read(10) - return ack[-6:] == b'\x11'*6 + _cnt = 0 + while _cnt < 50: + time.sleep(0.01) + self.write(b'\x18\xFF'*10, flush=False) + step = _cnt % 20 + if step == 0: + self.serial.rts = True + self.serial.dtr = True + elif step == 10: + self.serial.rts = False + self.serial.dtr = False + elif step > 10: + if self.serial.in_waiting: + ack = self.read(self.serial.in_waiting) + if ack[-6:] == b'\x11'*6: + time.sleep(1) # clear input buffer + self.serial.flushInput() + return True + _cnt += 1 + return False def check_lock(self): self.write(b'\x01\xFC\x0B\x00\x00\x02\x00\x00\x00\x0A') @@ -301,9 +318,11 @@ class SerialTransport(): return self.read(9) == ack def reboot(self): - self.serial.rts = False - time.sleep(0.1) self.serial.rts = True + self.serial.dtr = True + time.sleep(0.2) + self.serial.rts = False + self.serial.dtr = False return True if __name__ == '__main__': @@ -369,7 +388,7 @@ if __name__ == '__main__': sys.stdout.write(".") sys.stdout.flush() _err += 1 - if _err > (args.goboot and 100 or 0): + if _err > (args.goboot and 10 or 0): sys.stdout.write("error\n") sys.exit(1) sys.stdout.write("succ\n")