#!/usr/bin/env python3 import os, sys, time, struct import serial import serial.tools.list_ports import argparse # XHSC ISP V2.21 version = "2.21" HDSC = { 'HC32A136': { 'MCUName': "HC32A136", 'FrequecyList': ["1000000", "256000", "128000", "115200", "76800", "38400", "19200", "9600"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "128", 'FlashSize': "64K", 'BootloaderBaudrate': 9600, 'RamCodeBinFile': "m_flash.hc006", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA09/PA14)<---> Serial.RXD MCU.RXD(PA10/PA13)<---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32A448': { 'MCUName': "HC32A448", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "32", 'FlashSize': "256K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc032", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13) <---> Serial.RXD MCU.RXD(PA14) <---> Serial.TXD MCU.RESET <---> Serial.RTS/DTR MCU.MODE <---> MCU.VCC """, }, 'HC32A460': { 'MCUName': "HC32A460", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "64", 'FlashSize': "512K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc010", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13) <---> Serial.RXD MCU.RXD(PA14) <---> Serial.TXD MCU.RESET <---> Serial.RTS/DTR MCU.MODE <---> MCU.GND """, }, 'HC32A472xExx': { 'MCUName': "HC32A472xExx", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "64", 'FlashSize': "512K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc021", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA2,PA9 ,PA13) <---> Serial.RXD MCU.RXD(PA3,PA10,PA14) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32A4A0': { 'MCUName': "HC32A4A0", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "256", 'FlashSize': "2M", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc020", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13,PB10) <---> Serial.RXD MCU.RXD(PA14,PB11) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32A4A8': { 'MCUName': "HC32A4A8", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "256", 'FlashSize': "2M", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc037", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13,PB10) <---> Serial.RXD MCU.RXD(PA14,PB11) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32D391': { 'MCUName': "HC32D391", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "64", 'FlashSize': "512K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc010", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13) <---> Serial.RXD MCU.RXD(PA14) <---> Serial.TXD MCU.MODE <---> MCU.GND """, }, 'HC32F002x4xx': { 'MCUName': "HC32F002x4xx", 'FrequecyList': ["1000000", "256000", "128000", "115200", "76800", "38400"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "36", 'FlashSize': "18K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc008", 'WritePacketSize': 240, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PD01) <---> Serial.RXD MCU.RXD(PC07) <---> Serial.TXD MCU.RSTB <---> Serial.RTS/DTR """, }, 'HC32F052/HC32A052': { 'MCUName': "HC32F052/HC32A052", 'FrequecyList': ["500000", "250000", "115200", "76800", "38400", "19200"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "256", 'FlashSize': "128K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc008", 'WritePacketSize': 240, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA14) <---> Serial.RXD MCU.RXD(PA13) <---> Serial.TXD MCU.BOOT0 <---> MCU.VCC """, }, 'HC32F115': { 'MCUName': "HC32F115", 'FrequecyList': ["500000"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "128", 'FlashSize': "64K", 'BootloaderBaudrate': 500000, 'RamCodeBinFile': "m_flash.hc041", 'WritePacketSize': 512, 'IspConnection': """请确认XHLink的连接: J6.ISP <---> J6.GND J6.3V3 <---> J6.VCC 请确认目标芯片与XHLink的连接: 半双工: MCU.VCC <---> XHLink.3V3 MCU.GND <---> XHLink.GND MCU.RST <---> XHLink.RST MCU.TOOL0(P40) <---> XHLink.DIO 全双工: MCU.VCC <---> XHLink.3V3 MCU.GND <---> XHLink.GND MCU.RST <---> XHLink.RST MCU.TOOL0(P40) <---> XHLink.DIO MCU.TOOLTxD(P12) <---> XHLink.RX MCU.TOOLRxD(P11) <---> XHLink.TX """, }, 'HC32F120': { 'MCUName': "HC32F120", 'FrequecyList': ["1000000"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "128", 'FlashSize': "64K", 'BootloaderBaudrate': 1000000, 'RamCodeBinFile': "m_flash.hc012", 'WritePacketSize': 512, 'IspConnection': """请确认目标芯片与转接板的连接: 半双工:VCC,GND,TOOL0,NRST 全双工:VCC,GND,TXD,RXD,TOOL0,NRST """, }, 'HC32F146x8/HC32M140x8': { 'MCUName': "HC32F146x8/HC32M140x8", 'FrequecyList': ["{", "Internal CR", "4MHz", "6MHz", "8MHz", "10MHz", "12MHz", "16MHz", "18MHz", "20MHz", "24MHz", "32MHz"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "128", 'FlashSize': "64K", 'BootloaderBaudrate': 9600, 'RamCodeBinFile': "m_flash.hc001", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(P11) <---> Serial.RXD MCU.RXD(P12) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32F146xA/HC32M140xA': { 'MCUName': "HC32F146xA/HC32M140xA", 'FrequecyList': ["{", "Internal CR", "4MHz", "6MHz", "8MHz", "10MHz", "12MHz", "16MHz", "18MHz", "20MHz", "24MHz", "32MHz"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "256", 'FlashSize': "128K", 'BootloaderBaudrate': 9600, 'RamCodeBinFile': "m_flash.hc001", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(P11) <---> Serial.RXD MCU.RXD(P12) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32F155': { 'MCUName': "HC32F155", 'FrequecyList': ["500000"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "512", 'FlashSize': "256K", 'BootloaderBaudrate': 500000, 'RamCodeBinFile': "m_flash.hc042", 'WritePacketSize': 512, 'IspConnection': """请确认XHLink的连接: J6.ISP <---> J6.GND J6.3V3 <---> J6.VCC 请确认目标芯片与XHLink的连接: 半双工: MCU.VCC <---> XHLink.3V3 MCU.GND <---> XHLink.GND MCU.RST <---> XHLink.RST MCU.TOOL0(P40) <---> XHLink.DIO 全双工: MCU.VCC <---> XHLink.3V3 MCU.GND <---> XHLink.GND MCU.RST <---> XHLink.RST MCU.TOOL0(P40) <---> XHLink.DIO MCU.TOOLTxD(P12)/SWDIO(P51) <---> XHLink.RX MCU.TOOLRxD(P11)/SWCLK(P50) <---> XHLink.TX """, }, 'HC32F160xAxx': { 'MCUName': "HC32F160xAxx", 'FrequecyList': ["1000000", "115200"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "258", 'FlashSize': "129K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc023", 'WritePacketSize': 512, 'IspConnection': """请确认目标芯片与XHSC DAP的连接: UART单线: | UART双线: MCU.VCC <---> DAP.VCC | MCU.VCC <---> DAP.VCC MCU.GND <---> DAP.GND | MCU.GND <---> DAP.GND MCU.TOOL0(P40) <---> DAP.DIO(TOOL0) | MCU.TOOL0(P40) <---> DAP.DIO(TOOL0) MCU.RST <---> DAP.RST | MCU.RST <---> DAP.RST DAP.ISP <---> DAP.GND | MCU.TOOLRxD(P11) <---> DAP.TX | MCU.TOOLTxD(P12) <---> DAP.RX | DAP.ISP <---> DAP.GND""", }, 'HC32F160xCxx': { 'MCUName': "HC32F160xCxx", 'FrequecyList': ["1000000", "115200"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "514", 'FlashSize': "257K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc023", 'WritePacketSize': 512, 'IspConnection': """请确认目标芯片与XHSC DAP的连接: UART单线: | UART双线: MCU.VCC <---> DAP.VCC | MCU.VCC <---> DAP.VCC MCU.GND <---> DAP.GND | MCU.GND <---> DAP.GND MCU.TOOL0(P40) <---> DAP.DIO(TOOL0) | MCU.TOOL0(P40) <---> DAP.DIO(TOOL0) MCU.RST <---> DAP.RST | MCU.RST <---> DAP.RST DAP.ISP <---> DAP.GND | MCU.TOOLRxD(P11) <---> DAP.TX | MCU.TOOLTxD(P12) <---> DAP.RX | DAP.ISP <---> DAP.GND""", }, 'HC32F334x8xx': { 'MCUName': "HC32F334x8xx", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "4096", 'PageCount': "16", 'FlashSize': "64K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc039", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA2,PA9 ,PA13) <---> Serial.RXD MCU.RXD(PA3,PA10,PA14) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32F334xAxx': { 'MCUName': "HC32F334xAxx", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "4096", 'PageCount': "32", 'FlashSize': "128K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc039", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA2,PA9 ,PA13) <---> Serial.RXD MCU.RXD(PA3,PA10,PA14) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32F420': { 'MCUName': "HC32F420", 'FrequecyList': ["1000000", "500000", "250000", "115200", "76800", "38400", "19200"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "256", 'FlashSize': "128K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc008", 'WritePacketSize': 240, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA14) <---> Serial.RXD MCU.RXD(PA13) <---> Serial.TXD MCU.BOOT0 <---> MCU.VCC """, }, 'HC32F448xAxx/HC32M441xAxx': { 'MCUName': "HC32F448xAxx/HC32M441xAxx", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "16", 'FlashSize': "128K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc032", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13) <---> Serial.RXD MCU.RXD(PA14) <---> Serial.TXD MCU.RESET <---> Serial.RTS/DTR MCU.MODE <---> MCU.VCC """, }, 'HC32F448xCxx/HC32M441xCxx': { 'MCUName': "HC32F448xCxx/HC32M441xCxx", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "32", 'FlashSize': "256K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc032", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13) <---> Serial.RXD MCU.RXD(PA14) <---> Serial.TXD MCU.RESET <---> Serial.RTS/DTR MCU.MODE <---> MCU.VCC """, }, 'HC32F460xCxx': { 'MCUName': "HC32F460xCxx", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "32", 'FlashSize': "256K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc010", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13) <---> Serial.RXD MCU.RXD(PA14) <---> Serial.TXD MCU.RESET <---> Serial.RTS/DTR MCU.MODE <---> MCU.GND """, }, 'HC32F460xExx/HC32F45xxExx': { 'MCUName': "HC32F460xExx/HC32F45xxExx", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "64", 'FlashSize': "512K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc010", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13) <---> Serial.RXD MCU.RXD(PA14) <---> Serial.TXD MCU.RESET <---> Serial.RTS/DTR MCU.MODE <---> MCU.GND """, }, 'HC32F467': { 'MCUName': "HC32F467", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "128", 'FlashSize': "1M", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc467", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13,PB10) <---> Serial.RXD MCU.RXD(PA14,PB11) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32F472xCxx': { 'MCUName': "HC32F472xCxx", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "32", 'FlashSize': "256K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc021", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA2,PA9 ,PA13) <---> Serial.RXD MCU.RXD(PA3,PA10,PA14) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32F472xExx': { 'MCUName': "HC32F472xExx", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "64", 'FlashSize': "512K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc021", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA2,PA9 ,PA13) <---> Serial.RXD MCU.RXD(PA3,PA10,PA14) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32F4A0xGxx': { 'MCUName': "HC32F4A0xGxx", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "128", 'FlashSize': "1M", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc020", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13,PB10) <---> Serial.RXD MCU.RXD(PA14,PB11) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32F4A8': { 'MCUName': "HC32F4A8", 'FrequecyList': ["1000000", "500000", "256000", "128000", "115200"], 'StartAddress': "00000000", 'PageSize': "8192", 'PageCount': "256", 'FlashSize': "2M", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc037", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA13,PB10) <---> Serial.RXD MCU.RXD(PA14,PB11) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32IV01J8TA': { 'MCUName': "HC32IV01J8TA", 'FrequecyList': ["1000000", "256000", "128000", "115200", "76800", "38400", "19200", "9600"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "128", 'FlashSize': "64K", 'BootloaderBaudrate': 9600, 'RamCodeBinFile': "m_flash.hc006", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA09/PA14)<---> Serial.RXD MCU.RXD(PA10/PA13)<---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32L021': { 'MCUName': "HC32L021", 'FrequecyList': ["1000000", "250000", "115200", "76800", "57600", "38400", "19200"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "128", 'FlashSize': "64", 'BootloaderBaudrate': 250000, 'RamCodeBinFile': "m_flash.hc048", 'WritePacketSize': 160, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA14) <---> Serial.RXD MCU.RXD(PA13) <---> Serial.TXD MCU.RSTB <---> Serial.RTS/DTR """, }, 'HC32L021x8xx': { 'MCUName': "HC32L021x8xx", 'FrequecyList': ["1500000", "1000000", "128000", "115200", "76800", "38400"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "128", 'FlashSize': "64K", 'BootloaderBaudrate': 100000, 'RamCodeBinFile': "m_flash.hc008", 'WritePacketSize': 240, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PD01) <---> Serial.RXD MCU.RXD(PC07) <---> Serial.TXD MCU.RSTB <---> Serial.RTS/DTR """, }, 'HC32L031': { 'MCUName': "HC32L031", 'FrequecyList': ["2000000", "1000000", "260000", "128000", "115200", "76800", "57600", "38400", "19200", "9600"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "128", 'FlashSize': "64", 'BootloaderBaudrate': 1000000, 'RamCodeBinFile': "m_flash.hc050", 'WritePacketSize': 160, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA14) <---> Serial.RXD MCU.RXD(PA13) <---> Serial.TXD MCU.RSTB <---> Serial.RTS/DTR """, }, 'HC32L110x4xx/HC32F003x4xx': { 'MCUName': "HC32L110x4xx/HC32F003x4xx", 'FrequecyList': ["691200", "230400", "115200", "38400", "19200", "9600"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "32", 'FlashSize': "16K", 'BootloaderBaudrate': 9600, 'RamCodeBinFile': "m_flash.hc005", 'WritePacketSize': 64, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(P31/P35) <---> Serial.RXD MCU.RXD(P27/P36) <---> Serial.TXD MCU.RESET <---> Serial.RTS/DTR """, }, 'HC32L110x6xx/HC32F005x6xx': { 'MCUName': "HC32L110x6xx/HC32F005x6xx", 'FrequecyList': ["691200", "460800", "230400", "115200", "38400", "19200", "9600"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "64", 'FlashSize': "32K", 'BootloaderBaudrate': 9600, 'RamCodeBinFile': "m_flash.hc005", 'WritePacketSize': 64, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(P31/P35) <---> Serial.RXD MCU.RXD(P27/P36) <---> Serial.TXD MCU.RESET <---> Serial.RTS/DTR """, }, 'HC32L12xxAxx': { 'MCUName': "HC32L12xxAxx", 'FrequecyList': ["2000000", "1500000", "1000000", "500000", "250000", "115200", "19200"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "256", 'FlashSize': "128K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc008", 'WritePacketSize': 240, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA14) <---> Serial.RXD MCU.RXD(PA13) <---> Serial.TXD MCU.BOOT0(PD03) <---> MCU.VCC """, }, 'HC32L13xx8/HC32F030x8': { 'MCUName': "HC32L13xx8/HC32F030x8", 'FrequecyList': ["1000000", "256000", "128000", "115200", "76800", "38400", "19200", "9600"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "128", 'FlashSize': "64K", 'BootloaderBaudrate': 9600, 'RamCodeBinFile': "m_flash.hc006", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA09/PA14)<---> Serial.RXD MCU.RXD(PA10/PA13)<---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32L15xx8': { 'MCUName': "HC32L15xx8", 'FrequecyList': ["{", "Internal CR", "4MHz", "6MHz", "8MHz", "10MHz", "12MHz", "16MHz", "18MHz", "20MHz", "24MHz", "32MHz"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "128", 'FlashSize': "64K", 'BootloaderBaudrate': 9600, 'RamCodeBinFile': "m_flash.hc001", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(P12) <---> Serial.RXD MCU.RXD(P11) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32L15xxA': { 'MCUName': "HC32L15xxA", 'FrequecyList': ["{", "Internal CR", "4MHz", "6MHz", "8MHz", "10MHz", "12MHz", "16MHz", "18MHz", "20MHz", "24MHz", "32MHz"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "256", 'FlashSize': "128K", 'BootloaderBaudrate': 9600, 'RamCodeBinFile': "m_flash.hc001", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(P12) <---> Serial.RXD MCU.RXD(P11) <---> Serial.TXD MCU.MODE <---> MCU.VCC """, }, 'HC32L18xxAxx/HC32L16xxAxx': { 'MCUName': "HC32L18xxAxx/HC32L16xxAxx", 'FrequecyList': ["1000000", "256000", "128000", "115200", "76800", "38400", "19200"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "256", 'FlashSize': "128K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc008", 'WritePacketSize': 240, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.SWCLK(PA14) <---> Serial.RXD MCU.SWDIO(PA13) <---> Serial.TXD MCU.BOOT0 <---> MCU.VCC """, }, 'HC32L18xxCxx/HC32L16xxCxx': { 'MCUName': "HC32L18xxCxx/HC32L16xxCxx", 'FrequecyList': ["1000000", "256000", "128000", "115200", "76800", "38400", "19200"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "512", 'FlashSize': "256K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc008", 'WritePacketSize': 240, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.SWCLK(PA14) <---> Serial.RXD MCU.SWDIO(PA13) <---> Serial.TXD MCU.BOOT0 <---> MCU.VCC """, }, 'HC32M120': { 'MCUName': "HC32M120", 'FrequecyList': ["1000000"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "64", 'FlashSize': "32K", 'BootloaderBaudrate': 1000000, 'RamCodeBinFile': "m_flash.hc013", 'WritePacketSize': 512, 'IspConnection': """请确认目标芯片与转接板的连接: 半双工:VCC,GND,TOOL0,NRST 全双工:VCC,GND,TXD,RXD,TOOL0,NRST """, }, 'HC32M423xAxx': { 'MCUName': "HC32M423xAxx", 'FrequecyList': ["1000000", "115200"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "256", 'FlashSize': "128K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc017", 'WritePacketSize': 512, 'IspConnection': """请确认目标芯片与XHSC DAP的连接: UART单线: | UART双线: MCU.VCC <---> DAP.VCC | MCU.VCC <---> DAP.VCC MCU.GND <---> DAP.GND | MCU.GND <---> DAP.GND MCU.TOOL0(P50) <---> DAP.DIO(TOOL0) | MCU.TOOL0(P50) <---> DAP.DIO(TOOL0) MCU.RST <---> DAP.RST | MCU.RST <---> DAP.RST DAP.ISP <---> DAP.GND | MCU.SWDCLK(PB1) <---> DAP.TX | MCU.SWDIO(PB2) <---> DAP.RX | DAP.ISP <---> DAP.GND""", }, 'HC32x07xxAxx/HC32x17xxAxx': { 'MCUName': "HC32x07xxAxx/HC32x17xxAxx", 'FrequecyList': ["1000000", "256000", "128000", "115200", "76800", "38400", "19200"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "256", 'FlashSize': "128K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc008", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA14) <---> Serial.RXD MCU.RXD(PA13) <---> Serial.TXD MCU.BOOT0 <---> MCU.VCC """, }, 'HC32x19xxCxx': { 'MCUName': "HC32x19xxCxx", 'FrequecyList': ["1000000", "256000", "128000", "115200", "76800", "38400", "19200"], 'StartAddress': "00000000", 'PageSize': "512", 'PageCount': "512", 'FlashSize': "256K", 'BootloaderBaudrate': 115200, 'RamCodeBinFile': "m_flash.hc015", 'WritePacketSize': 512, 'IspConnection': """MCU.VCC <---> Serial.VCC MCU.GND <---> Serial.GND MCU.TXD(PA14) <---> Serial.RXD MCU.RXD(PA13) <---> Serial.TXD MCU.BOOT0 <---> MCU.VCC """, }, } class TransportError(Exception): """Custom exception to represent errors with a transport """ def __init__(self, message): self.message = message def __str__(self): return self.message class SerialTransport(): def __init__(self, port, baud, dir1=False): if not port: _ports = serial.tools.list_ports.comports() if len(_ports): port = _ports[-1].device self.serial = None try: self.serial = serial.Serial(port, baud) except serial.SerialException as e: raise TransportError(str(e)) from None self.SET = dir1 self.RESET = (not dir1) self.serial.rts = self.SET self.serial.dtr = self.SET self.serial.rts = self.RESET self.serial.dtr = self.RESET self.serial.timeout = 1 self.serial.write_timeout = None def init_baud(self, baud): self.serial.baudrate = baud def write(self, data, flush=True): if self.serial.inWaiting() > 0: self.serial.flushInput() cnt = self.serial.write(data) if flush: self.serial.flush() return cnt def read(self, length): return self.serial.read(length) def close(self): self.serial.flush() self.serial.close() def goto_bootloader(self): self.serial.rts = self.RESET self.serial.dtr = self.RESET time.sleep(0.5) self.write(b'\x18\xFF'*100, flush=False) self.serial.rts = self.SET self.serial.dtr = self.SET self.write(b'\x18\xFF'*10, flush=False) time.sleep(0.5) if self.serial.in_waiting: ack = self.read(self.serial.in_waiting) if ack[-3:] == b'\x11'*3: time.sleep(2) # clear input buffer self.serial.flushInput() return True return False def wait_bootloader(self): for x in range(10): self.write(b'\x18\xFF'*50, flush=False) time.sleep(0.1) if self.serial.in_waiting: ack = self.read(self.serial.in_waiting) if ack[-3:] == b'\x11'*3: self.serial.flushInput() return True return False def check_lock(self): self.write(b'\x01\xFC\x0B\x00\x00\x02\x00\x00\x00\x0A') ack = self.read(5) if len(ack)==5 and ack[:2]==b'\x01\x02': return ack[2:4] != b'\xFF\xFF' return None def unlock(self): self.write(b'\xB5\x34\x84\x52\xBF') return self.read(1) == b'\x01' def load_ramcode(self, _f, tryCnt=50): with open(_f, "rb") as fr: dat = fr.read() fr.close() size = len(dat) addr = 0x20000000 pkg = struct.pack(' 0: time.sleep(0.1) tryCnt -= 1 return tryCnt > 0 return False def run_ramcode(self): self.write(b'\xC0\x00\x00\x00\x00\x00\x00\x00\x00\xC0') return repr(self.read(11)) def ramcode_api(self, cmd, addr, dat, size=0): size = size or len(dat) pkg = bytes([0x49,cmd]) + struct.pack('1: for m in matches: prefix_len = 0 for i in range(min(len(input_upper), len(m))): if input_upper[i] != m[i]: break prefix_len += 1 if prefix_len > match_cnt: best_match, match_cnt = m, prefix_len return candidates[best_match] if best_match else candidates[matches[0]] if __name__ == '__main__': # parse arguments or use defaults parser = argparse.ArgumentParser(description='HC32xx Flash Downloader.') parser.add_argument('-l', '--list', action='store_true', help='List support device') parser.add_argument('-d', metavar=' device', default='HC32F003', help='Device name, default HC32F003') parser.add_argument('-p', metavar=' port', default='', help='Serial port, default serial[-1]') parser.add_argument('-b', metavar=' baudrate',type=int,default=0, help='Serial baudrate') parser.add_argument('-u', '--unlock', action='store_true', help='Unlock. Erase device when locked') parser.add_argument('-L', '--lock', action='store_true', help='Lock. SWD port disabled') parser.add_argument('-R', '--reboot', action='store_true', help='Reboot device') parser.add_argument('-e', '--erase', action='store_true', help='Erase device') parser.add_argument('-G', '--goboot', action='store_true', help='Goto bootloader') parser.add_argument('-D', '--dir1', action='store_true', help='RTS/DTR output 1 for reset') parser.add_argument('-w', metavar='', help='Write data from file to device') parser.add_argument('-r', metavar='', help='Read data from device to file') parser.add_argument('-v', metavar='', help='Verify chksum data in device against file') args = parser.parse_args() args.dev,args.port,args.baud = args.d,args.p,args.b args.rfile,args.wfile,args.vfile = args.r,args.w,args.v # check device matched_device = find_device_simple(args.dev, list(HDSC.keys())) if not matched_device: sys.stdout.write("Invalid Device name '%s'.\n\nList of support device:\n" % args.dev) args.list = True else: args.dev = matched_device if args.list: for dev in HDSC.keys(): sys.stdout.write("%-28s %-8s %s\n" % (dev, HDSC[dev]['FlashSize'], HDSC[dev]['BootloaderBaudrate'])) sys.exit(0) # mcu info hc32xx = HDSC[args.dev] args.baud = args.baud or hc32xx['BootloaderBaudrate'] transport = SerialTransport(args.port, hc32xx['BootloaderBaudrate'], dir1=args.dir1) sys.stdout.write('Device: %s\n' % args.dev) sys.stdout.write('Serial: %s\n' % transport.serial.port) sys.stdout.write('Boot Baud: %s\n' % args.baud) sys.stdout.write('Page Size: %s\n' % hc32xx['PageSize']) sys.stdout.write('Page Count: %s\n' % hc32xx['PageCount']) sys.stdout.write('Flash Size: %s\n' % hc32xx['FlashSize']) sys.stdout.write('RameCode: %s\n' % hc32xx['RamCodeBinFile']) sys.stdout.write('\n%s\n' % hc32xx['IspConnection']) # global vars base_dir = os.path.dirname(os.path.realpath(__file__)) if not args.goboot and args.reboot: sys.stdout.write("[REBOOT] %s\n" % (transport.reboot() and 'ok' or 'error')) transport.close() sys.exit(0) # stage 1. goto bootloader sys.stdout.write("Stage 1. Goto bootloader: ") sys.stdout.flush() _err = 0 if not args.goboot: # 需手动进入复位 sys.stdout.write("wait press reset key ") sys.stdout.flush() while not transport.wait_bootloader(): sys.stdout.write(".") sys.stdout.flush() _err += 1 if _err > 30: # 等待最多30s sys.stdout.write("error\n") sys.exit(1) # 使用控制脚自动进入复位 while not transport.goto_bootloader(): sys.stdout.write("+") sys.stdout.flush() _err += 1 if _err > (args.goboot and 30 or 0): sys.stdout.write("error\n") sys.exit(1) sys.stdout.write("succ\n") # state 2. Check device sys.stdout.write("Stage 2. Check device: ") if transport.check_lock(): if args.unlock and transport.unlock(): sys.stdout.write("unlock\n") else: sys.stdout.write("%s\n" % (args.unlock and "unlock failed" or "locked")) sys.exit(1) else: sys.stdout.write("pass\n") # stage 3. load ramcode sys.stdout.write("Stage 3. Load ramcode: ") sys.stdout.flush() _f = os.path.join(base_dir, 'hdsc', 'XHSC.'+hc32xx['RamCodeBinFile']) if transport.load_ramcode(_f): sys.stdout.write("%s\n" % hc32xx['RamCodeBinFile']) else: sys.stdout.write("error\n") sys.exit(1) # stage 4. run ramcode sys.stdout.write("Stage 4. Run ramcode: %s\n" % transport.run_ramcode()) time.sleep(0.5) # delay for boot # stage 5. set baud sys.stdout.write("Stage 5. Set baud: ") if transport.set_baud(args.baud): sys.stdout.write("%s\n\n" % args.baud) transport.init_baud(args.baud) else: sys.stdout.write("error\n") sys.exit(1) def exec_flash(args, transport): # erase device if args.erase or args.wfile: sys.stdout.write("[ ERASE] %s\n" % (transport.flash_erase() and 'ok' or 'error')) # write, with erase if args.wfile: with open(args.wfile, "rb") as fs: sys.stdout.write("[ WRITE] ") psize = int(hc32xx['WritePacketSize']) addr0 = int(hc32xx['StartAddress'], 16) addr = addr0 while True: _last = False dat = fs.read(psize) if len(dat) == 0: _last = True else: if len(dat) < psize: dat = dat + b'\xFF'*(psize-len(dat)) _last = True if transport.flash_write(addr, dat): sys.stdout.write("."); sys.stdout.flush() else: sys.stdout.write("flash write error: 0x%08X\n" % addr) #sys.exit(1) return 1 addr += psize if _last: sys.stdout.write(" ok\n") fs.close() if not args.vfile: args.vfile = args.wfile break return 0 _err = 0 while exec_flash(args, transport) != 0: sys.stdout.write(".") sys.stdout.flush() _err += 1 if _err > (args.goboot and 10 or 0): sys.stdout.write("error\n") sys.exit(1) sys.stdout.write("succ\n") # read to file if args.rfile: with open(args.rfile, "wb") as fs: sys.stdout.write("[ READ ] ") psize = int(hc32xx['PageSize']) pcnt = int(hc32xx['PageCount']) addr0 = int(hc32xx['StartAddress'], 16) addr = addr0 for _ in range(pcnt): dat = transport.flash_read(addr, psize) if not dat: sys.stdout.write("flash read error: 0x%08X\n" % addr) sys.exit(1) else: fs.write(dat) sys.stdout.write("."); sys.stdout.flush() addr += psize sys.stdout.write(" ok\n") fs.close() # verify chksum if args.vfile: with open(args.vfile, "rb") as fs: sys.stdout.write("[VERIFY] ") dat = fs.read() fs.close() ack = transport.flash_verify(len(dat)) chk0,chk1 = sum(dat)&0xFFFF,None if ack: chk1 = struct.unpack('