#include "app_com.h" #include "app_leakage.h" #include "bsp_w25q.h" #include #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;icom_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;icomm.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++; } } }