FIX | 和FPGA调试代码.

master
yuliang 6 months ago
parent ba020c0d55
commit 61effcd877

@ -212,8 +212,8 @@ enum DEBUG_CM_CMD
DEBUG_PRV_ADJ_MANUAL = 16,
DEBUG_PRV_CSG_CONFIG = 17,
DEBUG_PRV_CSG_CONFIG_SET = 18,
DEBUG_PRV_POSITION_WAVE = 19,
DEBUG_PRV_POSITION = 20
DEBUG_PRV_UPDATE_FPGA = 19,
DEBUG_PRV_UPDATE_RT = 20
};
/* . */

@ -72,6 +72,14 @@ typedef enum
DAU_COL_FLAG_WAVE_FORCE, // 强制录波
} DAU_COL_FLAG_E;
/* 共有命令字. */
typedef enum
{
DAU_UPD_NONE = 0,
DAU_UPD_OK = 1,
DAU_UPD_ERROR = 2,
} DAU_UPD_ERR_E;
/* DAU 全局寄存器. */
typedef struct
{
@ -107,6 +115,8 @@ typedef struct
uint32_t addr_reg; // DAU 寄存器触发录波 flash 地址
uint32_t col_time; // DAU 采集时间
uint8_t col_flag; // DAU 采集标志位
uint8_t update_flag; // DAU 升级标志位
uint8_t update_rt; // DAU 升级结果, 0 - 无效, 1 - 成功, 2 - 失败
uint32_t fault_utc; // 故障触发时间
uint32_t fault_ns; // 故障触发时间纳秒
int16_t fault_power[DAU_PORT_POWER_CNT][DAU_POWER_DATE_LEN]; // 故障触发工频波形采样电流值, 接地电流 0.1A, 运行电流 0.25A
@ -123,6 +133,7 @@ typedef struct
uint8_t buf_gps[DAU_GPS_BUF_LEN]; // GPS 收包缓存
uint16_t len_buf_gps; // 接收到的报文长度
uint8_t is_half_buf_gps; // DMA 收包一半的时候会产生中断, 这个标志用于过滤这给中断
uint8_t is_utc_ok; // GPS 对时 UTC 时间成功, 当多次 is_utc_valid 无效后才会设置为失败
uint8_t is_utc_valid; // GPS 对时 UTC 时间有效
uint32_t utc; // GPS 对时 UTC 时间
} dau_ctrl_t;
@ -136,6 +147,7 @@ extern dau_ctrl_t dau_ctrl;
/* Extern functions ----------------------------------------------------------*/
extern void dau_init(void);
extern void dau_spi_rw(int8_t rw, uint16_t addr, uint16_t len);
extern void dau_show(void);
#endif

@ -45,7 +45,7 @@
/* Define --------------------------------------------------------------------*/
/* 版本信息. */
#define VERSION_MAJOR 128
#define VERSION_MINOR 40
#define VERSION_MINOR 102
#define COMPILE_TIME (__DATE__" "__TIME__)
#define DEV_CAPABILITY_LEN 16

@ -50,7 +50,7 @@
#define FLASH_PAGE_NBPERBANK 256
/* spi flash分配示意图.注意:以下地址必须是扇区对齐.
0x0 0x4000 0x8000 0xc000 0x10000 0x18000 0x20000 0x100000 0xD00000 0xE00000 0xF00000 0x1000000
0x0 0x4000 0x8000 0xc000 0x10000 0x18000 0x20000 0x300000 0xD00000 0xE00000 0xF00000 0x1000000
*************************************************************************************************
| INFO | INFOB | RECO | RECOB | CONF | CONFB | TFTP IMG | WARE | LOG | DATA | STATE |
*************************************************************************************************/
@ -61,13 +61,11 @@
#define CONFIG_ADDRESS (uint32_t)0x10000
#define CONFIG_ADDRESS_BAK (uint32_t)0x18000
#define TFTP_APP_ADDRESS (uint32_t)0x20000
#define TFTP_APP_ADDRESS_END (uint32_t)0x100000
#define WARE_FAULT_ADDRESS (uint32_t)0x100000
#define WARE_FAULT_ADDRESS_END (uint32_t)0x280000
#define WARE_REG_ADDRESS (uint32_t)0x280000
#define WARE_REG_ADDRESS_END (uint32_t) 0xD00000
#define POSITION_ADDRESS (uint32_t)0x300000
#define POSITION_ADDRESS_END (uint32_t)0x500000
#define TFTP_APP_ADDRESS_END (uint32_t)0x300000
#define WARE_REG_ADDRESS (uint32_t)0x300000
#define WARE_REG_ADDRESS_END (uint32_t)0xB80000
#define WARE_FAULT_ADDRESS (uint32_t)0xB80000
#define WARE_FAULT_ADDRESS_END (uint32_t)0xD00000
#define LOG_ADDRESS (uint32_t)0xD00000
#define LOG_ADDRESS_END (uint32_t)0xE00000
#define FD_ADDRESS (uint32_t)0xE00000

@ -151,7 +151,6 @@ typedef struct
/* Extern global variables ---------------------------------------------------*/
extern uint64_t flash_log_id;
extern uint64_t fd_id;
extern uint64_t position_id;
extern uint64_t st_id;
extern fd_data_t fd_data;
@ -167,10 +166,6 @@ extern HAL_StatusTypeDef fd_modify(uint64_t id, fd_data_t *data);
extern HAL_StatusTypeDef fd_read(uint64_t id, fd_data_t *data);
extern HAL_StatusTypeDef fd_clear(void);
extern void fd_show(uint32_t num);
extern HAL_StatusTypeDef position_write(position_data_t *data);
extern HAL_StatusTypeDef position_read(uint64_t id, position_data_t *data);
extern HAL_StatusTypeDef position_clear(void);
extern void position_show(uint32_t num);
extern HAL_StatusTypeDef st_write(st_date_t *data);
extern HAL_StatusTypeDef st_read(uint64_t id, st_date_t *data);
extern HAL_StatusTypeDef st_clear(void);

@ -80,6 +80,7 @@ typedef struct
uint8_t err_cnt;
uint8_t send_cnt;
uint16_t update_len;
uint32_t app_len;
int32_t update_rt;
uint32_t keepalive;
uint16_t pkt_id;

@ -207,7 +207,7 @@ static void _ADC_energy_calculate(void)
/* 超级电容电压小于 3.3V 设备不启动. */
if(ADC_ctrl.ADCi_vbat < 3000)
{
system_shtudown(7200);
//system_shtudown(7200);
}
}

