From 6d27ad8c87c96ff7c588659ac9398eb638e5ec8a Mon Sep 17 00:00:00 2001
From: 95384 <664090429@qq.com>
Date: Mon, 11 Nov 2024 15:41:00 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E6=8D=A2=E8=83=BD=E5=99=A8=E5=8F=82?=
=?UTF-8?q?=E6=95=B0=EF=BC=8CRSSI=E6=9C=89=E6=95=88=E8=8C=83=E5=9B=B4?=
=?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=8F=AF=E9=85=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
App/Inc/frt_protocol.h | 9 ++
App/Inc/inflash.h | 12 +-
App/Src/anemometer_dev.c | 25 ++--
App/Src/frt_protocol.c | 163 ++++++++++++++++++++++++++-
App/Src/inflash.c | 24 +++-
Core/Src/freertos.c | 2 +-
EWARM/micro_climate.ewp | 8 +-
EWARM/settings/Project.wsdt | 32 +++---
EWARM/settings/micro_climate.dbgdt | 77 +++++++------
EWARM/settings/micro_climate.dnx | 2 +-
EWARM/stm32l496xx_flash_app-1109.icf | 41 +++++++
11 files changed, 315 insertions(+), 80 deletions(-)
create mode 100644 EWARM/stm32l496xx_flash_app-1109.icf
diff --git a/App/Inc/frt_protocol.h b/App/Inc/frt_protocol.h
index aac087b..3edeef9 100644
--- a/App/Inc/frt_protocol.h
+++ b/App/Inc/frt_protocol.h
@@ -33,6 +33,7 @@ typedef enum
FRT_REGISTER_PRESSURE = 8, /* 大气压 */
FRT_REGISTER_RAIN = 9, /* 雨量 */
FRT_REGISTER_PRECIPITATION_INTENSITY = 10, /* 总辐射 */
+
FRT_REGISTER_DEVICE_ADDR = 20, /* 设备地址 */
FRT_REGISTER_COMMU_BAUDRATE = 21, /* 波特率 */
FRT_REGISTER_SPEED_AVERAGE_TIME = 22, /* 风速平均时间 */
@@ -42,6 +43,12 @@ typedef enum
FRT_REGISTER_SOFT_REST = 26, /* 软件复位 */
FRT_REGISTER_REST_DEFAULT_SETTING = 27, /* 恢复出厂设置 */
FRT_REGISTER_PROTOCOL_SETTING = 28, /* 设置协议:0-ASCII;1-MODBUS协议 */
+
+ FRT_REGISTER_TRANSDUCER_CFG_1R5 = 30, /* 换能器参数 */
+ FRT_REGISTER_TRANSDUCER_CFG_4R5 = 31, /* 换能器参数 */
+ FRT_REGISTER_TRANSDUCER_CFG_8R0 = 32, /* 换能器参数 */
+ FRT_REGISTER_RSSI_RANGE = 33, /* RSSI有效范围 */
+ FRT_REGISTER_WAVE_DATA = 34, /* 波形数据 */
}FRT_MsgRegister;
#pragma pack(push,1)
@@ -81,6 +88,7 @@ typedef struct _frt_climate_pack_resp{
}frt_climate_pack_resp;
typedef void (*MsgProcFunc)(device_handle device, void*);
+
/* 功能码处理函数 */
typedef struct _FRT_FunctionMsgProcTable_s{
u_int32_t msgId;
@@ -88,6 +96,7 @@ typedef struct _FRT_FunctionMsgProcTable_s{
} FRT_FuncionMsgProcTable_s;
typedef u_int16_t (*RegProcFunc)(void*);
+
/* 寄存器处理表 */
typedef struct _FRT_RegProcTable_s{
u_int32_t regId;
diff --git a/App/Inc/inflash.h b/App/Inc/inflash.h
index 6ad2ee5..d03b681 100644
--- a/App/Inc/inflash.h
+++ b/App/Inc/inflash.h
@@ -19,10 +19,14 @@ typedef enum{
#pragma pack(push,1)
typedef struct _config_info{
u_int8_t flag_head;
- u_int8_t addr;
- u_int16_t uart_baud; /* 涓插彛娉㈢壒鐜 */
- u_int16_t speed_average_time;
- u_int16_t temp_hum_update_time;
+ u_int8_t addr; /* 璁惧鍦板潃 */
+ u_int16_t uart_baud; /* 涓插彛娉㈢壒鐜 */
+ u_int16_t speed_average_time; /* 椋庨熷钩鍧囨椂闂 */
+ u_int16_t temp_hum_update_time; /* 娓╂箍搴﹀钩鍧囨椂闂 */
+ u_int16_t transducer_cfg_1R5; /* 鎹㈣兘鍣ㄥ弬鏁 */
+ u_int16_t transducer_cfg_4R5; /* 鎹㈣兘鍣ㄥ弬鏁 */
+ u_int16_t transducer_cfg_8R0; /* 鎹㈣兘鍣ㄥ弬鏁 */
+ u_int16_t RSSI_range; /* RSSI鏈夋晥鑼冨洿 */
u_int8_t flag_end;
}config_info;
#pragma pack(pop)
diff --git a/App/Src/anemometer_dev.c b/App/Src/anemometer_dev.c
index a3ac42a..6d4341e 100644
--- a/App/Src/anemometer_dev.c
+++ b/App/Src/anemometer_dev.c
@@ -133,17 +133,24 @@ float32_t cal_tof(q15_t* x,uint32_t len)
// 缁熻200khz 闄勮繎鐨勪俊鍙峰己搴
RSSI = rfft_float_buf[fft_200khz_pos-2]+rfft_float_buf[fft_200khz_pos-1]+ rfft_float_buf[fft_200khz_pos]+rfft_float_buf[fft_200khz_pos+1]+rfft_float_buf[fft_200khz_pos+2];
// 濡傛灉RSSI灏忎簬
- if(RSSI<0.2)
+ // 鍙彉RSSI鑼冨洿
+ if(RSSI < ((float)g_stConfigInfo.RSSI_range/100.0))
+// if(RSSI<0.2)
return -1;
- // 澶у畤鎹㈣兘鍣ㄥ弬鏁 寮濮
- // 鏈澶у肩殑0.18鍊
- uint16_t max_val_zero_1R5 = (max_val*15/100);
- // 鏈澶у肩殑0.45鍊
- uint16_t max_val_zero_4R5 = (max_val*45/100);
- // 鏈澶у肩殑0.8鍊
- uint16_t max_val_zero_8R0 = (max_val*80/100);
- // 澶у畤鎹㈣兘鍣ㄥ弬鏁
+// 鍙彉鍙傛暟
+ uint16_t max_val_zero_1R5 = max_val * g_stConfigInfo.transducer_cfg_1R5/100;
+ uint16_t max_val_zero_4R5 = max_val * g_stConfigInfo.transducer_cfg_4R5/100;
+ uint16_t max_val_zero_8R0 = max_val * g_stConfigInfo.transducer_cfg_8R0/100;
+
+// // 澶у畤鎹㈣兘鍣ㄥ弬鏁 寮濮
+// // 鏈澶у肩殑0.18鍊
+// uint16_t max_val_zero_1R5 = (max_val*15/100);
+// // 鏈澶у肩殑0.45鍊
+// uint16_t max_val_zero_4R5 = (max_val*45/100);
+// // 鏈澶у肩殑0.8鍊
+// uint16_t max_val_zero_8R0 = (max_val*80/100);
+// // 澶у畤鎹㈣兘鍣ㄥ弬鏁
// // 鏃犻敗鐢靛0鎹㈣兘鍣ㄥ弬鏁
// // 鏈澶у肩殑0.18鍊
diff --git a/App/Src/frt_protocol.c b/App/Src/frt_protocol.c
index 3ffe96c..a2aecc3 100644
--- a/App/Src/frt_protocol.c
+++ b/App/Src/frt_protocol.c
@@ -24,18 +24,32 @@ static u_int16_t FRT_ReadRegTemperature(void *pMsg);
static u_int16_t FRT_ReadRegHumidity(void *pMsg);
static u_int16_t FRT_ReadRegPressure(void *pMsg);
static u_int16_t FRT_ReadRegRain(void *pMsg);
+
static u_int16_t FRT_ReadRegPrecipitationIntensity(void *pMsg);
static u_int16_t FRT_ReadRegDeviceAddr(void *pMsg);
static u_int16_t FRT_ReadRegCommuBaudRate(void *pMsg);
static u_int16_t FRT_ReadRegSpeedAverageTime(void *pMsg);
static u_int16_t FRT_ReadRegTempHumUpdateTime(void *pMsg);
static u_int16_t FRT_ReadRegRainPowerCtl(void *pMsg);
+
static u_int16_t FRT_WriteRegDeviceAddr(void *pMsg);
static u_int16_t FRT_WriteRegCommuBaudRate(void *pMsg);
static u_int16_t FRT_WriteRegSpeedAverageTime(void *pMsg);
static u_int16_t FRT_WriteRegTempHumUpdateTime(void *pMsg);
static u_int16_t FRT_WriteRegSoftReset(void *pMsg);
static u_int16_t FRT_WriteRegResetDefault(void *pMsg);
+
+static u_int16_t FRT_ReadRegTransducerCFG1R5(void *pMsg);
+static u_int16_t FRT_ReadRegTransducerCFG4R5(void *pMsg);
+static u_int16_t FRT_ReadRegTransducerCFG8R0(void *pMsg);
+static u_int16_t FRT_ReadRegRSSIRange(void *pMsg);
+static u_int16_t FRT_ReadRegWaveData(void *pMsg);
+
+static u_int16_t FRT_WriteRegTransducerCFG1R5(void *pMsg);
+static u_int16_t FRT_WriteRegTransducerCFG4R5(void *pMsg);
+static u_int16_t FRT_WriteRegTransducerCFG8R0(void *pMsg);
+static u_int16_t FRT_WriteRegRSSIRange(void *pMsg);
+
static void pdebug_mcs_info();
/* 鍔熻兘鐮佸鐞嗚〃 */
@@ -64,6 +78,10 @@ FRT_RegProcTable_s g_RegTbl[] =
{ FRT_REGISTER_SPEED_AVERAGE_TIME, FRT_ReadRegSpeedAverageTime }, /* 椋庨熷钩鍧囨椂闂 */
{ FRT_REGISTER_TEMPHUM_UPDATE_TIME, FRT_ReadRegTempHumUpdateTime }, /* 娓╂箍搴︽洿鏂版椂闂 */
{ FRT_REGISTER_RAIN_POWER_CONTROL, FRT_ReadRegRainPowerCtl }, /* 闆ㄩ噺鐢垫簮鏃堕棿 */
+ { FRT_REGISTER_TRANSDUCER_CFG_1R5, FRT_ReadRegTransducerCFG1R5 }, /* 璇绘崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ1R5 */
+ { FRT_REGISTER_TRANSDUCER_CFG_4R5, FRT_ReadRegTransducerCFG4R5 }, /* 璇绘崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ4R5 */
+ { FRT_REGISTER_TRANSDUCER_CFG_8R0, FRT_ReadRegTransducerCFG8R0 }, /* 璇绘崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ8R0 */
+ { FRT_REGISTER_RSSI_RANGE, FRT_ReadRegRSSIRange }, /* 璇籖SSI鏈夋晥鑼冨洿 */
};
/* 鍐欏瘎瀛樺櫒澶勭悊琛 */
@@ -75,6 +93,10 @@ FRT_RegProcTable_s g_Write_RegTbl[] =
{ FRT_REGISTER_TEMPHUM_UPDATE_TIME, FRT_WriteRegTempHumUpdateTime }, /* 鍐欐俯婀垮害鏇存柊鏃堕棿 */
{ FRT_REGISTER_SOFT_REST, FRT_WriteRegSoftReset }, /* 杞欢澶嶄綅 */
{ FRT_REGISTER_REST_DEFAULT_SETTING, FRT_WriteRegResetDefault }, /* 鎭㈠鍑哄巶璁剧疆 */
+ { FRT_REGISTER_TRANSDUCER_CFG_1R5, FRT_WriteRegTransducerCFG1R5 }, /* 鍐欐崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ1R5 */
+ { FRT_REGISTER_TRANSDUCER_CFG_4R5, FRT_WriteRegTransducerCFG4R5 }, /* 鍐欐崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ4R5 */
+ { FRT_REGISTER_TRANSDUCER_CFG_8R0, FRT_WriteRegTransducerCFG8R0 }, /* 鍐欐崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ8R0 */
+ { FRT_REGISTER_RSSI_RANGE, FRT_WriteRegRSSIRange }, /* 鍐橰SSI鏈夋晥鑼冨洿 */
};
/**
@@ -396,6 +418,119 @@ static u_int16_t FRT_WriteRegResetDefault(void *pMsg)
return 0;
}
+/**
+ * @brief 璇绘崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ1R5
+ * @param
+ * @retval
+ */
+static u_int16_t FRT_ReadRegTransducerCFG1R5(void *pMsg)
+{
+ read_config_info();
+ u_int16_t value=g_stConfigInfo.transducer_cfg_1R5;
+ return FRT_swap_endian_16(value);
+}
+
+/**
+ * @brief 璇绘崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ4R5
+ * @param
+ * @retval
+ */
+static u_int16_t FRT_ReadRegTransducerCFG4R5(void *pMsg)
+{
+ read_config_info();
+ u_int16_t value=g_stConfigInfo.transducer_cfg_4R5;
+ return FRT_swap_endian_16(value);
+}
+
+/**
+ * @brief 璇绘崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ8R0
+ * @param
+ * @retval
+ */
+static u_int16_t FRT_ReadRegTransducerCFG8R0(void *pMsg)
+{
+ read_config_info();
+ u_int16_t value=g_stConfigInfo.transducer_cfg_8R0;
+ return FRT_swap_endian_16(value);
+}
+
+/**
+ * @brief 璇籖SSI鏈夋晥鑼冨洿
+ * @param
+ * @retval
+ */
+static u_int16_t FRT_ReadRegRSSIRange(void *pMsg)
+{
+ read_config_info();
+ u_int16_t value=g_stConfigInfo.RSSI_range;
+ return FRT_swap_endian_16(value);
+}
+
+
+/**
+ * @brief 鍐欐崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ1R5
+ * @param
+ * @retval
+ */
+static u_int16_t FRT_WriteRegTransducerCFG1R5(void *pMsg)
+{
+ uint16_t *pMsgAddr = (uint16_t *)pMsg;
+ uint16_t data = *pMsgAddr;
+
+ g_stConfigInfo.transducer_cfg_1R5 = data;
+ save_config_info(g_stConfigInfo);
+
+ return 0;
+}
+
+/**
+ * @brief 鍐欐崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ4R5
+ * @param
+ * @retval
+ */
+static u_int16_t FRT_WriteRegTransducerCFG4R5(void *pMsg)
+{
+ uint16_t *pMsgAddr = (uint16_t *)pMsg;
+ uint16_t data = *pMsgAddr;
+
+ g_stConfigInfo.transducer_cfg_4R5 = data;
+ save_config_info(g_stConfigInfo);
+
+ return 0;
+}
+
+/**
+ * @brief 鍐欐崲鑳藉櫒鍙傛暟瀵勫瓨鍣ㄥ8R0
+ * @param
+ * @retval
+ */
+static u_int16_t FRT_WriteRegTransducerCFG8R0(void *pMsg)
+{
+ uint16_t *pMsgAddr = (uint16_t *)pMsg;
+ uint16_t data = *pMsgAddr;
+
+ g_stConfigInfo.transducer_cfg_8R0 = data;
+ save_config_info(g_stConfigInfo);
+
+ return 0;
+}
+
+/**
+ * @brief 鍐橰SSI鏈夋晥鑼冨洿
+ * @param
+ * @retval
+ */
+static u_int16_t FRT_WriteRegRSSIRange(void *pMsg)
+{
+ uint16_t *pMsgAddr = (uint16_t *)pMsg;
+ uint16_t data = *pMsgAddr;
+
+ g_stConfigInfo.RSSI_range = data;
+ save_config_info(g_stConfigInfo);
+
+ return 0;
+}
+
/**
* @brief 灏佽鍗忚鍙戦
@@ -473,12 +608,25 @@ void FRT_MsgProc_ReadRegister(device_handle device, void *pMsg)
uint8_t *data = (uint8_t *)pMsg;
u_int16_t start_reg_addr = (data[2] << 8)| data[3];
u_int16_t reg_num= (data[4] << 8)| data[5];
- if (start_reg_addr < 0x00 || (start_reg_addr > 0x08 && start_reg_addr < 0x14) || start_reg_addr > 0x17)
+ if ( \
+ start_reg_addr < 0x00 ||\
+ (start_reg_addr > 0x08 && start_reg_addr < 0x14) ||\
+ (start_reg_addr > 0x17 && start_reg_addr < 0x1E) ||\
+ start_reg_addr > 0x22 \
+ )
+
{
term_printf("start_reg_addr error:%d", start_reg_addr);
return;
}
- if (reg_num < 0x01 || (((reg_num + start_reg_addr - 1) > 0x08) && ((reg_num + start_reg_addr - 1) < 0x14)) || ((reg_num + start_reg_addr -1) > 0x17))
+
+ if ( \
+ reg_num < 0x01 ||\
+ (((reg_num + start_reg_addr - 1) > 0x08) && ((reg_num + start_reg_addr - 1) < 0x14)) ||\
+ (((reg_num + start_reg_addr -1) > 0x17) && ((reg_num + start_reg_addr -1) < 0x1E)) ||\
+ ((reg_num + start_reg_addr -1) > 0x22) \
+ )
+
{
term_printf("reg_num error:%d", reg_num);
return;
@@ -525,12 +673,19 @@ void FRT_MsgProc_WriteRegister(device_handle device, void *pMsg)
unsigned short return_crc_value;
// 鏍¢獙
- if (start_reg_addr < 0x14 || start_reg_addr > 0x1C )
+ if (start_reg_addr < 0x14 ||\
+ (start_reg_addr > 0x1C && start_reg_addr < 0x1E)||\
+ (start_reg_addr > 0x21)
+ )
{
term_printf("start_reg_addr error:%d", start_reg_addr);
return;
}
- if (reg_num < 0x01 || ((reg_num + start_reg_addr - 1) < 0x14) || ((reg_num + start_reg_addr -1) > 0x1C))
+ if (reg_num < 0x01 ||\
+ ((reg_num + start_reg_addr - 1) < 0x14) ||\
+ (((reg_num + start_reg_addr -1) > 0x1C) && ((reg_num + start_reg_addr -1) < 0x1E)) ||\
+ ((reg_num + start_reg_addr -1) > 0x21)
+ )
{
term_printf("reg_num error:%d", reg_num);
return;
diff --git a/App/Src/inflash.c b/App/Src/inflash.c
index 371b80e..cc06319 100644
--- a/App/Src/inflash.c
+++ b/App/Src/inflash.c
@@ -3,16 +3,28 @@
#include "pdebug.h"
#include "assertions.h"
+/*
+ * 无锡电声换能器参数
+ * 10
+ * 35
+ * 65
+ * 无锡电声换能器参数
+ */
+
config_info g_stConfigInfo={
- .flag_head = FLAG_SAVE_INFLASH_HEAD,
- .addr = 0x30, /* 默认地址 */
- .uart_baud = 9600, /* 默认波特率 */
- .speed_average_time = 600, /* 默认10分钟平均风速 */
- .temp_hum_update_time = 600, /* 温湿度更新时间 */
+ .flag_head = FLAG_SAVE_INFLASH_HEAD,
+ .addr = 0x30, /* 默认地址 */
+ .uart_baud = 9600, /* 默认波特率 */
+ .speed_average_time = 600, /* 平均风速默认10分钟更新 */
+ .temp_hum_update_time = 600, /* 温湿度更新时间 */
+
+ .transducer_cfg_1R5 = 15, /* 大宇换能器参数 */
+ .transducer_cfg_4R5 = 45, /* 大宇换能器参数 */
+ .transducer_cfg_8R0 = 80, /* 大宇换能器参数 */
+ .RSSI_range = 20, /* RSSI大于0.2有效 */
.flag_end = FLAG_SAVE_INFLASH_END,
};
-
/**
* @brief 擦除多页flash
* @param
diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c
index 57510ad..597ef39 100644
--- a/Core/Src/freertos.c
+++ b/Core/Src/freertos.c
@@ -122,7 +122,7 @@ void MX_FREERTOS_Init(void) {
ledTaskHandle = osThreadCreate(osThread(ledTask), NULL);
/* USER CODE BEGIN RTOS_THREADS */
- osThreadDef(anemometer, wind_task, osPriorityHigh, 0, 128);// 风速风向
+ osThreadDef(anemometer, wind_task, osPriorityHigh, 0, 256);// 风速风向
anemometerHandle = osThreadCreate(osThread(anemometer), NULL);
osThreadDef(temhum_update_task, tem_hum_update_task, osPriorityAboveNormal, 0, 128);//温湿度,大气压更新
diff --git a/EWARM/micro_climate.ewp b/EWARM/micro_climate.ewp
index f03de8a..ff40370 100644
--- a/EWARM/micro_climate.ewp
+++ b/EWARM/micro_climate.ewp
@@ -675,7 +675,7 @@