目 录
1 编写目的5
2 术语、定义和缩略语5
2.1 术语、定义 5
2.2 缩略语 5
3 模块描述5
3.1 Flash的特性 5
3.2 Flash的资源划分 5
3.3 MCU 中断的使用方式 5
3.3.1 Cortex-M3内核系列MCU中断向量表重定位6
3.4 MCU复位后的硬件外设初始化 6
4 标准模块6
5 模块设计6
5.1 Flash空间划分 6
5.2 异步事件处理机制 7
5.3 命令处理 7
5.3.1 BL和APP对命令的支持7
6 数据描述7
6.1 数据结构说明 7
6.1.1.1 宏定义 7
6.1.1.1.1 Flash资源 7
6.1.1.1.2 链路层协议 9
6.1.1.2 结构体/联合/枚举 定义 9
6.1.1.2.1 Flash资源 9
6.1.1.2.2 异步事件 10
6.1.1.2.3 链路层协议 10
6.1.1.2.4 命令实现 11
6.2 全局变量说明 12
6.3 数据库说明 12
7 函数定义12
7.1 引用函数定义 12
7.2 内部函数定义 13
7.2.1 链路层协议13
7.2.1.1 Mid_Tul_CheckCrc16 13
7.2.1.2 Mid_Tul_CheckTulLengthField 13
7.2.1.3 Mid_Tul_GetCmdFunc 13
7.2.1.4 Mid_Tul_GetCmdFuncTableAddr 13
8 接口设计13
8.1 用户接口 13
8.1.1 Flash资源13
8.1.1.1 Drv_Flash_AppChecksum_GetChecksumInfo 13
8.1.1.2 Drv_Flash_AppChecksum_UpdataChecksumInfo 14
8.1.1.3 Drv_Flash_FlagOpt_GetFlagInfo 14
8.1.1.4 Drv_Flash_FlagOpt_SetFlagInfo 14
8.1.2 异步事件14
8.1.2.1 App_SysEvt_SetEventFlag 14
8.1.2.2 App_SysEvt_GetEventFlag 14
8.1.3 链路层协议15
8.1.3.1 Mdi_Tul_UpperLayerCmdAnalysis 15
8.1.4 命令实现15
8.1.4.1 App_TulIap_CheckRunSpace 15
8.1.4.2 App_TulIap_ModifyRunSpace 15
8.1.4.3 App_TulIap_CheckObligateVersionFileSize 15
8.1.4.4 App_TulIap_TransmitVersionFile 16
8.1.4.5 App_TulIap_TransmitVersionFilePara 16
8.2 硬件接口 16
8.2.1 Flash资源16
8.2.1.1 Drv_Flash_InitialPara 16
8.2.1.2 Drv_Flash_ErasePagesWrite 16
8.2.1.3 Drv_Flash_Read 16
8.2.1.4 Drv_Flash_EraseVersionFileSpace 17
8.2.1.5 Drv_Flash_UpdataVersionFileSpace 17
8.2.1.6 Drv_Flash_Test_ReadWrite(Test Condition) 17
8.3 软件接口 17
8.3.1 规范接口17
8.3.2 非规范接口17
9 其它说明17
10 参考资料17
1
编写目的
本文档的编写目的在于详细的说明IAP在线升级模块中的设计思路以及实现细节,以利于后续程序员参考实现。
2 术语、定义和缩略语
2.1 术语、定义
无
2.2 缩略语
IAP |
In Application Program |
MCU |
Microprogrammed Control Unit |
BL |
Bootloader |
APP |
Application |
IVT |
Interrupt Vector Table |
TUL |
To Upper Layer |
3 模块描述
实现IAP主要有以下几个要点:
1) Flash的特性,以及资源划分
2) MCU中断的使用方式
3) MCU复位后的硬件外设初始化
3.1 Flash的特性
IAP的全称是In Application Program,即在应用编程。在MCU的应用程序中,通过在线擦除指定Flash区域,编程Flash区域来实现待升级版本文件(通常是.bin文件)的保存,因此要求Flash必须是可持续擦除和编程的。
3.2 Flash的资源划分
在一般的IAP应用中,分为BL程序和APP程序,即在MCU的存储空间内,BL程序和APP程序是共存的,因此需要对Flash地址做合理的规划,方便对Flash地址空间做有效的管理。一般的IAP应用将Flash划分为以下几个区间:
- BL程序区间(必须位于MCU的启动地址处)
- APP程序区间
- BL程序的全局参数存储区间
- APP程序的全局参数存储区间
- APP程序的检验区间
- BL程序的备份区间(也叫2级BL,用于对1级BL程序做IAP升级)
3.3 MCU 中断的使用方式
在MCU应用中,通常会使用中断Interrupt和外设进行数据交换。如果不能使用中断的交互方式,需要在程序结构和数据处理过程上计算处理周期,以保证数据的完整性。MCU中存放中断的地方叫做IVT,当程序发生中断时,首先是在IVT里查找对应的中断源地址,从而执行中断程序的。
在IAP应用中,MCU的Flash中需要同时存储BL程序和APP程序,也就意味着这两块程序会共用IVT,不论BL还是APP如果不能使用中断处理链路通讯,对数据完完整性会产生影响。
因此,这里会涉及到IVT的重定位问题。
3.3.1 Cortex-M3内核系列MCU中断向量表重定位
在Cortex-M3内核MCU中,IVT可以支持重定位此操作:
#define NVIC_VectTab_FLASH ((uint32_t)0x08000000)
#define mFlashAddr_Application_Start 0x0800C000
NVIC_SetVectorTable(NVIC_VectTab_FLASH, mFlashAddr_Application_Start);
3.4 MCU复位后的硬件外设初始化
当MCU的当前逻辑运行区间发生转换时,MCU都会复位,因此在BL和APP程序里需要对响应的硬件外设资源做正确的初始化配置。
4 标准模块
无
5 模块设计
5.1 Flash空间划分
/************************************************************************
STM32F103ZE flash total size is 256K
Single page size is 2K
Total pager number is 256
|-----------------------| 0x08000000
| Boot |
| 48K Bytes |
|-----------------------| 0x0800C000
| App |
| 202K Bytes |
|-----------------------| 0x0803E800
| Boot Para |
| 2K Bytes |
|-----------------------| 0x0803F000
| App Para |
| 2K Bytes |
|-----------------------| 0x0803F800 -> |------------|-----------|---------------|
| Apps CheckSum | | App Size | App CRC | KeepBytes |
| 2K Bytes | | 4 Bytes | 4 Bytes | 2K-8 Bytes |
|-----------------------| 0x0803FFFF
************************************************************************/
如上所示:
1) MCU的起始地址是0x08000000
2) BL程序分配20Kbytes
3) APP程序分配102KBytes
4) BL Para区间分配2Kbytes
5) APP Para区间分配2KBytes
6) Apps CheckSum区间分配2KBytes
5.2 异步事件处理机制
本系统采用异步事件处理机制,即中断源处理作为前台事件,Main函数作为后台处理,在前台事件中标识事件源,在后台处理事件源。
5.3 命令处理
根据《绘画板系列接口协议_Ver X.xx》文档,整个IAP流程需要用到以下命令:
- 命令3001,获取下位机运行区间
- 命令3002,设置下位机运行区间
- 命令3003,获取下位机预留的Flash空间大小
- 命令3004,向下位机传输待升级版本文件
- 命令3005,向下位机传输版本文件参数信息
5.3.1 BL和APP对命令的支持
命令3001 |
命令3002 |
命令3003 |
命令3004 |
命令3005 |
|
BL程序 |
√ |
|
√ |
√ |
√ |
APP程序 |
√ |
√ |
|
|
|
6 数据描述
6.1 数据结构说明
6.1.0.1 宏定义
6.1.0.1.1 Flash资源
#if CVIEW("公用资源")
/* 定义Flash一页数据大小 */
#define mFlashPageSize 2048
/* 获取所在页面地址 */
#define mFunc_Drv_FlashGetPageAddr(addr) (addr&0xFFFFF800)
/* 获取所在页面偏移地址 */
#define mFunc_Drv_FlashGetPageOffset(addr) (addr&0x000007ff)
/* 获取指定范围Flash的页面数量 */
#define mFunc_Drv_FlashSpecialRangePageNum(startAddr, endAddr) ((endAddr-startAddr)/mFlashPageSize)
#endif // #if CVIEW("公用资源")
#if CVIEW("地址规划")
#if CVIEW("Boot")
/* Boot区 */
#define mFlashAddr_Bootloader_Start 0x08000000
#define mFlashSize_Bootloader (10*mFlashPageSize)
#define mFlashAddr_Bootloader_End (mFlashAddr_Bootloader_Start + mFlashSize_Bootloader - 1)
#endif // #if CVIEW("Boot")
#if CVIEW("App")
/* App区 */
#define mAppliacationAddress (uint32_t)0x08005000
#define mFlashAddr_Application_Start 0x08005000
#define mFlashSize_Application (51*mFlashPageSize)
#define mFlashAddr_Application_End (mFlashAddr_Application_Start + mFlashSize_Application - 1)
#endif // #if CVIEW("App")
#if CVIEW("Boot Para")
/* Boot参数区 */
#define mFlashAddr_BootPara_Start 0x0801E800
#define mFlashSize_BootPara (1*mFlashPageSize)
#define mFlashAddr_BootPara_End (mFlashAddr_BootPara_Start + mFlashSize_BootPara - 1)
#endif // #if CVIEW("App Para")
#if CVIEW("App Para")
/* App参数区 */
#define mFlashAddr_AppPara_Start 0x0801F000
#define mFlashSize_AppPara (1*mFlashPageSize)
#define mFlashAddr_AppPara_End (mFlashAddr_AppPara_Start + mFlashSize_AppPara - 1)
#endif // #if CVIEW("App Para")
#if CVIEW("App Checksum")
/* Apps校验区 */
#define mFlashAddr_AppChecksum_Start 0x0801F800
#define mFlashSize_AppChecksum (1*mFlashPageSize)
#define mFlashAddr_AppChecksum_End (mFlashAddr_AppChecksum_Start + mFlashSize_AppChecksum - 1)
#endif // #if CVIEW("Apps Checksum")
#endif // #if CVIEW("地址规划")
6.1.0.1.2 链路层协议
#define mTul_FrameBootCode_Dn 0xCD
#define mTul_FrameBootCode_Up 0xAC
#define mTul_CmdFrameStruct_BootCode_Size (1)
#define mTul_CmdFrameStruct_SubsequentLength_Size (2)
#define mTul_CmdFrameStruct_CmdCode_Size (2)
#define mTul_CmdFrameStruct_CrcBytes_Size (2)
#define mTul_CmdFrameStruct_CmdPara_Size
(mTul_Cmd_Array_Size - mTul_CmdFrameStruct_BootCode_Size
- mTul_CmdFrameStruct_SubsequentLength_Size
- mTul_CmdFrameStruct_CmdCode_Size
- mTul_CmdFrameStruct_CrcBytes_Size)
#define mTul_RspFrameStruct_BootCode_Size (1)
#define mTul_RspFrameStruct_SubsequentLength_Size (2)
#define mTul_RspFrameStruct_CmdCode_Size (2)
#define mTul_RspFrameStruct_StatusCode_Size (1)
#define mTul_RspFrameStruct_CrcBytes_Size (2)
#define mTul_RspFrameStruct_CmdPara_Size
(mTul_Rsp_Array_Size - mTul_RspFrameStruct_BootCode_Size
- mTul_RspFrameStruct_SubsequentLength_Size
- mTul_RspFrameStruct_CmdCode_Size
- mTul_RspFrameStruct_StatusCode_Size
- mTul_RspFrameStruct_CrcBytes_Size)
6.1.0.2 结构体/联合/枚举 定义
6.1.0.2.1 Flash资源
typedef enum enumFlash_AppChecksum_Kind{ // App校验区枚举类型
eFlash_AppChecksum_Kind_Size,
eFlash_AppChecksum_Kind_Crc,
}E_Flash_AppChecksum_Kind;
typedef enum enumFlash_FlagKind{ // Flash操作相关枚举
eFlash_FlagKind_VersionFileTrans,
eFlash_FlagKind_VersionFileChecksumTrans,
}E_Flash_FlagKind;
typedef struct structFlash_AppChecksum{ // App校验区数据结构
UINT32 ulAppSize;
UINT32 ulAppCrc;
}T_Flash_AppChecksum;
typedef struct structFlashOptFlag{ // Flash操作相关数据结构
UINT8 bVersionFileTransDoneFlag : 1;
UINT8 bVersionFileChecksumTransDoneFlag : 1;
UINT8 bKeepBits : 6;
}T_Flash_OptFlag;
6.1.0.2.2 异步事件
// 定义系统标志位结构体
typedef struct struct_SystemEventFlag{
UINT32 ulSysEventFlag_RevUsbFrame : 1; // 系统事件枚举,接收到UsbFrame
UINT32 ulSysEventFlag_KeyPressed : 1; // 系统事件枚举,按键
UINT32 ulSysEventFlag_SysReset : 1; // 系统事件枚举,系统复位
UINT32 ulSysEventFlag_KeepBits : 29; // 系统时间标志位,保留位
}T_SystemEventFlag;
// 定义系统标志位枚举
typedef enum enum_SystemEventFlag{
E_SystemEventFlag_SystemReset, // 系统事件枚举,复位系统
E_SystemEventFlag_KeyPressed, // 系统事件枚举,按键
E_SystemEventFlag_RevUsbFrame, // 系统事件枚举,接收到UsbFrame
}E_SystemEventFlag;
6.1.0.2.3 链路层协议
// 定义TUL层命令应答结构体
typedef struct struct_SystemResourceTul{
UINT8 aucTulCmdFrame[TUL_CMD_ARRAY_SIZE]; // 定义Tul层命令缓存
UINT16 usCmdFrameCnt; // 定义Tul层命令缓存指针计数器
UINT16 usCmdSubsequentLength; // 定义Tul层命令帧中长度字段后续数据长度
UINT16 usCmdTotalLen; // 定义Tul层命令帧全长缓存
UINT8 aucTulRspFrame[TUL_RSP_ARRAY_SIZE]; // 定义Tul层应答缓存
UINT16 usRspTotalLen; // 定义Tul层应答帧全长缓存
BOOL bReiceveCmdFrameStartFlag; // 定义命令接收标志位
BOOL bReiceveCmdFrameEndFlag; // 定义命令接收标志位
}T_SystemResource_Tul;
// 出错类别表
typedef enum {
E_TulErrorCode_Success = 0x00, // 正确
E_TulErrorCode_BootCodeError = 0x01, // 引导码错误
E_TulErrorCode_CmdFrameParaLengthError = 0x02, // 命令参数长度错误
E_TulErrorCode_CmdCodeError = 0x03, // 命令码错误
E_TulErrorCode_CrcCodeError = 0x04, // CRC错误
E_TulErrorCode_CmdParaError = 0x10, // 命令参数错误
}T_TulErr;
// 命令类型
typedef enum enum_TulCmdKind{
Tul_Cmd_Kind_Check = 0x10, // 查询类命令
Tul_Cmd_Kind_IapProtocol = 0x30, // IAP在线升级类命令
}T_TulCmdKind;
// 适用于链路层协议解析的通用函数指针
typedef T_TulErr (*PT_CmdFunc)(const UINT8 *paucUpperLayerCmdPara, UINT8 *paucRspPara, UINT16 *pusRetParaLen);
// 命令函数入口表数据结构
typedef struct tagTulCmdFuncTable{
UINT8 ucCmdSn; // 命令流水号
PT_CmdFunc ptCmdFunc; // 命令函数指针
}T_TulCmdFuncTable;
// 命令类型索引表结构体
typedef struct tagTulCmdKindIndex{
T_TulCmdKind tCmdKind; // 命令类型
const T_TulCmdFuncTable *ptCmdFuncTable; // 命令类型对应的命令入口函数码表
}T_TulCmdKindIndex;
// 解析帧所用参数结构体
typedef struct tagTulAnalysisPara{
T_TulErr tCmdFrameAnalysisRst; // 命令帧解析结果
UINT8 ucCmdKind; // 上位机命令类型
UINT8 ucCmdSn; // 上位机命令在对应命令码表中的流水号
UINT8 *pucRspParaAddr; // 应答参数的缓存地址
UINT8 *pucUpperLayerCmdParaAddr; // 上位机命令参数的缓存地址
}T_TulAnalysisPara;
6.1.0.2.4 命令实现
// 定义“查询下位机运行区间”命令
typedef struct struct_TulRspPara_Iap_CheckReaderRunSapce{
UINT8 ucRunSpace; // 运行区间
}T_TulRspPara_Iap_CheckReaderRunSpace;
// 定义“设置下位机运行区间”命令
typedef struct struct_TulCmdPara_Iap_SetReaderRunSapce{
UINT8 ucRunSpace; // 运行区间
}T_TulCmdPara_Iap_SetReaderRunSpace;
// 定义“查询下位机预留Flash空间大小”命令
typedef struct struct_TulRspPara_Iap_CheckObligateVersionFileSize{
UINT32 ulVersionFileSize; // 升级文件大小
}T_TulRspPara_Iap_CheckObligateVersionFileSize;
// 定义“向下位机传输版本文件”命令
typedef struct struct_TulCmdPara_Iap_TransmitVersionFile{
UINT8 bPackageEndFlag; // 包结束标识符
UINT16 usPackageSn; // 包序号
UINT16 usPackageLength; // 包长度
UINT8 aucPackageMessage[1]; // 包信息
}T_TulCmdPara_Iap_TransmitVersionFile;
// 定义“向下位机传输版本文件参数信息”命令
typedef struct struct_TulCmdPara_Iap_TransmitVersionFilePara{
UINT32 ulVersionFileLength; // 升级文件长度
UINT32 ulVersionFileCrc; // 升级文件Crc
}T_TulCmdPara_Iap_TransimitVersionFilePara;
6.2 全局变量说明
static T_TulAnalysisPara tTulAnalysisPara; // 解析用参数定义
static T_SystemEventFlag tSysEventFlag; // 定义系统事件标志位
const T_TulCmdFuncTable atCmdFuncTable_IapProtocol[]; // IAP命令码表
static T_Flash_AppChecksum tFlash_AppChecksum; // AppsChecksum校验数据缓存
static T_Flash_OptFlag tFlash_OptFlag; // Flash操作标志位缓存
6.3 数据库说明
无
7 函数定义
7.1 引用函数定义
无
7.2 内部函数定义
7.2.1 链路层协议
7.2.1.1 Mid_Tul_CheckCrc16
// 函数名称:Mid_Tul_CheckCrc16
// 函数功能:检查CRC16
// 函数输入:UINT8* paucUpperLayerCmdMsg,接收到的上层命令数据
// UINT16 usReceiveUpperLayerTotalLen,接收到上层数据的总长度
// 函数输出:无
// 函数返回:0表示CRC不一致,1表示CRC一致
7.2.1.2 Mid_Tul_CheckTulLengthField
// 函数名称:Mid_Tul_CheckTulLengthField
// 函数功能:检查长度字段
// 函数输入:UINT8* paucUpperLayerCmdMsg,接收到的上层命令数据
// UINT16 usReceiveUpperLayerTotalLen,接收到上层数据的总长度
// 函数输出:无
// 函数返回:0表示不一致,1表示一致
7.2.1.3 Mid_Tul_GetCmdFunc
// 函数名称:GetCmdFuncWithCmdSn
// 函数功能:获取命令执行函数地址
// 函数输入:UINT8 ucCmdKind,命令类型
// UINT8 ucCmdSn,命令序列号
// 函数输出:无
// 函数返回:PT_CmdFunc ptCmdFunc,命令执行函数
7.2.1.4 Mid_Tul_GetCmdFuncTableAddr
// 函数名称:Mid_Tul_GetCmdFuncTableAddr
// 函数功能:获取命令码类型对应的码表地址
// 函数输入:UINT8 ucCmdKind,命令类型
// 函数输出:无
// 函数返回:T_TulCmdFuncTable *ptCmdFuncTable,命令类型对应的码表
8 接口设计
8.1 用户接口
8.1.1 Flash资源
8.1.1.1 Drv_Flash_AppChecksum_GetChecksumInfo
// 函数名称:Drv_Flash_AppChecksum_GetChecksumInfo
// 函数功能:获取AppsChecksum校验区的校验信息,在正确读取后不需要对Size和Crc做大小端转换,这里由Updata操作确保写入时是小端写入
// 函数输入:E_Flash_AppChecksum_Kind eAppChecksumKind
// 函数输出:tFlash_AppsChecksum
// 函数返回:UINT32
8.1.1.2 Drv_Flash_AppChecksum_UpdataChecksumInfo
// 函数名称:Drv_Flash_AppChecksum_UpdataChecksumInfo
// 函数功能:更新AppsChecksum校验区的校验信息,确保函数输入数据为小端数据
// 函数输入:E_Flash_AppsChecksum_Kind eAppChecksumKind, UINT32 ulSizeOrCrcData
// 函数输出:tFlash_AppsChecksum
// 函数返回:无
8.1.1.3 Drv_Flash_FlagOpt_GetFlagInfo
// 函数名称:Drv_Flash_FlagOpt_GetFlagInfo
// 函数功能:查询Flash操作相关标志位
// 函数输入:E_Flash_FlagKind eFlashFlagKind
// 函数输出:tFlash_OptFlag
// 函数返回:BOOL
8.1.1.4 Drv_Flash_FlagOpt_SetFlagInfo
// 函数名称:Drv_Flash_FlagOpt_SetFlagInfo
// 函数功能:查询Flash操作相关标志位
// 函数输入:E_Flash_FlagKind eFlashFlagKind, BOOL bStatus
// 函数输出:tFlash_OptFlag
// 函数返回:无
8.1.2 异步事件
8.1.2.1 App_SysEvt_SetEventFlag
// 函数名称:App_SysEvt_SetEventFlag
// 函数功能:设置系统事件标志位
// 函数输入:E_SystemEventFlag eEventFlag,系统事件标志位
// BOOL bStatus,待设置内容
// 函数输出:tSystemEventFlag
// 函数返回:无
8.1.2.2 App_SysEvt_GetEventFlag
// 函数名称:App_SysEvt_GetEventFlag
// 函数功能:获取系统事件标志位
// 函数输入:E_SystemEventFlag eEventFlag,系统事件标志位
// 函数输出:tSystemEventFlag
// 函数返回:BOOL
8.1.3 链路层协议
8.1.3.1 Mdi_Tul_UpperLayerCmdAnalysis
// 函数名称:Mid_Tul_UpperLayerCmdAnalysis
// 函数功能:上层命令解析
// 函数输入:UINT8* paucUpperLayerCmdMsg,接收到的上层命令数据
// UINT8* paucReaderRspMsg,向上层返回的响应数据
// UINT16 usReceiveUpperLayerTotalLen,接收到上层数据的总长度
// 函数输出:无
// 函数返回:UINT6 usRetLength,返回的数据长度
8.1.4 命令实现
8.1.4.1 App_TulIap_CheckRunSpace
// 函数名称:App_TulIap_CheckRunSpace
// 函数功能:IAP,查询读写器运行区间
// 函数输入:const UINT8* pucCmdParaMsg,接收到的上层命令参数数据
// UINT8* pucRspRapaMsg,向上层返回的响应参数数据
// UINT16 *pusRetParaLen,需要返回的参数长度
// 函数输出:UINT8* pucRspRapaMsg,向上层返回的响应参数数据
// UINT16 *pusRetParaLen,需要返回的参数长度
// 函数返回:T_TulErr,函数执行状态
8.1.4.2 App_TulIap_ModifyRunSpace
// 函数名称:App_TulIap_ModifyRunSpace
// 函数功能:IAP,发送版本参数信息
// 函数输入:const UINT8* pucCmdParaMsg,接收到的上层命令参数数据
// UINT8* pucRspRapaMsg,向上层返回的响应参数数据
// UINT16 *pusRetParaLen,需要返回的参数长度
// 函数输出:UINT8* pucRspRapaMsg,向上层返回的响应参数数据
// UINT16 *pusRetParaLen,需要返回的参数长度
// 函数返回:T_TulErr,函数执行状态
8.1.4.3 App_TulIap_CheckObligateVersionFileSize
// 函数名称:App_TulIap_CheckObligateVersionFileSize
// 函数功能:IAP,查询预留Flash大小
// 函数输入:const UINT8* pucCmdParaMsg,读写器接收到的上层命令参数数据
// UINT8* pucRspRapaMsg,读写器向上层返回的响应参数数据
// UINT16 *pusRetParaLen,需要返回的参数长度
// 函数输出:UINT8* pucRspRapaMsg,读写器向上层返回的响应参数数据
// UINT16 *pusRetParaLen,需要返回的参数长度
// 函数返回:T_TulErr,函数执行状态
8.1.4.4 App_TulIap_TransmitVersionFile
// 函数名称:App_TulIap_TransmitVersionFile
// 函数功能:IAP,发送版本文件
// 函数输入:const UINT8* pucCmdParaMsg,读写器接收到的上层命令参数数据
// UINT8* pucRspRapaMsg,读写器向上层返回的响应参数数据
// UINT16 *pusRetParaLen,需要返回的参数长度
// 函数输出:UINT8* pucRspRapaMsg,读写器向上层返回的响应参数数据
// UINT16 *pusRetParaLen,需要返回的参数长度
// 函数返回:T_TulErr,函数执行状态
8.1.4.5 App_TulIap_TransmitVersionFilePara
// 函数名称:App_TulIap_TransmitVersionFilePara
// 函数功能:IAP,发送版本参数信息
// 函数输入:const UINT8* pucCmdParaMsg,读写器接收到的上层命令参数数据
// UINT8* pucRspRapaMsg,读写器向上层返回的响应参数数据
// UINT16 *pusRetParaLen,需要返回的参数长度
// 函数输出:UINT8* pucRspRapaMsg,读写器向上层返回的响应参数数据
// UINT16 *pusRetParaLen,需要返回的参数长度
// 函数返回:T_TulErr,函数执行状态
8.2 硬件接口
8.2.1 Flash资源
8.2.1.1 Drv_Flash_InitialPara
// 函数名称:Drv_Flash_InitialPara
// 函数功能:查询Flash操作相关标志位
// 函数输入:E_Flash_FlagKind eFlashFlagKind, BOOL bStatus
// 函数输出:tFlash_OptFlag
// 函数返回:无
8.2.1.2 Drv_Flash_ErasePagesWrite
// 函数名称:Drv_Flash_ErasePagesWrite
// 函数功能:Flash模块,擦除页信息并更新
// 函数输入:ULONG ulFlashAddr, UCHAR *pucSavebuf, ULONG ulLen
// 函数输出:无
// 函数返回:BOOL bStatus
8.2.1.3 Drv_Flash_Read
// 函数名称:Drv_Flash_Read
// 函数功能:Flash模块,读取数据信息
// 函数输入:ULONG ulFlashAddr, UCHAR *pucReadbuf, ULONG ulLen)
// 函数输出:无
// 函数返回:BOOL bStatus
8.2.1.4 Drv_Flash_EraseVersionFileSpace
// 函数名称:Drv_Flash_EraseVersionFileSpace
// 函数功能:IAP升级应用,擦除升级文件Flash空间
// 函数输入:无
// 函数输出:无
// 函数返回:无
8.2.1.5 Drv_Flash_UpdataVersionFileSpace
// 函数名称:Drv_Flash_UpdataVersionFileSpace
// 函数功能:IAP升级应用,更新升级文件预留Flash空间
// 函数输入:const UINT8 *pucPackageMessage, UINT16 usPackageLength, UINT16 usPackageSn
// 函数输出:无
// 函数返回:无
8.2.1.6 Drv_Flash_Test_ReadWrite(Test Condition)
// 函数名称:Drv_Flash_Test_ReadWrite
// 函数功能:Flash模块,测试读写
// 函数输入:无
// 函数输出:无
// 函数返回:无