Bladeren bron

lần đầu upload

bacpx 1 week geleden
bovenliggende
commit
fbdcee2f5e
1 gewijzigde bestanden met toevoegingen van 80 en 0 verwijderingen
  1. 80 0
      crawl_dac_flash_final.py

+ 80 - 0
crawl_dac_flash_final.py

@@ -0,0 +1,80 @@
+import serial
+import time
+
+# --- Cấu hình ---
+PORT = 'COM6'
+BAUD_RATE = 115200
+TIMEOUT = 2
+MAX_ADDR = 0x100000 
+STEP_SIZE = 64
+OUTPUT_FILE = "W25Q80_Main_v1.bin"
+
+def dump_flash_v3_3():
+    try:
+        ser = serial.Serial(PORT, BAUD_RATE, timeout=TIMEOUT)
+        print(f"Kết nối {PORT}...")
+        time.sleep(2)
+        ser.reset_input_buffer()
+        
+        current_addr = 0
+        print(f"--- Bắt đầu Dump v1 (Dựa trên Header Header) ---")
+        
+        with open(OUTPUT_FILE, "wb") as f:
+            while current_addr < MAX_ADDR:
+                # 1. Gửi lệnh
+                cmd = f"mem r {current_addr}\r\n"
+                ser.write(cmd.encode())
+                
+                byte_list = []
+                header_found = False
+                start_t = time.time()
+                
+                # 2. Đọc phản hồi
+                while len(byte_list) < STEP_SIZE and (time.time() - start_t < 2.5):
+                    line = ser.readline().decode('utf-8', errors='ignore').strip()
+                    
+                    if not line:
+                        continue
+                    
+                    # Nếu thấy dòng Header, đánh dấu bắt đầu lấy dữ liệu từ dòng SAU
+                    if "Read flash address" in line:
+                        header_found = True
+                        continue 
+                    
+                    # Chỉ xử lý các dòng nằm SAU dòng Header
+                    if header_found:
+                        # Tách các chuỗi byte (ví dụ: "FF", "08", "03"...)
+                        parts = line.split()
+                        for p in parts:
+                            # Kiểm tra xem có phải là byte hex hợp lệ (2 ký tự)
+                            if len(p) == 2:
+                                try:
+                                    val = int(p, 16)
+                                    byte_list.append(val)
+                                except ValueError:
+                                    continue # Bỏ qua nếu gặp "OK" hoặc rác
+                
+                # 3. Kiểm tra và ghi file
+                if len(byte_list) >= STEP_SIZE:
+                    # Lấy đúng 64 byte đầu tiên tìm thấy sau Header
+                    f.write(bytearray(byte_list[:STEP_SIZE]))
+                    current_addr += STEP_SIZE
+                    
+                    # In tiến độ
+                    if current_addr % 512 == 0:
+                        percent = (current_addr / MAX_ADDR) * 100
+                        print(f"\rTiến độ: {percent:6.2f}% | Addr: {current_addr}", end="")
+                else:
+                    print(f"\n[Lỗi] Không gom đủ 64 byte tại {current_addr} (Chỉ có {len(byte_list)}B). Thử lại...")
+                    ser.reset_input_buffer()
+                    time.sleep(0.5)
+                    # Không tăng current_addr để vòng lặp while thử lại địa chỉ này
+
+        print(f"\n\n--- HOÀN THÀNH ---")
+        ser.close()
+
+    except Exception as e:
+        print(f"\nLỗi hệ thống: {e}")
+
+if __name__ == "__main__":
+    dump_flash_v3_3()