mirror of
https://github.com/armfly/H7-TOOL_STM32H7_App.git
synced 2024-08-09 10:05:34 +08:00
增加PC机截屏功能,脱机烧录界面显示数据文件累加校验和
This commit is contained in:
parent
c6e12bb709
commit
81842c4bcf
11
CHANGELOG
11
CHANGELOG
@ -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
|
||||
|
9
Project/MDK-ARM(uV5)/EventRecorderStub.scvd
Normal file
9
Project/MDK-ARM(uV5)/EventRecorderStub.scvd
Normal 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>
|
3601
Project/MDK-ARM(uV5)/project.uvguix.ASUS
Normal file
3601
Project/MDK-ARM(uV5)/project.uvguix.ASUS
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -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>
|
||||
|
@ -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
|
||||
|
Binary file not shown.
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 /* 联机模式正文文字背景颜色 */
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
#include "includes.h"
|
||||
#include "md5.h"
|
||||
#include "crc32_stm32.h"
|
||||
|
||||
/*
|
||||
1、V7开发板的SD卡接口是用的SDMMC1,而这个接口仅支持AXI 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
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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) *********************************/
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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 *)ⅆ
|
||||
|
||||
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) *********************************/
|
||||
|
@ -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
|
||||
|
@ -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
50
User/modbus/modbus_msg.c
Normal 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) *********************************/
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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表示写内存
|
||||
- 0表示读内存(需要初始化pg_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)
|
||||
- 0表示读内存(需要初始化pg_init())
|
||||
- 1表示读内存 (连续读,无需初始化)
|
||||
- 2 写
|
||||
|
||||
- 0x0100 读显示屏缓冲区,用于截屏
|
||||
0000 0000 : 偏移地址 4字节
|
||||
0020 0000 : 数据长度 4字节
|
||||
CCCC : CRC16
|
||||
@ -142,6 +151,7 @@ static void MODS66_ReadMem(void)
|
||||
|
||||
00 ; 执行结果,0表示OK 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 ; 执行结果,0表示OK 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 ; 子功能,
|
||||
- 0表示读内存(需要初始化pg_init())
|
||||
- 1表示读内存 (连续读,无需初始化)
|
||||
- 2 写
|
||||
|
||||
- 0x0100 读显示屏缓冲区,用于截屏
|
||||
0000 0000 : 偏移地址 4字节
|
||||
0020 0000 : 数据长度 4字节
|
||||
CCCC : CRC16
|
||||
|
||||
从机应答:
|
||||
01 ; 从机地址
|
||||
66 ; 功能码
|
||||
0000 ; 子功能
|
||||
0000 0000 : 偏移地址 4字节
|
||||
0020 0000 : 数据长度 4字节
|
||||
|
||||
00 ; 执行结果,0表示OK 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) *********************************/
|
||||
|
Loading…
x
Reference in New Issue
Block a user