@ -119,7 +119,7 @@ static BaseType_t _cli_password(const char *string);
static BaseType_t _cli_reset(const char *string);
static BaseType_t _cli_save(const char *string);
static BaseType_t _cli_show(const char *string);
static BaseType_t _cli_test(const char *string);
static BaseType_t _cli_spi(const char *string);
static BaseType_t _cli_work_mode(const char *string);
#if LD_DEBUG
@ -146,7 +146,7 @@ static const CLI_Command_Definition_t cmd_pw = {"passwd", _cli_password,
static const CLI_Command_Definition_t cmd_reset = {"reset", _cli_reset, 1};
static const CLI_Command_Definition_t cmd_save = {"save", _cli_save, 1};
static const CLI_Command_Definition_t cmd_show = {"show", _cli_show, 2};
static const CLI_Command_Definition_t cmd_test = {"test", _cli_test, 1};
static const CLI_Command_Definition_t cmd_test = {"spi", _cli_spi, 3};
static const CLI_Command_Definition_t cmd_work_mode = {"work-mode", _cli_work_mode, 1};
/* Internal functions --------------------------------------------------------*/
@ -611,30 +611,67 @@ static BaseType_t _cli_show(const char *string)
}
/* 测试函数. */
static BaseType_t _cli_test(const char *string)
static BaseType_t _cli_spi(const char *string)
{
const char *param = NULL;
uint8_t param_len = 0;
int8_t rw = 0;
uint32_t addr = 0;
uint32_t len = 0;
param = FreeRTOS_CLIGetParameter(string, 1, (BaseType_t *)&param_len);
if (param != NULL)
if (NULL == param)
{
if (param[0] != 'h')
{
vty_print(cli_param_erro);
return pdFALSE;
}
else
{
vty_print("test\r\n Test.\r\n");
return pdFALSE;
}
vty_print(cli_param_erro);
return pdFALSE;
}
if (0 == strncmp(param, "h", param_len))
{
vty_print("spi <r> <addr> <len>\r\nspi <w> <addr> <data>\r\n");
return pdFALSE;
}
switch(param[0])
{
case 'r':
rw = 1;
break;
case 'w':
rw = 2;
break;
default:
vty_print(cli_param_erro);
return pdFALSE;
}
param = FreeRTOS_CLIGetParameter(string, 2, (BaseType_t *)&param_len);
if (NULL == param)
{
vty_print(cli_param_erro);
return pdFALSE;
}
if (sscanf(param, "%x", &addr) <= 0)
{
vty_print(cli_param_erro);
return pdFALSE;
}
param = FreeRTOS_CLIGetParameter(string, 3, (BaseType_t *)&param_len);
if (NULL == param)
{
vty_print(cli_param_erro);
return pdFALSE;
}
if (sscanf(param, "%x", &len) <= 0)
{
vty_print(cli_param_erro);
return pdFALSE;
}
//flash_log_write(FLASH_LOG_TYPE_ERROR, "test%d\r\n", 1);
//flash_log_write(FLASH_LOG_TYPE_WARNING, "test%d\r\n", 2);
//flash_log_write(FLASH_LOG_TYPE_NOTIFY, "test%d\r\n", 3);
//flash_log_write(FLASH_LOG_TYPE_INFO, "test%d\r\n", 4);
dau_spi_rw(rw, addr, len);
vty_print(cli_rv_ok);
return pdFALSE;
@ -861,15 +898,16 @@ void cli_start(void const * argument)
dev_config_init();
dev_config_flag_set(DEV_FLAG_CLI);
//dev_config_flag_unset(DEV_FLAG_CLI);
dev_config.keepalive = 300000;
dev_config.keepalive = 60000;
flash_log_init();
st_init();
/* 公共监控任务初始化. */
common_sys_init();
/* 默认开启的 debug. */
//dbg_cmd_hander(DBG_CMD_ON, DBG_M_DAU);
dbg_cmd_hander(DBG_CMD_ON, DBG_M_DAU);
dbg_cmd_hander(DBG_CMD_ON, DBG_M_DAU_TXRX);
//dbg_cmd_hander(DBG_CMD_ON, DBG_M_GPS);
dbg_cmd_hander(DBG_CMD_ON, DBG_M_4G);
//dbg_cmd_hander(DBG_CMD_ON, DBG_M_4G);
/* 初始化 ADC 采样任务. */
ADC_init();
/* 初始化 DAU 任务. */
@ -878,7 +916,7 @@ void cli_start(void const * argument)
if (!IS_MONITOR_BIT_SET(dev_config.flag, DEV_FLAG_ADJ)
&& !IS_MONITOR_BIT_SET(dev_config.flag, DEV_FLAG_FACTORY))
{
wl_init();
//wl_init();
}
/* 在这个标志置位前vty_print是原地循环等待,置位后变为任务调度. */

@ -49,9 +49,10 @@
#include "flash_log.h"
#include "ADC_collect.h"
#include "dau.h"
#include "wireless.h"
/* Private define ------------------------------------------------------------*/
#define DAU_WAVE_WAIT_MAX 5 // DAU 波形等待次数
#define DAU_WAVE_WAIT_MAX 3 // DAU 波形等待次数
/* 全局状态寄存器地址 -------------------------------- */
#define DAU_REG_ADDR_GSCR 0x0000 // 全局状态寄存器 - 软件特征寄存器
@ -87,9 +88,13 @@
#define DAU_GRTR_COMPLETE_Msk (0x1 << DAU_GRTR_COMPLETE_Pos) /*!< 0x0001 */
/* 全局控制寄存器地址 -------------------------------- */
#define DAU_REG_ADDR_GFWSR 0x0200 // 全局控制寄存器 - Flash 写选择寄存器
#define DAU_REG_ADDR_GSUPR 0x0202 // 全局控制寄存器 - 固件升级页寄存器
#define DAU_REG_ADDR_GCFTR 0x0203 // 全局控制寄存器 - 故障触发录波控制寄存器
#define DAU_REG_ADDR_GCRTR 0x0204 // 全局控制寄存器 - 寄存器触发录波控制寄存器
#define DAU_REG_ADDR_GCUR 0x0205 // 全局控制寄存器 - UTC 配置寄存器
#define DAU_REG_ADDR_GSUDR 0x0e00 // 全局控制寄存器 - 固件升级数据寄存器
/* 全局控制寄存器 - 故障触发录波控制寄存器 bit mask */
#define DAU_GCFTR_PORT_Pos (4) // 故障触发波形端口
@ -113,11 +118,9 @@
/* 通道状态寄存器地址 -------------------------------- */
#define DAU_REG_ADDR_PMSR 0x0300 // 通道状态寄存器 - 缺陷电流通道周波原始采样值的平均值寄存器
#define DAU_REG_ADDR_PPWR 0x03b0 // 通道状态寄存器 - 工频电流通道录波数据寄存器
#define DAU_REG_ADDR_PDWR 0x03c0 // 通道状态寄存器 - 缺陷电流通道录波数据寄存器
#define DAU_REG_ADDR_PFWR 0x03d0 // 通道状态寄存器 - 故障电流通道录波数据寄存器
#define DAU_REG_ADDR_PPWR 0x03b0 // 通道状态寄存器 - 通道录波数据寄存器
#define DAU_ID 0x0702 // DAU 软件识别码
#define DAU_ID 0x0702 // DAU 软件识别码
/* Private typedef -----------------------------------------------------------*/
/* 波形触发源 */
@ -148,6 +151,9 @@ const osThreadAttr_t dau_gps_attributes =
/* DAU 全局结构体 */
dau_ctrl_t dau_ctrl;
static struct tm _dau_tm;
int8_t _dau_spi_rw;
uint16_t _dau_spi_addr;
uint16_t _dau_spi_len;
/* Private function prototypes -----------------------------------------------*/
/* Internal functions --------------------------------------------------------*/
@ -172,7 +178,7 @@ int32_t _dau_reg_write(uint16_t addr, uint16_t len)
DBG(DBG_M_DAU_TXRX, "DAU write send(%d):\r\n", len);
if (dbg_stat_get(DBG_M_DAU_TXRX))
{
buf_print(pkt_tx, len > 16 ? 16 : len);
buf_print(pkt_tx, len > 32 ? 32 : len);
}
/* 发送数据. */
@ -243,7 +249,7 @@ int32_t _dau_reg_read(uint16_t addr, uint16_t len)
DBG(DBG_M_DAU_TXRX, "DAU read recv(%d):\r\n", len);
if (dbg_stat_get(DBG_M_DAU_TXRX))
{
buf_print(pkt_rx + 2, len > 16 ? 16 : len);
buf_print(pkt_rx + 2, len > 32 ? 32 : len);
vty_print("\r\n");
}
@ -319,6 +325,90 @@ static void _dau_data_save(void)
fd_write(&fd_data);
}
/* description: DAU UTC 对时处理
param:
return: */
int32_t _dau_update(void)
{
uint8_t *data = (uint8_t*)&dau_ctrl.buf_dau_tx[2];
uint16_t *reg = (uint16_t*)&dau_ctrl.buf_dau_tx[2];
uint16_t cnt = 0;
uint16_t page_cnt = 0;
//uint32_t app_len = wl_ctrl.app_len;
uint32_t app_len = 2097378;
uint32_t len = 0;
uint32_t addr = TFTP_APP_ADDRESS;
int32_t rv = HAL_ERROR;
/* 初始化状态. */
dau_ctrl.update_rt = DAU_UPD_NONE;
/* 发送升级数据 */
while(1)
{
/* 组装数据报文, 报文头是大端模式 DAU_REG_ADDR_GSUDR */
len = app_len < 1024 ? app_len : 1024;
if (0 == len)
{
/* 无数据, 直接结束 */
break;
}
/* 读取固件数据 */
E_RETURN(spi_flash_read(addr, data, 1024));
/* 先发送数据报文, 0x0e00 */
E_RETURN(_dau_reg_write(DAU_REG_ADDR_GSUDR, 1024));
/* 再发送页报文, 0x0202 */
*reg = page_cnt;
E_RETURN(_dau_reg_write(DAU_REG_ADDR_GSUPR, 2));
/* 向 0x0200 写 1, 表示固件升级 */
*reg = 1;
E_RETURN(_dau_reg_write(DAU_REG_ADDR_GFWSR, sizeof(uint16_t)));
/* 等待 spi flash 完成, 0x0002 bit2 为高 */
cnt = 0;
while(1)
{
osDelay(500);
cnt++;
if (cnt > 3)
{
DBG(DBG_M_DAU, "DAU update timeout\r\n");
return HAL_TIMEOUT;
}
/* 读取 spi flash 状态 DAU_REG_ADDR_GSR */
E_RETURN(_dau_reg_read_global_state());
/* 0 - 空闲, 1 - 忙 */
if (!((dau_ctrl.reg_global.GSR & DAU_GSR_FLASH_Msk) >> DAU_GSR_FLASH_Pos))
{
break;
}
}
/* 结束直接返回 */
if (len < 1024)
{
break;
}
/* 更新参数 */
app_len -= len;
page_cnt++;
addr += 1024;
}
/* 向 DAU_REG_ADDR_GFWSR 写 0, 回复标志 */
*reg = 0;
E_RETURN(_dau_reg_write(DAU_REG_ADDR_GFWSR, sizeof(uint16_t)));
return HAL_OK;
}
/* description: DAU UTC 对时处理
param:
return: */
@ -327,12 +417,14 @@ void _dau_utc(void)
uint32_t *utc = (uint32_t*)&dau_ctrl.buf_dau_tx[2];
/* dau 主循环大概 250ms 运行一次, 在第 3 次循环 (500 ~ 750ms) 对时, 此时 GPS 对时一定是可用的 */
if (500000000 < dau_ctrl.reg_global.GNR && dau_ctrl.reg_global.GNR <= 750000000
if (50000000 < dau_ctrl.reg_global.GNR && dau_ctrl.reg_global.GNR <= 75000000
&& dau_ctrl.is_utc_valid
&& dau_ctrl.reg_global.GUR != dau_ctrl.utc)
{
*utc = dau_ctrl.utc;
_dau_reg_write(DAU_REG_ADDR_GCUR, sizeof(uint32_t));
vty_print("Change\r\n");
vty_print("%d %d %d %d\r\n", dau_ctrl.reg_global.GUR, dau_ctrl.reg_global.GNR, dau_ctrl.is_utc_valid, dau_ctrl.utc);
}
}
@ -357,7 +449,7 @@ int32_t _dau_wave_col_start(void)
DBG(DBG_M_DAU, "DAU wave err\r\n", rv);
return HAL_TIMEOUT;
}
osDelay(100);
osDelay(3000);
E_RETURN(_dau_reg_read_global_state());
if ((dau_ctrl.reg_global.GRTR & DAU_GRTR_COMPLETE_Msk) >> DAU_GRTR_COMPLETE_Pos)
@ -366,6 +458,7 @@ int32_t _dau_wave_col_start(void)
}
i++;
vty_print("#D5 %d\r\n", i);
}
return rv;
@ -397,6 +490,7 @@ int32_t _dau_wave_col_fault(void)
E_RETURN(_dau_reg_write(DAU_REG_ADDR_GCFTR, sizeof(uint16_t)));
/* 等待 DAU 准备故障数据 */
j = 0;
while(1)
{
if (j >= DAU_WAVE_WAIT_MAX)
@ -453,7 +547,6 @@ int32_t _dau_wave_col_fault(void)
return: HAL_xxx */
int32_t _dau_wave_col_defect(void)
{
#if 0
uint16_t *reg = (uint16_t*)&dau_ctrl.buf_dau_tx[2];
uint8_t i = 0;
uint8_t j = 0;
@ -468,19 +561,19 @@ int32_t _dau_wave_col_defect(void)
dau_ctrl.reg_defect_max[i] = dau_ctrl.reg_port_state.MAX[i];
if (dau_ctrl.reg_port_state.MAX[i] > dev_config.wave_threshold)
{
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_DEFECT);
is_exceed = TRUE;
}
}
/* 没有超过阈值直接返回 */
if (is_exceed)
{
MONITOR_BITMAP_RESET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_DEFECT);
return rv;
}
/* 没有超过阈值并没有强制录波直接返回 */
//if (!is_exceed && !IS_MONITOR_BIT_SET(dau_ctrl.col_flag, DAU_COL_FLAG_WAVE_FORCE))
//{
// MONITOR_BITMAP_RESET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_DEFECT);
// return HAL_OK;
//}
/* 擦除 flash */
addr = dau_ctrl.addr_reg;
vty_print("#D3 %x\r\n", addr);
for(i = 0; i < 2; i++)
{
E_RETURN(spi_flash_erase(addr, SPI_CMD_BLOCK64_ERASE));
@ -497,6 +590,7 @@ int32_t _dau_wave_col_defect(void)
E_RETURN(_dau_reg_write(DAU_REG_ADDR_GCRTR, sizeof(uint16_t)));
/* 等待 DAU 准备缺陷数据 */
j = 0;
while(1)
{
if (j >= DAU_WAVE_WAIT_MAX)
@ -504,7 +598,7 @@ int32_t _dau_wave_col_defect(void)
DBG(DBG_M_DAU, "DAU defect wave err\r\n", rv);
return HAL_TIMEOUT;
}
osDelay(10);
osDelay(5);
E_RETURN(_dau_reg_read_global_state());
if ((dau_ctrl.reg_global.GRTR & DAU_GRTR_DEFECT_WAVE_Msk) >> DAU_GRTR_DEFECT_WAVE_Pos)
@ -513,18 +607,25 @@ int32_t _dau_wave_col_defect(void)
}
j++;
vty_print("#D6 %d\r\n", j);
}
for(j = 0; j < DAU_PKT_DEFECT_CNT; j++)
{
E_RETURN(_dau_reg_read(DAU_REG_ADDR_PDWR + i, DAU_PKT_DEFECT_BYTE_CNT));
vty_print("%d %d\r\n", i, j);
E_RETURN(_dau_reg_read(DAU_REG_ADDR_PPWR, DAU_PKT_DEFECT_BYTE_CNT));
osDelay(200);
E_RETURN(spi_flash_write(addr, &dau_ctrl.buf_dau_rx[2], DAU_PKT_DEFECT_BYTE_CNT));
addr += DAU_PKT_DEFECT_BYTE_CNT;
}
vty_print("DE%d\r\n", i);
}
vty_print("#D4 %x\r\n", addr);
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_DEFECT);
return rv;
#endif
#if 0
uint8_t i = 0;
uint8_t j = 0;
uint8_t is_exceed = FALSE;
@ -573,6 +674,7 @@ int32_t _dau_wave_col_defect(void)
vty_print("#D4 %x\r\n", addr);
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_DEFECT);
return rv;
#endif
}
/* description: 工频波形采集
@ -580,11 +682,11 @@ int32_t _dau_wave_col_defect(void)
return: HAL_xxx */
int32_t _dau_wave_col_power(DAU_SOURCE_E source)
{
#if 0
uint16_t *reg = (uint16_t*)&dau_ctrl.buf_dau_tx[2];
int16_t *power = NULL;
uint8_t i = 0;
uint8_t j = 0;
int32_t rv = HAL_ERROR;
/* 读取工频数据 */
for(i = 0; i < DAU_PORT_POWER_CNT; i++)
@ -602,6 +704,7 @@ int32_t _dau_wave_col_power(DAU_SOURCE_E source)
}
/* 等待 DAU 准备工频数据 */
j = 0;
while(1)
{
if (j >= DAU_WAVE_WAIT_MAX)
@ -609,7 +712,7 @@ int32_t _dau_wave_col_power(DAU_SOURCE_E source)
DBG(DBG_M_DAU, "DAU power wave err\r\n");
return HAL_TIMEOUT;
}
osDelay(10);
osDelay(5);
E_RETURN(_dau_reg_read_global_state());
if (DAU_SOURCE_FAULT == source)
@ -628,21 +731,24 @@ int32_t _dau_wave_col_power(DAU_SOURCE_E source)
}
j++;
vty_print("#D7 %d\r\n", j);
}
/* 选择存储位置, 读取数据 */
power = (DAU_SOURCE_FAULT == source) ? dau_ctrl.fault_power[i] : dau_ctrl.reg_power[i];
for(j = 0; j < DAU_PKT_POWER_CNT; j++)
{
E_RETURN(_dau_reg_read(DAU_REG_ADDR_PPWR + i, DAU_PKT_POWER_BYTE_CNT));
E_RETURN(_dau_reg_read(DAU_REG_ADDR_PPWR, DAU_PKT_POWER_BYTE_CNT));
osDelay(200);
memcpy(power, &dau_ctrl.buf_dau_rx[2], DAU_PKT_POWER_BYTE_CNT);
power += DAU_PKT_POWER_BYTE_CNT >> 1;
}
vty_print("PO%d\r\n", i);
}
return HAL_OK;
#endif
#if 0
int16_t *power = NULL;
uint8_t i = 0;
uint8_t j = 0;
@ -661,6 +767,7 @@ int32_t _dau_wave_col_power(DAU_SOURCE_E source)
}
return HAL_OK;
#endif
}
/* description: DAU 工频电流计算
@ -843,14 +950,14 @@ int32_t _dau_wave_col_trigger_by_reg(void)
/* 定时开始采集 */
tick = HAL_GetTick();
if ((tick - dau_ctrl.col_time) < (dev_config.collect_interval * 600000)
if ((tick - dau_ctrl.col_time) < (dev_config.collect_interval * 60000)
&& !IS_MONITOR_BIT_SET(dau_ctrl.col_flag, DAU_COL_FLAG_WAVE_FORCE))
{
return HAL_OK;
}
//E_RETURN(_dau_wave_col_start());
E_RETURN(_dau_wave_col_defect());
E_RETURN(_dau_wave_col_start());
//E_RETURN(_dau_wave_col_defect());
E_RETURN(_dau_wave_col_power(DAU_SOURCE_REG));
_dau_power_calculate(DAU_SOURCE_REG);
@ -871,7 +978,6 @@ static void _dau_init(void)
dau_ctrl.spi = &hspi1;
vty_print("#D7 %x\r\n", st_data.addr_fault);
if (st_data.addr_fault >= WARE_FAULT_ADDRESS && st_data.addr_fault < WARE_FAULT_ADDRESS_END
&& 0 == (st_data.addr_fault & 0x1ffff))
{
@ -881,8 +987,8 @@ static void _dau_init(void)
{
dau_ctrl.addr_fault = WARE_FAULT_ADDRESS;
}
vty_print("#D8 %x\r\n", st_data.addr_reg);
vty_print("#D7 %x %x\r\n", st_data.addr_fault, dau_ctrl.addr_fault);
if (st_data.addr_reg >= WARE_REG_ADDRESS && st_data.addr_reg < WARE_REG_ADDRESS_END
&& 0 == (st_data.addr_reg & 0x1ffff))
{
@ -892,6 +998,7 @@ static void _dau_init(void)
{
dau_ctrl.addr_reg = WARE_REG_ADDRESS;
}
vty_print("#D8 %x %x\r\n", st_data.addr_reg, dau_ctrl.addr_reg);
/* 开启第一次采集前, 默认上传完成 */
dau_ctrl.col_time = 600000;
@ -919,7 +1026,13 @@ static void _dau_init(void)
return: */
static void _dau_start(void *argument)
{
//int32_t rv = HAL_ERROR;
//uint16_t *buf = (uint16_t*)(&dau_ctrl.buf_dau_rx[2]);
uint16_t *buf = NULL;
uint32_t addr = 0;
uint8_t i = 0;
uint8_t j = 0;
uint16_t k = 0;
int32_t rv = HAL_ERROR;
/* 状态初始化 */
_dau_init();
@ -929,10 +1042,24 @@ static void _dau_start(void *argument)
osDelay(5000);
common_watchdog_set(COM_WDG_DAU);
//rv = _dau_reg_read_global_state();
//if (rv != HAL_OK)
/* 读取全局状态寄存器 */
rv = _dau_reg_read_global_state();
if (rv != HAL_OK)
{
continue;
}
/* 处理升级 */
//if (dau_ctrl.update_flag)
//{
// continue;
// if (HAL_OK == _dau_update())
// {
// dau_ctrl.update_rt = DAU_UPD_OK;
// }
// else
// {
// dau_ctrl.update_rt = DAU_UPD_ERROR;
// }
//}
/* utc 对时处理 */
@ -943,13 +1070,90 @@ static void _dau_start(void *argument)
/* 循环工频缺陷电流采集 */
_dau_wave_col_trigger_by_reg();
if (1 == _dau_spi_rw)
{
_dau_spi_rw = 0;
_dau_reg_read(_dau_spi_addr, _dau_spi_len << 1);
}
else if(2 == _dau_spi_rw)
{
uint16_t *data = (uint16_t*)&dau_ctrl.buf_dau_tx[2];
*data = _dau_spi_len;
_dau_spi_rw = 0;
_dau_reg_write(_dau_spi_addr, 2);
}
common_watchdog_set(COM_WDG_DAU);
#if 0
addr = dau_ctrl.addr_reg;
for(i = 0; i < 3; i++)
{
vty_print("DEFECT %x %d\r\n", addr, i);
for(j = 0; j < DAU_PKT_DEFECT_CNT; j++)
{
common_watchdog_set(COM_WDG_DAU);
spi_flash_read(addr, &dau_ctrl.buf_dau_rx[2], 1024);
addr += DAU_PKT_DEFECT_BYTE_CNT;
for(k = 0; k < 512;)
{
vty_print("%04x ", buf[k++]);
if(0 == k % 32)
{
osDelay(100);
vty_print("\r\n");
}
}
if(k % 32 != 0)
{
osDelay(100);
vty_print("\r\n");
}
}
vty_print("\r\n");
}
#endif
#if 1
for(i = 0; i < DAU_PORT_POWER_CNT; i++)
{
vty_print("POWER %d\r\n", i);
buf = (uint16_t*)dau_ctrl.reg_power[i];
for(j = 0; j < DAU_PKT_POWER_CNT; j++)
{
common_watchdog_set(COM_WDG_DAU);
for(k = 0; k < 512;)
{
vty_print("%-04x ", buf[k++]);
if(0 == k % 32)
{
osDelay(100);
vty_print("\r\n");
}
}
if(k % 32 != 0)
{
osDelay(100);
vty_print("\r\n");
}
buf += 512;
}
vty_print("\r\n");
}
#endif
while(1)
{
osDelay(5000);
common_watchdog_set(COM_WDG_DAU);
//vty_print("sleep\r\n");
}
}
}
/* description: GPS 报文处理 ($GNZDA,235949.012,05,01,1980,,*4F)
param:
return: */
static void _dau_gps_process(void)
static int32_t _dau_gps_process(void)
{
char *pkt = (char*)dau_ctrl.buf_gps;
uint8_t n = 0;
@ -982,14 +1186,14 @@ static void _dau_gps_process(void)
n = sscanf(&pkt[i], "$GNZDA,%02d%02d%02d.%d,%02d,%02d,%04d", &hour, &min, &sec, &ms, &day, &mon, &year);
if (n != 7)
{
break;
return HAL_ERROR;
}
DBG(DBG_M_GPS, "%d/%d/%d %d:%d:%d\r\n", year, mon, day, hour, min, sec);
/* 小于 2024 说明对时不成功. */
if (year < 2024)
{
break;
return HAL_ERROR;
}
_dau_tm.tm_year = year - 1900;
_dau_tm.tm_mon = mon - 1;
@ -1000,9 +1204,10 @@ static void _dau_gps_process(void)
dau_ctrl.utc = mktime(&_dau_tm);
rtc_time_set(dau_ctrl.utc);
dau_ctrl.is_utc_valid = TRUE;
break;
return HAL_OK;
}
return HAL_ERROR;
}
/* description: GPS 初始化
@ -1025,13 +1230,16 @@ static void _dau_gps_init(void)
static void _dau_gps_start(void *argument)
{
uint32_t notify_value = 0xff;
uint32_t err_cnt = 5;
/* 状态初始化 */
_dau_gps_init();
for (;;)
{
common_watchdog_set(COM_WDG_GPS);
/* 连续 5 次失败才认为对时失败 */
dau_ctrl.is_utc_ok = (err_cnt < 5);
common_watchdog_set(COM_WDG_GPS);
/* 开启串口空闲中断收包 */
if (HAL_OK == HAL_UARTEx_ReceiveToIdle_DMA(dau_ctrl.uart, dau_ctrl.buf_gps, DAU_GPS_BUF_LEN))
@ -1046,22 +1254,33 @@ static void _dau_gps_start(void *argument)
{
/* 收包超时 */
dau_ctrl.is_utc_valid = FALSE;
err_cnt++;
continue;
}
dau_ctrl.is_utc_valid = FALSE;
DBG(DBG_M_GPS, "Len %d\r\n", dau_ctrl.len_buf_gps);
/* 命令过长. */
if (dau_ctrl.len_buf_gps >= DAU_GPS_BUF_LEN)
{
dau_ctrl.is_utc_valid = FALSE;
err_cnt++;
continue;
}
/* 字符串结束标志 */
dau_ctrl.buf_gps[dau_ctrl.len_buf_gps] = 0;
_dau_gps_process();
if (HAL_OK == _dau_gps_process())
{
dau_ctrl.is_utc_valid = TRUE;
err_cnt = 0;
}
else
{
dau_ctrl.is_utc_valid = FALSE;
err_cnt++;
}
}
}
@ -1075,6 +1294,16 @@ void dau_init(void)
dau_ctrl.gps_handle = osThreadNew(_dau_gps_start, NULL, &dau_gps_attributes);
}
/* description: spi 接口测试函数
param:
return: */
void dau_spi_rw(int8_t rw, uint16_t addr, uint16_t len)
{
_dau_spi_rw = rw;
_dau_spi_addr = addr;
_dau_spi_len = len;
}
/* description: dau 显示接口
param:
return: */
@ -1083,6 +1312,7 @@ void dau_show(void)
struct tm *day = NULL;
uint32_t utc = dau_ctrl.utc;
vty_print("state: %d\r\n", dau_ctrl.is_utc_ok);
if (dau_ctrl.is_utc_valid)
{
utc += 28800;

@ -72,9 +72,6 @@ uint64_t fd_id;
fd_data_t fd_data;
static fd_data_t fd_buf;
uint64_t position_id;
static position_data_t position_buf;
uint64_t st_id;
static st_date_t st_buf;
@ -190,61 +187,6 @@ static HAL_StatusTypeDef _fd_read(uint64_t id, fd_data_t *data)
return HAL_OK;
}
/* 根据log id获取log在flash中的地址. */
__STATIC_INLINE uint32_t _position_addr_get(uint64_t id)
{
return POSITION_ADDRESS + POSITION_BUF_LEN * ((id - 1) & (POSITION_NUM - 1));
}
/* 获取log中目前最大的id号. */
static HAL_StatusTypeDef _position_max_id_get(void)
{
uint32_t addr = POSITION_ADDRESS;
uint64_t id = 0;
uint64_t i = 1;
while(addr < POSITION_ADDRESS_END)
{
/* 理论上不会出错,如果出错应该是出现硬件致命错误. */
if (spi_flash_read(addr, (uint8_t*)(&id), POSITION_ID_LEN) != HAL_OK)
{
return HAL_ERROR;
}
if (POSITION_INVALID_ID == id)
{
break;
}
if (id != i)
{
break;
}
if (id > position_id)
{
position_id = id;
}
addr += POSITION_BUF_LEN;
i++;
}
return HAL_OK;
}
/* 根据 id 读取 data, id从1开始,如果id为0,则读取当前log. */
static HAL_StatusTypeDef _position_read(uint64_t id, position_data_t *data)
{
uint32_t addr = 0;
addr = _position_addr_get(id);
HAL_E_RETURN(spi_flash_read(addr, (uint8_t*)data, sizeof(position_data_t)));
return HAL_OK;
}
/* 根据log id获取log在flash中的地址. */
__STATIC_INLINE uint32_t _st_addr_get(uint64_t id)
{
@ -423,12 +365,6 @@ void flash_log_init(void)
if (_st_max_id_get() != HAL_OK)
ERROR_PRINT(-1);
if (DEV_TYPE_CT_P == dev_info.type_s)
{
if (_position_max_id_get() != HAL_OK)
ERROR_PRINT(-1);
}
}
/* 向flash中写入1条log数据,大小不能超过128byte. */
@ -558,116 +494,6 @@ void fd_show(uint32_t num)
_flash_log_mutex_unlock();
}
/* 向flash中写入1条log数据,大小不能超过128byte. */
HAL_StatusTypeDef position_write(position_data_t *data)
{
uint32_t addr = 0;
_flash_log_mutex_lock();
/* 组装数据. */
data->id = ++position_id;
HAL_RTC_GetTime(&hrtc, &log_time, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &log_date, RTC_FORMAT_BIN);
log_tm.tm_year = log_date.Year + 100;
log_tm.tm_mon = log_date.Month - 1;
log_tm.tm_mday = log_date.Date;
log_tm.tm_hour = log_time.Hours;
log_tm.tm_min = log_time.Minutes;
log_tm.tm_sec = log_time.Seconds;
data->run_time = mktime(&log_tm) - 28800;
/* 获取当前写入地址. */
addr = _position_addr_get(position_id);
/* 如果写入地址是页对其的, 需要先擦除, 再写入. */
if (0 == (addr & (SPI_FLASH_SECTOR_SIZE - 1)))
FLASH_LOG_RETURN_MUTEX(spi_flash_erase(addr, SPI_CMD_SECTOR_ERASE));
/* 写入 flash, 写入长度是数据长度 + id 大小. */
FLASH_LOG_RETURN_MUTEX(spi_flash_write(addr, (uint8_t*)data, sizeof(position_data_t)));
_flash_log_mutex_unlock();
return HAL_OK;
}
/* 根据 id 读取 data, id从1开始,如果id为0,则读取当前log. */
HAL_StatusTypeDef position_read(uint64_t id, position_data_t *data)
{
if (0 == id || id > position_id)
{
return HAL_ERROR;
}
_flash_log_mutex_lock();
FLASH_LOG_RETURN_MUTEX(_position_read(id, data));
_flash_log_mutex_unlock();
return HAL_OK;
}
/* 清空log. */
HAL_StatusTypeDef position_clear(void)
{
_flash_log_mutex_lock();
position_id = 0;
_flash_log_mutex_unlock();
return HAL_OK;
}
/* 显示num条log数据. */
void position_show(uint32_t num)
{
uint16_t index = 0;
uint32_t time = 0;
struct tm *day;
_flash_log_mutex_lock();
/* 没有log. */
if (0 == position_id)
{
_flash_log_mutex_unlock();
return;
}
/* 初始化变量 */
num = num > POSITION_NUM ? POSITION_NUM : num;
position_buf.id = position_id;
for(index = 0; index < num; index++)
{
if (_position_read(position_buf.id, &position_buf) != HAL_OK)
break;
/* 读到全F,表示结束了. */
if (POSITION_INVALID_ID == position_buf.id)
break;
time = position_buf.run_time + 28800;
day = localtime(&time);
vty_print("%-08lld %-04d/%-02d/%-02d %-02d:%-02d:%-02d ", position_buf.id, day->tm_year + 1900, day->tm_mon + 1,
day->tm_mday, day->tm_hour, day->tm_min, day->tm_sec);
vty_print("%-02d/%-02d %f/%d/%d %f/%d/%d %f/%d/%d %d/%d/%d\r\n",
position_buf.vol, position_buf.temperature,
position_buf.wave_info.v[0], position_buf.wave_info.s[0], position_buf.wave_info.ns[0],
position_buf.wave_info.v[1], position_buf.wave_info.s[1], position_buf.wave_info.ns[1],
position_buf.wave_info.v[2], position_buf.wave_info.s[2], position_buf.wave_info.ns[2],
position_buf.wave_info.file_s, position_buf.wave_info.file_ns, position_buf.wave_info.file_feq);
position_buf.id--;
if (0 == position_buf.id)
break;
}
_flash_log_mutex_unlock();
}
/* 向flash中写入1条log数据,大小不能超过128byte. */
HAL_StatusTypeDef st_write(st_date_t *data)
{
@ -758,7 +584,6 @@ void st_show(uint32_t num)
/* 初始化设备状态. */
void st_init(void)
{
vty_print("#F1 %lld\r\n", st_id);
if (st_read(st_id, &st_data) != HAL_OK)
{
_st_default();

@ -489,6 +489,8 @@ void MX_USART3_UART_Init_WL(void)
{
huart3.Instance = USART3;
huart3.Init.BaudRate = 230400;
//huart3.Init.BaudRate = 115200;
//huart3.Init.BaudRate = 19200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;

@ -86,6 +86,8 @@ typedef enum
WL_STATE_POWER_FAULT,
WL_STATE_FAULT,
WL_STATE_UPDATE,
WL_STATE_UPDATE_RT,
WL_STATE_UPDATE_FPGA_RT,
WL_STATE_KEEPALIVE,
WL_STATE_END = 255
} WL_STATE_E;
@ -176,9 +178,9 @@ static struct tm wl_tm;
static void _wl_4G_send_reset(void);
static void _wl_4G_send_update(void);
static void _wl_4G_send_cfg_set(void);
static void _wl_4G_send_update_rt(void);
static void _wl_4G_send_time(void);
static void _wl_4G_send_wave_force(void);
static void _wl_4G_send_update_fpga(void);
/* Internal functions --------------------------------------------------------*/
/* 4G 模块发送数据. */
@ -207,7 +209,7 @@ static int32_t _wl_4G_transmit(uint8_t *data, uint16_t len)
rv = HAL_UART_Transmit_DMA(wl_ctrl.uart, data, len);
if (rv != HAL_OK)
{
osDelay(100);
osDelay(200);
rv = HAL_UART_Transmit_DMA(wl_ctrl.uart, data, len);
}
@ -487,8 +489,6 @@ static void _wl_4G_recv_update(uint8_t *cmd, uint32_t len)
{
/* 开始时置升级结果为错误. */
wl_ctrl.update_rt = HAL_ERROR;
wl_ctrl.state = WL_STATE_UPDATE;
wl_ctrl.time_update = HAL_GetTick();
while(addr != TFTP_APP_ADDRESS_END)
{
@ -500,10 +500,13 @@ static void _wl_4G_recv_update(uint8_t *cmd, uint32_t len)
addr += SPI_FLASH_BLOCK64_SIZE;
}
}
wl_ctrl.state = WL_STATE_UPDATE;
wl_ctrl.time_update = HAL_GetTick();
/* 计算写 FLASH 地址, 并写入 FLASH. */
addr = TFTP_APP_ADDRESS + m_head->index * DEBUG_DATA_SIZE;
if (m_head->len > DEBUG_DATA_SIZE)
if (m_head->len > DEBUG_DATA_SIZE
|| m_head->index >= 2944)
{
return;
}
@ -541,7 +544,7 @@ static void _wl_4G_recv_update(uint8_t *cmd, uint32_t len)
{
wl_ctrl.mul_idx = 0;
wl_ctrl.update_len = 0;
wl_ctrl.state = WL_STATE_END;
wl_ctrl.state = WL_STATE_UPDATE_RT;
}
}
@ -588,18 +591,22 @@ static void _wl_4G_recv_cfg_set(uint8_t *cmd, uint32_t len)
/* 升级结果报文回复 */
static void _wl_4G_recv_update_rt(uint8_t *cmd, uint32_t len)
{
proto_head_t *head = (proto_head_t*)cmd;
uint32_t reset_delay = 2;
wl_ctrl.pkt_id_recv = head->pkt_id;
_wl_4G_send_update_rt();
uint32_t reset_delay = 2;
/* 升级成功就重启 */
if (HAL_OK == wl_ctrl.update_rt)
{
/* 延迟 2s 等待串口回复报文发送完成. */
flash_log_write(FLASH_LOG_TYPE_INFO, "Update APP system sleep 0s!\r\n");
common_sys_set(COM_SYS_RESET, (void*)&reset_delay);
}
wl_ctrl.state = WL_STATE_END;
wl_ctrl.time_send = 0;
wl_ctrl.send_cnt = 0;
_wl_4G_pkt_id_update();
return;
}
/* 保活报文回复. */
@ -619,7 +626,7 @@ static void _wl_4G_recv_time(uint8_t *cmd, uint32_t len)
proto_head_t *head = (proto_head_t*)cmd;
uint32_t *utc = (uint32_t*)(cmd + sizeof(proto_head_t));
if (!dau_ctrl.is_utc_valid)
if (!dau_ctrl.is_utc_ok)
{
rtc_time_set(*utc);
}
@ -784,6 +791,83 @@ static void _wl_4G_recv_wave_force(uint8_t *cmd, uint32_t len)
_wl_4G_send_wave_force();
}
/* 设备 FPGA 升级回复 */
static void _wl_4G_recv_update_fpga(uint8_t *cmd, uint32_t len)
{
proto_head_t *head = (proto_head_t*)cmd;
mul_head_t *m_head = (mul_head_t*)(cmd + sizeof(proto_head_t));
uint8_t *data = (uint8_t*)(cmd + sizeof(proto_head_t) + sizeof(mul_head_t));
uint32_t addr = TFTP_APP_ADDRESS;
uint32_t app_len = 0;
/* index 为 0 表示是首保, 需要擦除 FLASH. */
if (0 == m_head->index)
{
while(addr != TFTP_APP_ADDRESS_END)
{
if (spi_flash_erase(addr, SPI_CMD_BLOCK64_ERASE) != HAL_OK)
{
return;
}
addr += SPI_FLASH_BLOCK64_SIZE;
}
}
wl_ctrl.state = WL_STATE_UPDATE;
wl_ctrl.time_update = HAL_GetTick();
/* 计算写 FLASH 地址, 并写入 FLASH. */
addr = TFTP_APP_ADDRESS + m_head->index * DEBUG_DATA_SIZE;
if (m_head->len > DEBUG_DATA_SIZE
|| m_head->index >= 2944)
{
return;
}
else if(m_head->len > 0)
{
if (spi_flash_write(addr, data, m_head->len) != HAL_OK)
{
return;
}
}
/* 长度小于 DEBUG_FLASH_BUF_SIZE 则认为是最后一包. */
if(m_head->len < DEBUG_DATA_SIZE)
{
/* 校验数据. */
app_len = addr - TFTP_APP_ADDRESS + m_head->len;
wl_ctrl.app_len = app_len;
dau_ctrl.update_flag = TRUE;
}
/* 回复报文发送 */
wl_ctrl.pkt_id_recv = head->pkt_id;
wl_ctrl.mul_idx = m_head->index;
wl_ctrl.update_len = m_head->len;
_wl_4G_send_update_fpga();
/* 初始化状态量 */
if(m_head->len < DEBUG_DATA_SIZE)
{
wl_ctrl.mul_idx = 0;
wl_ctrl.update_len = 0;
wl_ctrl.state = WL_STATE_END;
dau_ctrl.update_rt = DAU_UPD_OK;
}
}
/* FPGA 升级结果报文回复. */
static void _wl_4G_recv_update_fpga_rt(void)
{
wl_ctrl.state = WL_STATE_END;
wl_ctrl.time_send = 0;
wl_ctrl.send_cnt = 0;
dau_ctrl.update_rt = DAU_UPD_NONE;
_wl_4G_pkt_id_update();
return;
}
/* 数据回复处理. */
static void _wl_4G_data_process(uint8_t *cmd, uint32_t len)
{
@ -796,64 +880,101 @@ static void _wl_4G_data_process(uint8_t *cmd, uint32_t len)
return;
}
if (DEBUG_CT_REQUEST == head->cmd_type)
/* 升级时不处理其他数据 */
if (WL_STATE_UPDATE == wl_ctrl.state)
{
/* 共有命令处理. */
switch (head->cmd)
if (DEBUG_CT_REQUEST == head->cmd_type)
{
case DEBUG_C_CONTACT:
_wl_4G_recv_contect(cmd, len);
break;
case DEBUG_C_RESET:
_wl_4G_recv_reset(cmd, len);
break;
case DEBUG_C_UPDATE_APP:
_wl_4G_recv_update(cmd, len);
break;
case DEBUG_C_DEV_CONFIG_SET:
_wl_4G_recv_cfg_set(cmd, len);
break;
case DEBUG_C_UPDATE_APP_RT:
_wl_4G_recv_update_rt(cmd, len);
break;
case DEBUG_C_KEEPALIVE:
_wl_4G_recv_keepalive();
break;
case DEBUG_C_TIME:
_wl_4G_recv_time(cmd, len);
break;
default:
break;
/* 共有命令处理. */
switch (head->cmd)
{
case DEBUG_C_UPDATE_APP:
_wl_4G_recv_update(cmd, len);
break;
default:
break;
}
}
if (DEBUG_CT_PRV_REQUEST == head->cmd_type)
{
/* 私有命令处理. */
switch (head->cmd)
{
case DEBUG_PRV_UPDATE_FPGA:
_wl_4G_recv_update_fpga(cmd, len);
break;
default:
break;
}
}
}
else if (DEBUG_CT_PRV_REQUEST == head->cmd_type)
else
{
/* 私有命令处理. */
switch (head->cmd)
if (DEBUG_CT_REQUEST == head->cmd_type)
{
case DEBUG_PRV_REALDATA:
_wl_4G_recv_realdata();
break;
case DEBUG_PRV_POWER:
_wl_4G_recv_power(cmd, len);
break;
case DEBUG_PRV_DEFECT:
_wl_4G_recv_defect(cmd, len);
break;
case DEBUG_PRV_REALDATA_FUALT:
_wl_4G_recv_realdata_fault();
break;
case DEBUG_PRV_POWER_FAULT:
_wl_4G_recv_power_fault(cmd, len);
break;
case DEBUG_PRV_FAULT:
_wl_4G_recv_fault(cmd, len);
break;
case DEBUG_PRV_WAVE_COL:
_wl_4G_recv_wave_force(cmd, len);
break;
default:
break;
/* 共有命令处理. */
switch (head->cmd)
{
case DEBUG_C_CONTACT:
_wl_4G_recv_contect(cmd, len);
break;
case DEBUG_C_RESET:
_wl_4G_recv_reset(cmd, len);
break;
case DEBUG_C_UPDATE_APP:
_wl_4G_recv_update(cmd, len);
break;
case DEBUG_C_DEV_CONFIG_SET:
_wl_4G_recv_cfg_set(cmd, len);
break;
case DEBUG_C_UPDATE_APP_RT:
_wl_4G_recv_update_rt(cmd, len);
break;
case DEBUG_C_KEEPALIVE:
_wl_4G_recv_keepalive();
break;
case DEBUG_C_TIME:
_wl_4G_recv_time(cmd, len);
break;
default:
break;
}
}
else if (DEBUG_CT_PRV_REQUEST == head->cmd_type)
{
/* 私有命令处理. */
switch (head->cmd)
{
case DEBUG_PRV_REALDATA:
_wl_4G_recv_realdata();
break;
case DEBUG_PRV_POWER:
_wl_4G_recv_power(cmd, len);
break;
case DEBUG_PRV_DEFECT:
_wl_4G_recv_defect(cmd, len);
break;
case DEBUG_PRV_REALDATA_FUALT:
_wl_4G_recv_realdata_fault();
break;
case DEBUG_PRV_POWER_FAULT:
_wl_4G_recv_power_fault(cmd, len);
break;
case DEBUG_PRV_FAULT:
_wl_4G_recv_fault(cmd, len);
break;
case DEBUG_PRV_WAVE_COL:
_wl_4G_recv_wave_force(cmd, len);
break;
case DEBUG_PRV_UPDATE_FPGA:
_wl_4G_recv_update_fpga(cmd, len);
break;
case DEBUG_PRV_UPDATE_RT:
_wl_4G_recv_update_fpga_rt();
break;
default:
break;
}
}
}
}
@ -1081,21 +1202,31 @@ static void _wl_4G_send_cfg_set(void)
/* 升级结果报文发送 */
static void _wl_4G_send_update_rt(void)
{
proto_head_t *head = (proto_head_t*)wl_ctrl.dma_tx_buf_recv;
int32_t *rt = (int32_t*)(wl_ctrl.dma_tx_buf_recv + sizeof(proto_head_t));
proto_head_t *head = (proto_head_t*)wl_ctrl.dma_tx_buf;
int32_t *rt = (int32_t*)(wl_ctrl.dma_tx_buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
/* 封装报文头. */
_wl_4G_head_init_recv(sizeof(proto_head_t) + sizeof(int32_t), DEBUG_CT_REPLY, DEBUG_C_UPDATE_APP_RT, wl_ctrl.pkt_id_recv);
_wl_4G_head_init(sizeof(proto_head_t) + sizeof(int32_t), DEBUG_CT_REPLY, DEBUG_C_UPDATE_APP_RT, wl_ctrl.pkt_id);
*rt = wl_ctrl.update_rt;
/* 计算校验和. */
crc = (uint32_t*)(wl_ctrl.dma_tx_buf_recv + head->len);
*crc = crc32(wl_ctrl.dma_tx_buf_recv, head->len);
crc = (uint32_t*)(wl_ctrl.dma_tx_buf + head->len);
*crc = crc32(wl_ctrl.dma_tx_buf, head->len);
/* 发送报文 */
_wl_4G_transmit(wl_ctrl.dma_tx_buf_recv, head->len + 4);
osDelay(100);
if (HAL_OK == _wl_4G_transmit(wl_ctrl.dma_tx_buf, head->len + 4))
{
/* 发送成功, 如果指定时间内没有收到回复, 则根据 timeout 时间重发. */
wl_ctrl.time_send = HAL_GetTick() + 5500;
}
else
{
/* 发送失败, 等待 1s 重发. */
wl_ctrl.time_send = HAL_GetTick() + 1100;
}
}
/* 保活报文发送. */
@ -1108,7 +1239,7 @@ static void _wl_4G_send_keepalive(void)
/* 封装报文头. */
_wl_4G_head_init(sizeof(proto_head_t) + sizeof(wl_proto_state_t), DEBUG_CT_REPLY, DEBUG_C_KEEPALIVE, wl_ctrl.pkt_id);
data->is_utc_valid = dau_ctrl.is_utc_valid;
data->is_utc_valid = dau_ctrl.is_utc_ok;
data->utc = dau_ctrl.utc;
/* 计算校验和. */
@ -1484,6 +1615,57 @@ static void _wl_4G_send_wave_force(void)
_wl_4G_transmit(wl_ctrl.dma_tx_buf_recv, head->len + 4);
}
/* 升级请求报文发送. */
static void _wl_4G_send_update_fpga(void)
{
proto_head_t *head = (proto_head_t*)wl_ctrl.dma_tx_buf_recv;
mul_head_t *m_head = (mul_head_t*)(wl_ctrl.dma_tx_buf_recv + sizeof(proto_head_t));
uint32_t *crc = NULL;
/* 封装报文头. */
_wl_4G_head_init_recv(sizeof(proto_head_t), DEBUG_CT_PRV_REPLY, DEBUG_PRV_UPDATE_FPGA, wl_ctrl.pkt_id_recv);
head->len = sizeof(proto_head_t) + sizeof(mul_head_t) + 64;
m_head->index = wl_ctrl.mul_idx;
m_head->len = wl_ctrl.update_len;
/* 计算校验和. */
crc = (uint32_t*)(wl_ctrl.dma_tx_buf_recv + head->len);
*crc = crc32(wl_ctrl.dma_tx_buf_recv, head->len);
/* 发送报文 */
_wl_4G_transmit(wl_ctrl.dma_tx_buf_recv, head->len + 4);
}
/* FPGA 升级结果报文发送. */
static void _wl_4G_send_update_fpga_rt(void)
{
proto_head_t *head = (proto_head_t*)wl_ctrl.dma_tx_buf;
int32_t *rt = (int32_t*)(wl_ctrl.dma_tx_buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
/* 封装报文头. */
_wl_4G_head_init(sizeof(proto_head_t) + sizeof(int32_t), DEBUG_CT_PRV_REPLY, DEBUG_PRV_UPDATE_RT, wl_ctrl.pkt_id);
*rt = (dau_ctrl.update_rt != DAU_UPD_OK);
/* 计算校验和. */
crc = (uint32_t*)(wl_ctrl.dma_tx_buf + head->len);
*crc = crc32(wl_ctrl.dma_tx_buf, head->len);
/* 发送报文. */
if (HAL_OK == _wl_4G_transmit(wl_ctrl.dma_tx_buf, head->len + 4))
{
/* 发送成功, 如果指定时间内没有收到回复, 则根据 timeout 时间重发. */
wl_ctrl.time_send = HAL_GetTick() + 5500;
}
else
{
/* 发送失败, 等待 1s 重发. */
wl_ctrl.time_send = HAL_GetTick() + 1100;
}
}
/* 数据发送 */
void _wl_4G_send(void)
{
@ -1534,6 +1716,20 @@ void _wl_4G_send(void)
wl_ctrl.send_cnt++;
break;
}
else if (WL_STATE_UPDATE_RT == wl_ctrl.state)
{
/* 设备保活报文发送. */
_wl_4G_send_update_rt();
wl_ctrl.send_cnt++;
break;
}
else if (WL_STATE_UPDATE_FPGA_RT == wl_ctrl.state)
{
/* 设备保活报文发送. */
_wl_4G_send_update_fpga_rt();
wl_ctrl.send_cnt++;
break;
}
else if (WL_STATE_KEEPALIVE == wl_ctrl.state)
{
/* 设备保活报文发送. */
@ -1551,7 +1747,11 @@ void _wl_4G_send(void)
/* 发送数据状态机改变 */
void _wl_4G_state_chg(void)
{
if (!IS_MONITOR_BIT_SET(dau_ctrl.col_flag, DAU_COL_FLAG_FAULT_CMP))
if (dau_ctrl.update_rt != DAU_UPD_NONE)
{
wl_ctrl.state = WL_STATE_UPDATE_FPGA_RT;
}
else if(!IS_MONITOR_BIT_SET(dau_ctrl.col_flag, DAU_COL_FLAG_FAULT_CMP))
{
wl_ctrl.state = WL_STATE_REALDATA_FAULT;
}
@ -1606,6 +1806,8 @@ void _wl_4G_init_soft(void)
{
/* 修改波特率. */
_wl_4G_init_cmd_send("AT+IPR=230400\r\n", 1100);
//_wl_4G_init_cmd_send("AT+IPR=115200\r\n", 1100);
//_wl_4G_init_cmd_send("AT+IPR=19200\r\n", 1100);
wl_ctrl.send_cnt++;
}
else if ((WL_STATE_AT_QICSGP == wl_ctrl.state) && is_timeout)

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -18,10 +18,10 @@
<LeaveTargetRunning>_ 0</LeaveTargetRunning>
</StLinkDriver>
<DebugChecksum>
<Checksum>3441181092</Checksum>
<Checksum>1051652893</Checksum>
</DebugChecksum>
<RecentFlashDownload>
<Path>D:\Work\CablePositioning\Code\CablePositioningV1.0\CablePositioning_IAP_V1.0\EWARM\Project.eww</Path>
<Path>D:\Work\CablePositioning\Code\CablePositioningV1.0\CablePositioning_IAP_V1.0\EWARM\CableMonitor_V3.2\Exe\CableMonitor_V3.2.out</Path>
</RecentFlashDownload>
<JLinkDriver>
<CStepIntDis>_ 0</CStepIntDis>
@ -59,19 +59,6 @@
<ITMportsLogFile>0</ITMportsLogFile>
<ITMlogFile>$PROJ_DIR$\ITM.log</ITMlogFile>
</SWOTraceHWSettings>
<DriverProfiling>
<Enabled>0</Enabled>
<Mode>1</Mode>
<Graph>0</Graph>
<Symbiont>0</Symbiont>
<Exclusions />
</DriverProfiling>
<CallStackLog>
<Enabled>0</Enabled>
</CallStackLog>
<CallStackStripe>
<ShowTiming>1</ShowTiming>
</CallStackStripe>
<Trace1>
<Enabled>0</Enabled>
<ShowSource>1</ShowSource>
@ -134,16 +121,29 @@
<LoggingEnabled>_ 0</LoggingEnabled>
<LogFile>_ ""</LogFile>
</TermIOLog>
<PowerProbe>
<Frequency>10000</Frequency>
<Probe0>I0</Probe0>
<ProbeSetup0>2 1 1 2 0 0</ProbeSetup0>
</PowerProbe>
<LogFile>
<LoggingEnabled>_ 0</LoggingEnabled>
<LogFile>_ ""</LogFile>
<Category>_ 0</Category>
</LogFile>
<DriverProfiling>
<Enabled>0</Enabled>
<Mode>1</Mode>
<Graph>0</Graph>
<Symbiont>0</Symbiont>
<Exclusions />
</DriverProfiling>
<CallStackLog>
<Enabled>0</Enabled>
</CallStackLog>
<CallStackStripe>
<ShowTiming>1</ShowTiming>
</CallStackStripe>
<PowerProbe>
<Frequency>10000</Frequency>
<Probe0>I0</Probe0>
<ProbeSetup0>2 1 1 2 0 0</ProbeSetup0>
</PowerProbe>
<DisassembleMode>
<mode>0</mode>
</DisassembleMode>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

@ -24,7 +24,7 @@
<LeaveTargetRunning>_ 0</LeaveTargetRunning>
</JLinkDriver>
<DebugChecksum>
<Checksum>2205211107</Checksum>
<Checksum>572784430</Checksum>
</DebugChecksum>
<RecentFlashDownload>
<Path>D:\Work\CablePositioning\Code\CablePositioningV1.0\CablePositioning_APP_V1.0\EWARM\CableMonitor_APP_V3.2\Exe\CableMonitor_APP_V3.2.out</Path>

File diff suppressed because one or more lines are too long

@ -73,7 +73,7 @@ enum {
#define UPDATE_ERROR_MAGIC 0x9EFC845A
/* SPI FLASH 分配示意图. 注意: 以下地址必须是扇区对齐.
0x0 0x4000 0x8000 0xC000 0x10000 0x18000 0x20000 0x100000 0x800000
0x0 0x4000 0x8000 0xC000 0x10000 0x18000 0x20000 0x300000 0x1000000
********************************************************************
| INFO | INFOB | CONF | CONFB | RECO | RECOB | TFTP IMG | IDLE |
********************************************************************/
@ -84,8 +84,8 @@ enum {
#define CONFIG_ADDRESS (uint32_t)0x10000
#define CONFIG_ADDRESS_BAK (uint32_t)0x18000
#define TFTP_APP_ADDRESS (uint32_t)0x20000
#define TFTP_APP_ADDRESS_END (uint32_t)0x100000
#define SPI_FLASH_END_ADDRESS (uint32_t)0x800000
#define TFTP_APP_ADDRESS_END (uint32_t)0x300000
#define SPI_FLASH_END_ADDRESS (uint32_t)0x1000000
/* 内部flash分配示意图.
0x08000000 0x08008000 0x080FFFFF

@ -470,7 +470,7 @@ void Main_Menu(void)
case '4' :
/* Upload user application from the spi Flash */
flash_type = SPI_FLASH_TYPE;
SerialUpload(TFTP_APP_ADDRESS, SPI_IMG_NAME, dev_info.spi_fireware_size);
SerialUpload(TFTP_APP_ADDRESS, SPI_IMG_NAME, TFTP_APP_ADDRESS_END - TFTP_APP_ADDRESS);
break;
case '5' :
/* Upload config from the spi Flash */

@ -307,6 +307,7 @@ COM_StatusTypeDef Ymodem_Receive ( uint32_t *p_size )
uint32_t flashdestination, ramsource, filesize;
uint8_t *file_ptr;
uint8_t file_size[FILE_SIZE_LENGTH], tmp, packets_received;
uint8_t is_start = 0;
COM_StatusTypeDef result = COM_OK;
/* Initialize flashdestination variable */
@ -316,6 +317,7 @@ COM_StatusTypeDef Ymodem_Receive ( uint32_t *p_size )
{
packets_received = 0;
file_done = 0;
is_start = 0;
while ((file_done == 0) && (result == COM_OK))
{
switch (ReceivePacket(aPacketData, &packet_length, DOWNLOAD_TIMEOUT))
@ -342,8 +344,10 @@ COM_StatusTypeDef Ymodem_Receive ( uint32_t *p_size )
}
else
{
if (packets_received == 0)
if (packets_received == 0 && is_start == 0)
{
is_start = 1;
/* File name packet */
if (aPacketData[PACKET_DATA_INDEX] != 0)
{
@ -516,6 +520,7 @@ COM_StatusTypeDef Ymodem_Transmit (uint8_t *p_buf, const uint8_t *p_file_name, u
while ((size) && (result == COM_OK ))
{
/* Prepare next packet */
watchdog_refresh();
PreparePacket(p_buf_int, aPacketData, blk_number, size);
ack_recpt = 0;
a_rx_ctrl[0] = 0;
@ -555,11 +560,11 @@ COM_StatusTypeDef Ymodem_Transmit (uint8_t *p_buf, const uint8_t *p_file_name, u
{
p_buf_int += pkt_size;
size -= pkt_size;
if (blk_number == (USER_FLASH_SIZE / PACKET_1K_SIZE))
{
result = COM_LIMIT; /* boundary error */
}
else
//if (blk_number == (USER_FLASH_SIZE / PACKET_1K_SIZE))
//{
// result = COM_LIMIT; /* boundary error */
//}
//else
{
blk_number++;
}

Loading…
Cancel
Save