增加PC机截屏功能,脱机烧录界面显示数据文件累加校验和

This commit is contained in:
armfly 2020-12-26 20:10:11 +08:00
parent c6e12bb709
commit 81842c4bcf
24 changed files with 4300 additions and 281 deletions

View File

@ -1,3 +1,14 @@
----------------------------------------------------------------------------
2020-12-26 V1.45 对应PC软件版本 V1.4.2
1. 增加PC机截屏功能用于编写说明书
2. 增加PC机模拟按键功能
3. 虚拟串口界面返回时退到扩展菜单
4. 脱机烧录界面显示数据文件的累加校验和
5. 增加恢复基本参数缺省值(不含校准参数)的功能PC控制)
6. status_system_set.c中几个装态拆分到单独的文件status_usb_emmc.c,
status_usb_uart.c, status_esp32.c
7. emmc磁盘文件更新prog_lib.lua文件,增加通道参数异常时报错
----------------------------------------------------------------------------
2020-12-24 V1.44 对应PC软件版本 V1.4.1
1. 传送脱机烧录的文件增加MD5完整性校验并解决文件写入不全的BUG

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<component_viewer schemaVersion="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="Component_Viewer.xsd">
<component name="EventRecorderStub" version="1.0.0"/> <!--name and version of the component-->
<events>
</events>
</component_viewer>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -1650,6 +1650,11 @@
<FileType>1</FileType>
<FilePath>..\..\User\modbus\modbus_host.c</FilePath>
</File>
<File>
<FileName>modbus_msg.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\User\modbus\modbus_msg.c</FilePath>
</File>
</Files>
</Group>
<Group>

View File

@ -68,7 +68,7 @@ __Vectors DCD __initial_sp ; Top of Stack
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0x00000144 ; Reserved H7-TOOL APP 固件版本
DCD 0x00000145 ; Reserved H7-TOOL APP 固件版本
DCD 0 ; Reserved 固件小版本
DCD 0 ; Reserved
DCD 0 ; Reserved

View File

@ -90,5 +90,7 @@ int32_t WriteProgIniFile(char *_LuaPath, PROG_INI_T *_pIni);
void LoadProgAutorunFile(char *_OutBuff, uint32_t _BuffSize);
void SaveProgAutorunFile(const char *_NewStr);
uint32_t GetFileMD5(char *_Path, char *_OutMD5);
uint32_t GetFileSum32(const char *_Path, uint32_t *_Out);
uint32_t GetFileCRC32(const char *_Path, uint32_t *_Out);
#endif

View File

@ -216,6 +216,10 @@ typedef struct
uint8_t LinkState; /* 和PC机联机状态 */
int32_t LinkTime;
uint8_t PC_SKeyState; /* PC控制的S键状态 */
uint8_t PC_CKeyState; /* PC控制的C键状态 */
uint8_t PC_KeyEnabled; /* PC控制按键进行中... */
} VAR_T;
enum

View File

@ -52,7 +52,7 @@
#define MEAS_VALUE_COLOR RGB(102, 156, 247) /* 测量栏正文颜色 */
#define MEAS_UNIT_COLOR RGB(189, 189, 189) /* 测量栏单位颜色 */
#define HELP_TEXT_COLOR RGB(210, 210, 210) /* 帮助文字颜色 */
#define HELP_TEXT_COLOR RGB(200, 200, 200) /* 帮助文字颜色 */
#define HELP_BACK_COLOR FORM_BACK_COLOR /* 帮助文字背景颜色 */
#define INFO_BACK_COLOR FORM_BACK_COLOR /* 联机模式正文文字背景颜色 */

View File

