146 lines
4.2 KiB
C
146 lines
4.2 KiB
C
#include "app_com.h"
|
|
#include "app_leakage.h"
|
|
#include "bsp_w25q.h"
|
|
#include <string.h>
|
|
#include "proto_modbus_master_leakage.h"
|
|
|
|
/*com口对应的串口*/
|
|
bsp_uart_t *com_to_uart[APP_COM_NUM] =
|
|
{
|
|
&com_uart4,
|
|
&com_uart2,
|
|
&com_uart3,
|
|
&com_uart6,
|
|
};
|
|
|
|
static void app_com_class_baud_rate_set(app_com_class_t *p_com, u32 baud_enum);
|
|
static void app_com_class_update(void );
|
|
static void app_com_init(void);
|
|
static void app_com_save_baudrate_to_flash(void);
|
|
static void app_com_load_baudrate_from_flash(void);
|
|
|
|
app_com_t app_com=
|
|
{
|
|
.init = app_com_init,
|
|
.class_update = app_com_class_update,
|
|
.save_flah = app_com_save_baudrate_to_flash,
|
|
};
|
|
|
|
|
|
static void app_com_init(void)
|
|
{
|
|
u8 i;
|
|
for(i=0;i<APP_COM_NUM;i++)
|
|
{
|
|
app_com.com[i].com_uart = com_to_uart[i];
|
|
app_com.com[i].set.baud_rate = app_com_class_baud_rate_set;
|
|
app_com.com[i].flash_data.baudrate = 4;
|
|
}
|
|
app_com_class_update();
|
|
app_com_load_baudrate_from_flash();
|
|
}
|
|
|
|
/* 波特率枚举值到实际数值的转换并设置串口 */
|
|
static void app_com_class_baud_rate_set(app_com_class_t *p_com, u32 baud_enum)
|
|
{
|
|
u32 baud_value;
|
|
switch (baud_enum) {
|
|
case 0: baud_value = 4800; break;
|
|
case 1: baud_value = 9600; break;
|
|
case 2: baud_value = 19200; break;
|
|
case 3: baud_value = 57600; break;
|
|
case 4: baud_value = 115200; break;
|
|
default: baud_value = 115200; break;
|
|
}
|
|
if (p_com->com_uart && p_com->com_uart->set.baud_rate) {
|
|
p_com->com_uart->set.baud_rate(p_com->com_uart, baud_value);
|
|
}
|
|
}
|
|
|
|
/* 从Flash加载波特率到内存并应用 */
|
|
static void app_com_load_baudrate_from_flash(void)
|
|
{
|
|
u8 baud_vals[APP_COM_NUM];
|
|
w25q32.read(W25Q32_COM_BAUDRATE_ADDR, baud_vals, APP_COM_NUM);
|
|
|
|
for (u8 i = 0; i < APP_COM_NUM; i++) {
|
|
if (baud_vals[i] == 0xFF) { // 未初始化,设为默认115200
|
|
app_com.com[i].flash_data.baudrate = 4;
|
|
} else {
|
|
app_com.com[i].flash_data.baudrate = baud_vals[i];
|
|
}
|
|
// 应用波特率到串口硬件
|
|
app_com_class_baud_rate_set(&app_com.com[i], app_com.com[i].flash_data.baudrate);
|
|
}
|
|
}
|
|
|
|
/* 将当前波特率保存到Flash */
|
|
static void app_com_save_baudrate_to_flash(void)
|
|
{
|
|
u8 current_vals[APP_COM_NUM];
|
|
u8 flash_vals[APP_COM_NUM];
|
|
|
|
/*当前内存中的波特率枚举值*/
|
|
for (u8 i = 0; i < APP_COM_NUM; i++) {
|
|
current_vals[i] = app_com.com[i].flash_data.baudrate;
|
|
}
|
|
|
|
/*从 Flash 读取已存储的值*/
|
|
w25q32.read(W25Q32_COM_BAUDRATE_ADDR, flash_vals, APP_COM_NUM);
|
|
|
|
// 比较是否完全相同
|
|
if (memcmp(current_vals, flash_vals, APP_COM_NUM) == 0) {
|
|
// 没有变化,无需写入
|
|
return;
|
|
}
|
|
|
|
// 擦除包含该地址的扇区(4K对齐)
|
|
uint32_t erase_addr = W25Q32_COM_BAUDRATE_ADDR & ~(W25Q32_SECTOR_SIZE - 1);
|
|
w25q32_sector_erase(erase_addr);
|
|
w25q32.write(W25Q32_COM_BAUDRATE_ADDR, current_vals, APP_COM_NUM);
|
|
}
|
|
|
|
|
|
/*将同一com口的设备进行划分*/
|
|
static void app_com_class_update(void )
|
|
{
|
|
u16 i,j;
|
|
u8 com_index,id;
|
|
|
|
/********************************************总数清零******************************************************/
|
|
for(i=0;i<APP_COM_NUM;i++)
|
|
{
|
|
modbus_leakage[i].sensor_num = 0;
|
|
}
|
|
|
|
/*遍历子系统*/
|
|
for(i=0;i<APP_LEAKAGE_SUB_DEVICE_NUM;i++)
|
|
{
|
|
/*设备使能*/
|
|
if(ENABLE == leakage.sub_device_data[i].flash_data.state)
|
|
{
|
|
/********************************************COM口划分******************************************************/
|
|
com_index = leakage.sub_device_data[i].flash_data.com;
|
|
id = leakage.sub_device_data[i].flash_data.modbus_id;
|
|
|
|
proto_sensor_class_t *p_sensor = &modbus_leakage[com_index].sensor[modbus_leakage[com_index].sensor_num];
|
|
|
|
/* ★ 清空整个传感器结构体 */
|
|
memset(p_sensor, 0, sizeof(proto_sensor_class_t));
|
|
|
|
/*绑定modbus id*/
|
|
p_sensor->comm.id = id;
|
|
/*绑定子设备索引索引*/
|
|
p_sensor->comm.leakage_data_index = i;
|
|
/* ★ 设置初始状态为默认(发送请求) */
|
|
p_sensor->comm.state = PROTO_LEAKAGE_COMM_STATE_DEFAULT;
|
|
/*comm口设备总数++*/
|
|
modbus_leakage[com_index].sensor_num++;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|