// 2016.12
//
//** Copyright (C) WCH 2002-2016
// Web: http://WCH.CN **
//
//** DLL for WCH MCU ISP
// C, VC6.0 **
//****************************************
//
// WCH MCU ISP API V1.0
// 江苏沁恒股份有限公司 作者: TECH30 2016.12
// 运行环境: Windows Windows 2000 and later
// support chip: CH55X
//
#ifndef _WCH55XISP_DLL_H
#define _WCH55XISP_DLL_H
#ifdef __cplusplus
extern "C" {
#endif
#define mOFFSET( s, m ) ( (ULONG) & ( ( ( s * ) 0 ) -> m ) ) // 定义获取结构成员相对偏移地址的宏
#ifndef max
#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) // 较大值
#endif
#ifndef min
#define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) // 较小值
#endif
#define MAX_ISPDEV_NUM 16
//MCU类型
#define MCU_CH55X 0
#define MCU_CH56X 1
#define MCU_CH54X 2
#define MCU_CH57X 3
#define MCU_CH32F1X 4
#define MCU_CH32V1X 5
#define MCU_CH58X 6
#define MCU_CH32V3X 7
#define MCU_CH32F2X 8
#define MCU_CH32V2X 9
typedef VOID ( CALLBACK * mPCH55X_USB_NOTIFY_ROUTINE ) ( // 设备事件通知回调程序
ULONG iEventStatus, // 设备事件和当前状态(在下行定义): 0=设备拔出事件, 3=设备插入事件
ULONG DevIndexArray, //插入或移除的设备序号
ULONG DevCnt); //当前设备总数
#define InforType_Succ 0
#define InforType_Err 1
#define InforType_Hit 2
typedef VOID ( CALLBACK * mOutputPrint ) ( // 应用层信息输出函数
UCHAR InforType,WCHAR *DataStr);
typedef VOID ( CALLBACK * mAppendPrint ) ( // 应用层信息追加输出函数
ULONG LineNo,WCHAR *DataStr);
typedef VOID ( CALLBACK * mPCH55X_USB_NOTIFY_ROUTINE ) ( // 设备事件通知回调程序
ULONG iEventStatus, // 设备事件和当前状态(在下行定义): 0=设备拔出事件, 3=设备插入事件
ULONG DevIndexArray, //插入或移除的设备序号
ULONG DevCnt); //当前设备总数
#pragma pack(1) //强制将下面#pragma pack(1) ...#pragma pack之间的结构定义为1字节对齐,传送scsi命令要8字节对齐(默认8字节).
typedef struct _CHIP_INFOEX {
TCHAR ChipName[16];
UINT FlashMaxSize;
UINT EepromMaxSize;
BOOL IsNetworkDownloadAvailable;
BOOL IsUsbDownloadAvailable;
BOOL IsSerialDownloadAvailable;
UCHAR DeviceType;
LIST_ENTRY listEntry;
UCHAR ChipId;
USHORT EepromStartAddr;
TCHAR Introduction[256];
TCHAR IntroductionEn[256];
}CHIP_INFOEX, *PCHIP_INFOEX;
//ISP下载设备结构信息
typedef struct _ISP55XDEVICEINFOR
{
ULONG Index; //枚举后的设备序号
UCHAR McuType; //芯片型号
BOOL IsSupportUID; //MCU是否支持获取UID,较早版本不支持UID获取
UCHAR IspVer[4]; //ISP版本
UCHAR IspMcuUID[8]; //MCU唯一ID
CHAR PortName[32]; //串口设备名,只有串口下载时才有值
BOOL DevIsOnline; //设备是否连接上该串口,只在串口下载时有用
BOOL IsCoolBoot; //是否是上电进行BOOT。如果不是,则不能修改配置位
UCHAR MacAddr[6];
BOOL IsPreBTV230;
}Isp55xDevInforS,PIsp55xDevInforS;
//ISP下载设备设置
typedef struct _CH55xISPSETTING
{
ULONG IspInter face; //下载接口类型 0:USB,1:串口 2:网口
UCHAR IspMcuType; //芯片型号,芯片型号的最后两位,如CH563,则写0x63
UCHAR IspMcuSeries; //芯片系列 0:CH55X;1:CH56X
BOOL IsEnableLongRest; //使能上电复位期间的额外延时复位
BOOL IsXtOscStrong; //启用晶体振荡器增强对外驱动能力,CH554不支持
BOOL IsEnableResetPin; //指定手工复位输入引脚,CH554使用RST引脚,其他型号指定P5.7
BOOL IsEnableP0PullUp; //使能系统复位期间P0端口的内部上拉电阻,CH554不支持
BOOL IsMcuResetAfterIsp; //下载完成后是否复位直接运行目标程序(只支持网络模式)
BOOL IsEnableCfgBuf64K;
BOOL EnableIce; //CH55X,CH32FX复用为串口一键下载功能
BOOL EnableBootLoader;
BOOL IsSetNetDevMac;
UCHAR NetDevMacAddr[6]; //CH58X时,第一字节用来记录写保护块数
BOOL IsCodeProtect; //启用代码保护
BOOL IsFirstRunIAP; //上电后运行IAP
BOOL IsEnableIAP; //是否启用IAP
ULONG IAPStartAddr; //IAP起始地址
CHAR UserFileName[MAX_PATH]; //用户文件名
CHAR IapFileName[MAX_PATH]; //IAP文件名
CHAR DataFileName[MAX_PATH]; //Dataflash文件名
BOOL IsNoKeyDnAtSer; //界面,开启串口免铵键下载
UCHAR BootPinNum; //ISP下载配置脚
BOOL IsClearDataFlash; //清空DataFlash
转换成易语言
BOOL IsEnableUsbPnpNotify; //是否启用USB插拔通知
BOOL IsEraseAllCFlash;
BOOL IsEraseAllDFlash;
mPCH55X_USB_NOTIFY_ROUTINE UsbPnpNotifyRoutine; //插拔通知回调函数
ULONG LocalIP; //本地ISP IP地址
ULONG GatewayIP;
ULONG MaskIP;
BOOL IsSetDevIP;
ULONG dwDevIP;
mOutputPrint AppOutput; //应用程序信息打印函数
mAppendPrint AppAppendOutput; //应用程序信息追加打印函数
BOOL UILangIsCH; //中英文
UCHAR LV_RST_VOL; //门限电压
BOOL IsSimulat; //两线仿真调试接口使能
BOOL IsBootLoader; //引导程序使能
BOOL IsPorCtr;
BOOL IsUsbdPu;
BOOL IsUsbdMode;
BOOL IsStandbyRst;
BOOL IsStopRst;
BOOL IsIwdgSw;
UCHAR WPR_DATA[8];
BOOL IsEnLockup;
BOOL IsEnOutReset;
BOOL IsEnDebug;
UCHAR UserMem; //CH543作为LDO输出电压参数
UCHAR Baud[4];
}CH55xIspOptionS,PCH55xIspOptionS;
#pragma pack()
#define CH375_DEVICE_ARRIVAL 3 // 设备插入事件,已经插入
#define CH375_DEVICE_REMOVE 0 // 设备拔出事件,已经拔出
//CH55X ISP函数
/
USB下载可以实现插入后自动下载和一次多个设备下载
USB下载使用步骤:
1.设置ISP下载设置,设置下载接口,芯片型号,必须在所有操作前设置
WCH55x_SetIspOption,设置ISP下载设置
需要在插入时自动下载,需提前设置:CH55xIspOptionS->IsEnableUsbPnpNotify
2.通过USB搜索ISP下载设备,返回枚举的设备数,将返回的IspDevInfor设备数组信息保存
WCH55x_EnumDevices
3.将目标文件数据写入到mcu flash内,需指定设备序号
WCH55x_FlashProgram
串口下载,可以实现插入某个串口后自动下载
串口下载使用步骤
1.WCH55x_SetIspOption
设置ISP下载设置,设置下载接口,芯片型号,必须在所有操作前设置
2.WCH55x_EnumDevices
IspOption->IspInterface = 1:串口下载方式时,此函数将执行枚举电脑上所有的串口,返回枚举的串口数,将返回的IspDevInfor设备数组信息保存
3.WCH55x_GetIspDeviceInfor
下载前必须调用WCH55x_GetIspDeviceInfor函数去获取指定设备的信息,是否在线,芯片UID等。因为串口不支持即插即用,只能手工获取。
IspDevInfor->DevIsOnline=TRUE,表示已检测到设备已连接至该接口
4.将目标文件数据写入到mcu flash内,需指定设备序号
WCH55x_FlashProgram
/
//IspOption->IspInterface = 0:USB下载方式时,此函数将执行通过USB搜索ISP下载设备,返回枚举的设备数
//IspOption->IspInterface = 1:串口下载方式时,此函数将执行枚举电脑上所有的串口,返回枚举的串口数
//获取指定序号设备信息
BOOL WINAPI WCH55x_GetIspDeviceInfor(ULONG iIndex, //指定序号设备信息
PIsp55xDevInforS IspDevInfor);//设备信息
//设置ISP下载设置Ex
BOOL WINAPI WCH55x_SetIspOption(CH55xIspOptionS *IspOption);//ISP选项
//获取ISP下载设置
BOOL WINAPI WCH55x_GetIspOption(CH55xIspOptionS *IspOption); //ISP选项
//USB接口写EEPROM数据
BOOL WCH55x_WriteDataFlash(ULONG iIndex, //设备序号
ULONG StartAddr, //起始地址
ULONG *oWriteLen, //写入长度
PUCHAR DataBuf, //数据缓冲区
BOOL bIsErase);
//USB接口读EEPROM数据
BOOL WCH55x_ReadDataFlash(ULONG iIndex, //设备序号
ULONG StartAddr, //起始地址
ULONG *oReadLen, //写入长度
PUCHAR DataBuf); //数据缓冲区)
BOOL WINAPI WCH55xIsp_ReadConfig(ULONG DevI,
PUCHAR IapCfgVal, //4字节
PUCHAR IspCfgVal, //4字节
PUCHAR CFlashCfgVal, //4字节
PULONG BootVer,
PUCHAR UUID);
//取消操作
VOID WCH55x_StopOp();
//通过USB搜索ISP下载设备,返回枚举的设备数。旧版BTV230,只支持一个设备枚举
ULONG WINAPI WCH55x_EnumDevices(Isp55xDevInforS *IspDevInfor, //IspDevInfor:设备信息数组
UCHAR MaxDevCnt, //最大扫描设备数