@ -17,6 +17,7 @@
#include "includes.h"
#include "md5.h"
#include "crc32_stm32.h"
/*
1V7开发板的SD卡接口是用的SDMMC1AXI SRAM区访问SRAM和TCP均不支持
@ -1099,6 +1100,104 @@ uint32_t GetFileMD5(char *_Path, char *_OutMD5)
return size;
}
/*
*********************************************************************************************************
* : GetFileSum32
* : 32bit
* : _Path :
* _Out : 4
* : . 0
*********************************************************************************************************
*/
uint32_t GetFileSum32(const char *_Path, uint32_t *_Out)
{
uint32_t bytes;
uint32_t offset = 0;
FRESULT re;
uint32_t size;
uint32_t sum32;
uint32_t i;
*_Out = 0;
re = f_open(&g_file, _Path, FA_OPEN_EXISTING | FA_READ);
if (re != FR_OK)
{
return 0;
}
size = f_size(&g_file);
f_close(&g_file);
sum32 = 0;
while (1)
{
bytes = ReadFileToMem((char *)_Path, offset, FsReadBuf, sizeof(FsReadBuf));
offset += bytes;
if (bytes > 0)
{
for (i = 0; i < bytes; i++)
{
sum32 += FsReadBuf[i];
}
}
else
{
break;
}
}
*_Out = sum32;
return size;
}
/*
*********************************************************************************************************
* : GetFileCRC32
* : CRC32校验和32bit
* : _Path :
* _Out : 4
* : . 0
*********************************************************************************************************
*/
uint32_t GetFileCRC32(const char *_Path, uint32_t *_Out)
{
uint32_t bytes;
uint32_t offset = 0;
FRESULT re;
uint32_t size;
*_Out = 0;
re = f_open(&g_file, _Path, FA_OPEN_EXISTING | FA_READ);
if (re != FR_OK)
{
return 0;
}
size = f_size(&g_file);
f_close(&g_file);
CRC32_Init(); /* 硬件CRC32计算 */
while (1)
{
bytes = ReadFileToMem((char *)_Path, offset, FsReadBuf, sizeof(FsReadBuf));
offset += bytes;
if (bytes > 0)
{
CRC32_Update(FsReadBuf, bytes);
}
else
{
break;
}
}
*_Out = CRC32_Final();
return size;
}
/*
*********************************************************************************************************
* : ListFileToMem

View File

@ -164,10 +164,20 @@ void InitBaseParam(void)
g_tParam.ToolSn = 1; /* 烧录器编号 */
g_tParam.StartRun = 0; /* 开机启动 */
/* V1.32 */
g_tParam.UartMonBaud = 7; /* 串口监视,波特率 */
g_tParam.UartMonParit = 0; /* 串口监视,奇偶校验 */
g_tParam.UartMonWordWrap = 1; /* 串口监视,自动换行 */
g_tParam.UartMonFont = 1; /* 串口监视,字体 */
g_tParam.UartMonHex = 0; /* 串口监视按HEX显示 */
g_tParam.UartMonTimeStamp = 0; /* 串口监视,加上时间戳 */
g_tParam.UartMonProxy = 0; /* 串口监视,协议 */
g_tParam.DAP_TVCCVolt = 0;
g_tParam.DAP_BeepEn = 1;
bsp_GenRNG(&g_tParam.DAP_Sn, 1);
//bsp_GenRNG(&g_tParam.DAP_Sn, 1);
g_tParam.DAP_Sn = 1;
SaveParam();
}

View File

@ -39,15 +39,15 @@
#define TEXT1_X 5
#define TEXT1_Y BTN1_Y
/* 本次次数 */
/* 本次次数 */
#define TEXT2_X TEXT1_X
#define TEXT2_Y TEXT1_Y + 20
#define TEXT2_Y TEXT1_Y + 18
/* 累积次数 */
/* 累积次数+限制次数 */
#define TEXT3_X TEXT1_X
#define TEXT3_Y TEXT2_Y + 20
#define TEXT3_Y TEXT2_Y + 24
/* TVCC电压 */
/* CRC32 */
#define TEXT4_X TEXT1_X
#define TEXT4_Y TEXT3_Y + 20
@ -89,12 +89,16 @@ MENU_T g_tMenuProg1;
void DispProgVoltCurrent(void);
static void DispProgCounter(void);
static uint32_t GetDataFileSum(void);
extern void sysTickInit(void);
extern uint8_t swd_init_debug(void);
extern uint8_t swd_read_idcode(uint32_t *id);
extern uint8_t swd_init(void);
static uint32_t s_DataFileSum = 0;
/*
*********************************************************************************************************
* : status_ProgSelectFile
@ -234,9 +238,11 @@ void status_ProgWork(void)
LCD_SetEncode(ENCODE_UTF8);
s_DataFileSum = GetDataFileSum(); /* 读数据文件,计算文件校验和 */
/* 读ini配置文件 */
ReadProgIniFile(g_tProg.FilePath, &g_tProgIni);
DispProgCounter();
DispProgCounter();
}
// else
// {
@ -252,35 +258,6 @@ void status_ProgWork(void)
else if (g_gMulSwd.MultiMode == 4) PG_PrintText("多路模式:1-4路");
}
// /* 配置RS485串口驱动RS485数码管显示状态 */
// {
// bsp_SetUartParam(COM_RS485, 9600, UART_PARITY_NONE, UART_WORDLENGTH_8B, UART_STOPBITS_1);
//
// if (g_gMulSwd.MultiMode == 0)
// {
// comSendBuf(COM_RS485, "$001,- #", 10);
// }
// else
// {
// if (g_gMulSwd.MultiMode == 1)
// {
// comSendBuf(COM_RS485, "$001,- #", 10);
// }
// else if (g_gMulSwd.MultiMode == 2)
// {
// comSendBuf(COM_RS485, "$001,-- #", 10);
// }
// else if (g_gMulSwd.MultiMode == 3)
// {
// comSendBuf(COM_RS485, "$001,--- #", 10);
// }
// else if (g_gMulSwd.MultiMode == 4)
// {
// comSendBuf(COM_RS485, "$001,----#", 10);
// }
// }
// }
/* V1.36 解决第一次上电第1次烧录失败问题 */
{
if (g_gMulSwd.MultiMode == 0)
@ -431,37 +408,7 @@ void status_ProgWork(void)
g_gMulSwd.Active[2] = 1;
g_gMulSwd.Active[3] = 1;
}
}
// /* RS485数码管显示烧录进行中 */
// {
// char str[16];
//
// if (g_gMulSwd.MultiMode == 0) /* 单路模式 */
// {
// strcpy(str, "$001,-. #");
// }
// else /* 多路模式 */
// {
// uint8_t i;
//
// strcpy(str, "$001,");
// for (i = 0; i < 4; i++)
// {
// if (g_gMulSwd.Active[i] == 1)
// {
// strcat(str, "-.");
// }
// else
// {
// strcat(str, " ");
// }
// }
// strcat(str, "#");
// }
// comSendBuf(COM_RS485, (uint8_t *)str, strlen(str));
// }
}
bsp_LcdSleepEnable(0); /* 临时屏蔽LCD背光控制应对烧录时间大于1分钟的情况避免中途关闭背光 */
@ -489,57 +436,7 @@ void status_ProgWork(void)
{
g_tProg.Err = 1;
}
}
/* RS485数码管显示烧录结果 */
// {
// char str[8];
//
// if (g_gMulSwd.MultiMode == 0) /* 单路模式 */
// {
// if (g_tProg.Err == 0)
// {
// strcpy(str, "$001,o #");
// }
// else
// {
// strcpy(str, "$001,E #");
// }
// }
// else /* 多路模式 */
// {
// uint8_t i;
//
// strcpy(str, "$001,");
// for (i = 0; i < 4; i++)
// {
// if (g_gMulSwd.Active[i] == 1)
// {
// if (g_gMulSwd.Error[i] != 0)
// {
// strcat(str, "E");
// }
// else
// {
// if (g_tProg.Err == 1)
// {
// strcat(str, "-");
// }
// else
// {
// strcat(str, "o");
// }
// }
// }
// else
// {
// strcat(str, " ");
// }
// }
// strcat(str, "#");
// }
// comSendBuf(COM_RS485, (uint8_t *)str, strlen(str));
// }
}
/* 编程完毕 */
if (g_tProg.Err == 0)
@ -1295,7 +1192,6 @@ void status_ProgModifyParam(void)
static void DispProgCounter(void)
{
char buf[32];
int32_t count;
FONT_T tFontText;
FONT_T tFont2;
@ -1313,29 +1209,32 @@ static void DispProgCounter(void)
LCD_DispStrEx(TEXT1_X, TEXT1_Y, "本次", &tFontText, TEXT_WIDTH, ALIGN_LEFT);
LCD_DispStrEx(TEXT2_X, TEXT2_Y, "计数", &tFontText, TEXT_WIDTH, ALIGN_LEFT);
sprintf(buf, "%05d", g_tProg.NowProgCount); /* 最大 99999 */
LCD_DispStrEx(TEXT1_X + 38, TEXT1_Y + 4, buf, &tFont2, 16 * 6, ALIGN_CENTER);
LCD_DispStrEx(TEXT1_X + 38, TEXT1_Y + 2, buf, &tFont2, 16 * 6, ALIGN_CENTER);
/* 显示剩余次数 */
if (g_tProgIni.Locked == 1)
{
sprintf(buf, "剩余次数: 已锁死");
}
else
{
count = g_tProgIni.ProgramLimit - g_tProgIni.ProgrammedCount;
}
/*
+
20000 / 60000
*/
// if (g_tProgIni.Locked == 1)
// {
// sprintf(buf, "已锁死");
// }
// else
// {
// count = g_tProgIni.ProgramLimit - g_tProgIni.ProgrammedCount;
// }
if (g_tProgIni.ProgramLimit == 0)
{
sprintf(buf, "剩余次数: 不限制");
sprintf(buf, "累计: %d", g_tProgIni.ProgrammedCount);
}
else
{
sprintf(buf, "剩余次数: %d", count);
sprintf(buf, "累计: %d/%d", g_tProgIni.ProgrammedCount, g_tProgIni.ProgramLimit);
}
LCD_DispStrEx(TEXT3_X, TEXT3_Y, buf, &tFontText, TEXT_WIDTH, ALIGN_LEFT);
sprintf(buf, "累积次数: %d", g_tProgIni.ProgrammedCount);
sprintf(buf, "校验: 0x%08X", s_DataFileSum);
LCD_DispStrEx(TEXT4_X, TEXT4_Y, buf, &tFontText, TEXT_WIDTH, ALIGN_LEFT);
}
@ -1377,5 +1276,79 @@ void DispProgVoltCurrent(void)
sprintf(buf, "%0.0fmA", g_tVar.TVCCCurr);
LCD_DispStrEx(TEXT_CURR_X, TEXT_CURR_Y, buf, &tFont16, TEXT_CURR_W, 1);
}
/*
*********************************************************************************************************
* : GetDataFileSum
* : . STM32硬件CRC32单元计算. CRC32,
* :
* : CRC32
*********************************************************************************************************
*/
#define MAX_FILE_SUM 128 /* 最大文件个数 */
static uint32_t GetDataFileSum(void)
{
#if 1 /* 由PC机计算 */
uint32_t crc_sum;
crc_sum = lua_GetVarUint32("DATA_FILE_CHECK_SUMS", 0x00000000);
return crc_sum;
#else /* 由H7-TOOL计算数据文件2MB时0.5秒。如果更大文件,则载入界面太慢,废弃 */
size_t FileLen;
uint32_t i;
const char *pFileName;
uint32_t crc_sum; /* 多个数据文件分别计算CRC32然后求和 */
uint32_t crc32;
char path[256];
/*
TaskList = {
AlgoFile_FLASH, --
"2K.bin", --
0x00000000, --
1, --0, 1
}
*/
crc_sum = 0;
//lua->stack得到全局表位置-1
lua_getglobal(g_Lua, "TaskList");
for (i = 0; i < MAX_FILE_SUM; i++)
{
lua_pushinteger(g_Lua, i * 4 + 2); //c->statck设置key值位置-1(上面的-1变为-2)
lua_gettable(g_Lua, -2);//返回值为值的类型
if (lua_isstring(g_Lua, -1))
{
pFileName = luaL_checklstring(g_Lua, -1, &FileLen); /* 1是参数的位置 len是string的长度 */
lua_pop(g_Lua, 1);
if (pFileName[0] == '0' && pFileName[1] == ':') /* 是绝对路径 */
{
strncpy(path, pFileName, sizeof(pFileName));
}
else /* 是相对路路径 */
{
GetDirOfFileName(g_tProg.FilePath, path); /* 从lua文件名、中获取目录 */
strcat(path, "/");
strcat(path, pFileName);
FixFileName(path); /* 去掉路径中的..上级目录 */
}
GetFileCRC32(path, &crc32);
crc_sum += crc32;
}
else
{
lua_pop(g_Lua, 1);
break;
}
}
lua_pop(g_Lua, 1);
return crc_sum;
#endif
}
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/

View File

@ -80,7 +80,7 @@ void status_UsbUart(void)
break;
case KEY_LONG_DOWN_C: /* C键长按 */
g_MainStatus = MS_SYSTEM_SET;
g_MainStatus = MS_EXTEND_MENU1;
break;
default:

View File

@ -26,6 +26,7 @@
*/
#include "bsp.h"
#include "param.h"
/*
@ -87,7 +88,7 @@ static uint8_t s_LcdOn = 1;
static uint8_t KeyPinActive(uint8_t _id)
{
uint8_t level;
if ((s_gpio_list[_id].gpio->IDR & s_gpio_list[_id].pin) == 0)
{
level = 0;
@ -99,12 +100,41 @@ static uint8_t KeyPinActive(uint8_t _id)
if (level == s_gpio_list[_id].ActiveLevel)
{
return 1;
level = 1;
}
else
{
return 0;
level = 0;
}
/* V1.45 2020-12-25 增加PC机模拟按键功能 */
if (g_tVar.PC_KeyEnabled == 1)
{
g_tVar.PC_CKeyState = 0;
if (_id == KID_S)
{
level = level | g_tVar.PC_SKeyState;
if (level == 0)
{
g_tVar.PC_KeyEnabled = 0;
}
}
}
else if (g_tVar.PC_KeyEnabled == 2)
{
g_tVar.PC_SKeyState = 0;
if (_id == KID_C)
{
level = level | g_tVar.PC_CKeyState;
if (level == 0)
{
g_tVar.PC_KeyEnabled = 0;
}
}
}
return level;
}
/*
@ -117,6 +147,7 @@ static uint8_t KeyPinActive(uint8_t _id)
*/
static uint8_t IsKeyDownFunc(uint8_t _id)
{
/* 实体单键 */
if (_id < HARD_KEY_NUM)
{

View File

@ -42,6 +42,7 @@ uint32_t STM32_CRC32_LE(uint8_t *_pBuf, uint32_t _Len, uint32_t _InitValue)
CRC->INIT = _InitValue;
CRC->CR |= CRC_CR_RESET;
for (i = 0; i < _Len / 4; i++)
{
p[0] = *_pBuf++;
@ -67,4 +68,56 @@ uint32_t STM32_CRC32_LE(uint8_t *_pBuf, uint32_t _Len, uint32_t _InitValue)
return (CRC->DR);
}
// 赋初值 0xFFFFFFFFUL
void CRC32_Init(void)
{
__HAL_RCC_CRC_CLK_ENABLE();
CRC->INIT = 0xFFFFFFFFUL;
CRC->CR |= CRC_CR_RESET;
}
//更新数据
void CRC32_Update(char *_pBuf, uint32_t _Len)
{
uint32_t i;
uint32_t dd;
uint8_t *p;
p = (uint8_t *)&dd;
for (i = 0; i < _Len / 4; i++)
{
p[0] = *_pBuf++;
p[1] = *_pBuf++;
p[2] = *_pBuf++;
p[3] = *_pBuf++;
CRC->DR = dd;
}
// 补齐4字节校验
if (_Len % 4)
{
p[1] = 0;
p[2] = 0;
p[3] = 0;
for (i = 0; i < _Len % 4; i++)
{
p[i] = *_pBuf++;
}
CRC->DR = dd;
}
}
// 最终结果 异或 0xFFFFFFFFUL;
uint32_t CRC32_Final(void)
{
uint32_t crc;
crc = CRC->DR ^ 0xFFFFFFFFUL;
return crc;
}
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/

View File

@ -14,5 +14,9 @@
#define CRC32_STM32_H
uint32_t STM32_CRC32_LE(uint8_t *_pBuf, uint32_t _Len, uint32_t _InitValue);
void CRC32_Init(void);
void CRC32_Update(char *_pBuf, uint32_t _Len);
uint32_t CRC32_Final(void);
#endif

View File

@ -4,7 +4,7 @@
* : MODSBUS通信程序
* : modbus_host.c
* : V1.0
* : 线MODBUS.
* :
* :
*
* V1.0 2020-12-15 armfly H7-TOOL. . .

50
User/modbus/modbus_msg.c Normal file
View File

@ -0,0 +1,50 @@
/*
*********************************************************************************************************
*
* : MODBUS PC机发送的消息(
* : modbus_msg.c
* : V1.0
* : .
*
* Copyright (C), 2020, www.armfly.com
*
*********************************************************************************************************
*/
#include "Includes.h"
#include "modbus_slave.h"
/*
*********************************************************************************************************
* : MODS_70H
* : PC机消息
* :
* :
*********************************************************************************************************
*/
void MODS_70H(void)
{
/*
:
01 ;
70 ;
0000 ;
0000 ;
0000 ;
CCCC : CRC16
:
*/
// uint16_t reg;
// uint16_t num;
// uint16_t value;
//
// reg = BEBufToUint16(&g_tModS.RxBuf[2]);
// num = BEBufToUint16(&g_tModS.RxBuf[4]);
// value = BEBufToUint32(&g_tModS.RxBuf[6]);
/* 无应答 */
g_tModS.TxCount = 0;
}
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/

View File

@ -253,7 +253,7 @@ AI : 示波器 CH1 均值, mV单位
0x5AA5 = InitCalibParam();
*/
#define REG03_CALIB_KEY 0xBFFF
#define REG03_CALIB_KEY 0xBFFF
/* 输入模拟量校准 */
#define REG03_CALIB_CH1_R1_X1 0xC000 /* CH1 X1档位 校准参数X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
@ -352,7 +352,7 @@ AI : 示波器 CH1 均值, mV单位
#define REG03_CALIB_PARAM_END REG03_CALIB_NTC_RES_Y4 + 1 /* 校准参数如最后1个寄存器 */
#define REG03_BOOT_VER 0xE000 /* BOOT 固件版本0x0102 表示V1.02 */
#define REG03_BOOT_VER 0xE000 /* BOOT 固件版本0x0102 表示V1.02 */
/* 重映射部分寄存器专用于UDP网路搜索 */
#define REG03_NET_CPU_ID0 0xFF00
@ -377,6 +377,10 @@ AI : 示波器 CH1 均值, mV单位
#define REG03_NET_SYSTEM_IP_L 0xFF13 /* 管理系统IP地址低位 */
#define REG03_NET_SYSTEM_PORT 0xFF14 /* 远程服务器端口 */
#define REG03_SEND_KEY 0xFF7E /* 特殊寄存器,模拟一个按键操作 */
#define REG03_RESET_TO_BOOT 0xFF7F /* 特殊寄存器复位进入BOOT
1 - APP
2 - BOOT

View File

@ -16,6 +16,7 @@
uint8_t fSaveReq_06H = 0; /* 保存基本参数请求用于06H和10H写寄存器函数 */
uint8_t fResetReq_06H = 0; /* 需要复位CPU因为网络参数变化 */
uint8_t fSaveCalibParam = 0; /* 保存校准参数请求用于06H和10H写寄存器函数 */
uint8_t fDisableAck = 0; /* 强制无需应答PC发虚拟按键时用到 */
static uint8_t WriteCalibRegValue_06H(uint16_t _reg_addr, uint16_t _reg_value);
static uint8_t ReadCalibRegValue_03H(uint16_t reg_addr, uint16_t *reg_value);
@ -1480,6 +1481,31 @@ uint8_t WriteRegValue_06H(uint16_t reg_addr, uint16_t reg_value)
}
break;
case REG03_SEND_KEY: /* 不应答给PC因为lua打印返回会冲突 */
{
uint8_t kid;
uint8_t state;
kid = reg_value >> 8;
state = reg_value;
if (kid == KID_S)
{
g_tVar.PC_CKeyState = 0;
g_tVar.PC_SKeyState = state;
g_tVar.PC_KeyEnabled = 1;
}
else if (kid == KID_C)
{
g_tVar.PC_SKeyState = 0;
g_tVar.PC_CKeyState = state;
g_tVar.PC_KeyEnabled = 2;
}
fDisableAck = 1; /* 不要应答 */
}
break;
/*********************************************************/
case REG03_RESET_TO_BOOT:
if (reg_value == JUMP_TO_APP) /* 复位进入APP */
@ -1509,7 +1535,7 @@ uint8_t WriteRegValue_06H(uint16_t reg_addr, uint16_t reg_value)
}
break;
/**************************** 时钟参数 *****************************/
/**************************** 时钟参数 *****************************/
case REG03_RTC_YEAR:
RTC_ReadClock();
@ -1564,16 +1590,20 @@ uint8_t WriteRegValue_06H(uint16_t reg_addr, uint16_t reg_value)
case REG03_CALIB_KEY: /* 校准参数写入使能控制 */
if (reg_value == 1)
{
g_tVar.CalibEnable = 1; /* 允许修改校准参数 */
g_tVar.CalibEnable = 1; /* 允许修改校准参数 */
}
else if (reg_value == 0)
{
g_tVar.CalibEnable = 0; /* 禁止修改校准参数 */
g_tVar.CalibEnable = 0; /* 禁止修改校准参数 */
}
else if (reg_value == 0x5AA5)
{
InitCalibParam();
}
else if (reg_value == 0xEF55) /* 恢复基本参数缺省值,不含校准参数 */
{
InitBaseParam();
}
break;
default:

View File

@ -25,6 +25,7 @@ uint8_t MODS_WriteRelay(uint16_t _reg, uint8_t _on);
extern uint8_t fSaveReq_06H; /* 保存参数请求用于06H写寄存器函数 */
extern uint8_t fResetReq_06H; /* 需要复位CPU因为网络参数变化 */
extern uint8_t fSaveCalibParam; /* 保存校准参数请求用于06H和10H写寄存器函数 */
extern uint8_t fDisableAck; /* 强制无需应答PC发虚拟按键时用到 */
#endif

View File

@ -39,6 +39,7 @@ static void MODS_65H(void);
extern void MODS_64H(void);
extern void MODS_66H(void);
extern void MODS_70H(void);
void MODS_ReciveNew(uint8_t _byte);
@ -212,7 +213,11 @@ static void MODS_AnalyzeApp(void)
case 0x66: /* SWD操作指令(读内存,写内存等) */
MODS_66H();
break;
case 0x70: /* PC控制帧无需应答。发送虚拟按键消息用 */
MODS_70H();
break;
default:
g_tModS.RspCode = RSP_ERR_CMD;
MODS_SendAckErr(g_tModS.RspCode); /* 告诉主机命令错误 */
@ -480,8 +485,15 @@ static void MODS_06H(void)
}
}
}
err_ret:
/* 不需要应答的情况 */
if (fDisableAck == 1)
{
fDisableAck = 0;
return;
}
if (g_tModS.RspCode == RSP_OK) /* 正确应答 */
{
MODS_SendAckOk();
@ -596,6 +608,13 @@ static void MODS_10H(void)
}
err_ret:
/* 不需要应答的情况 */
if (fDisableAck == 1)
{
fDisableAck = 0;
return;
}
if (g_tModS.RspCode == RSP_OK) /* 正确应答 */
{
MODS_SendAckOk();

View File

@ -30,17 +30,19 @@
#include "n76e003_flash.h"
#include "w25q_flash.h"
/* 64H帧子功能码定义 */
/* 66H帧子功能码定义 */
enum
{
H66_READ_MEM_INIT = 0, /* 读内存, */
H66_READ_MEM = 1, /* 写内存 */
H66_WRITE_MEM = 2, /* 写内存 */
H66_WRITE_MEM = 2, /* 写内存 */
H66_READ_DISP_MEM = 0x0100, /* 读显存 */
};
static void MODS66_ReadMem(void);
static void MODS66_WriteMem(void);
static void MODS66_ReadDispMem(void);
/*
*********************************************************************************************************
@ -57,8 +59,9 @@ void MODS_66H(void)
01 ;
66 ;
0000 ;
- 0
- 1
- 0pg_init())
- 1 (
- 2
0000 0000 : 4
0020 0000 : 4
CCCC : CRC16
@ -87,10 +90,14 @@ void MODS_66H(void)
{
MODS66_ReadMem();
}
else if (func >= H66_WRITE_MEM)
else if (func == H66_WRITE_MEM)
{
MODS66_WriteMem();
}
else if (func == H66_READ_DISP_MEM)
{
MODS66_ReadDispMem();
}
else
{
g_tModS.RspCode = RSP_ERR_VALUE; /* 数据值域错误 */
@ -129,6 +136,8 @@ static void MODS66_ReadMem(void)
- 0pg_init())
- 1 (
- 2
- 0x0100
0000 0000 : 4
0020 0000 : 4
CCCC : CRC16
@ -142,6 +151,7 @@ static void MODS66_ReadMem(void)
00 ; 0OK 1
XX :
CCCC : CRC16
*/
uint16_t func; /* 子功能代码 */
@ -295,6 +305,8 @@ static void MODS66_WriteMem(void)
01 ;
66 ;
0000 ;
0000 0000 : 4
0020 0000 : 4
00 ; 0OK 1
CCCC : CRC16
@ -333,6 +345,16 @@ static void MODS66_WriteMem(void)
g_tModS.TxBuf[g_tModS.TxCount++] = 0x66; /* 功能码 */
g_tModS.TxBuf[g_tModS.TxCount++] = func >> 8;
g_tModS.TxBuf[g_tModS.TxCount++] = func;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 24;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 16;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 8;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 0;
g_tModS.TxBuf[g_tModS.TxCount++] = 0 >> 24;
g_tModS.TxBuf[g_tModS.TxCount++] = 0 >> 16;
g_tModS.TxBuf[g_tModS.TxCount++] = 0 >> 8;
g_tModS.TxBuf[g_tModS.TxCount++] = 0 >> 0;
if (g_tProg.ChipType == CHIP_SWD_ARM)
{
@ -376,4 +398,73 @@ static void MODS66_WriteMem(void)
}
}
/*
*********************************************************************************************************
* : MODS66_ReadDispMem
* :
* :
* :
*********************************************************************************************************
*/
static void MODS66_ReadDispMem(void)
{
/*
:
01 ;
66 ;
0000 ; ,
- 0pg_init())
- 1 (
- 2
- 0x0100
0000 0000 : 4
0020 0000 : 4
CCCC : CRC16
:
01 ;
66 ;
0000 ;
0000 0000 : 4
0020 0000 : 4
00 ; 0OK 1
XX XX ... XX :
CCCC : CRC16
*/
uint16_t func; /* 子功能代码 */
uint32_t offset_addr;
uint32_t package_len; /* 本包数据长度 */
func = BEBufToUint16(&g_tModS.RxBuf[2]);
offset_addr = BEBufToUint32(&g_tModS.RxBuf[4]);
package_len = BEBufToUint32(&g_tModS.RxBuf[8]);
/* 读内存 */
g_tModS.TxCount = 0;
g_tModS.TxBuf[g_tModS.TxCount++] = g_tParam.Addr485; /* 本机地址 */
g_tModS.TxBuf[g_tModS.TxCount++] = 0x66; /* 功能码 */
g_tModS.TxBuf[g_tModS.TxCount++] = func >> 8;
g_tModS.TxBuf[g_tModS.TxCount++] = func;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 24;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 16;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 8;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 0;
g_tModS.TxBuf[g_tModS.TxCount++] = package_len >> 24;
g_tModS.TxBuf[g_tModS.TxCount++] = package_len >> 16;
g_tModS.TxBuf[g_tModS.TxCount++] = package_len >> 8;
g_tModS.TxBuf[g_tModS.TxCount++] = package_len >> 0;
g_tModS.TxBuf[g_tModS.TxCount++] = 0x00; /* 执行结果 00 */
memcpy((char *)&g_tModS.TxBuf[g_tModS.TxCount], (uint8_t *)(0x30000000 + offset_addr), package_len);
g_tModS.TxCount += package_len;
}
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/