#include "device_message.h" #include "gd32f10x.h" #include "w25q32.h" static CONFIG_PARAMS g_config_params = {0}; void write_struct_to_flash(uint32_t *data, int size); /* * 函数名:save_config_params(CONFIG_PARAMS *params) * 输入参数:无 * 输出参数:无 * 返回值:无 * 函数作用:加载http或者上位机配置参数 */ int save_config_params(CONFIG_PARAMS *params) { if(params == NULL) return -1; CONFIG_PARAMS_UNION config_params_union; memset(&config_params_union, 0, sizeof(CONFIG_PARAMS_UNION)); memcpy(&config_params_union.config_params, params, sizeof(CONFIG_PARAMS)); clear_gateway_config_block(); write_struct_to_flash((uint32_t *)&config_params_union, sizeof(CONFIG_PARAMS_UNION)); return 0; } /* * 函数名:load_config_params() * 输入参数:无 * 输出参数:无 * 返回值:无 * 函数作用:加载http或者上位机配置参数 */ int load_config_params() { CONFIG_PARAMS_UNION config_params_union; memset(&config_params_union, 0, sizeof(CONFIG_PARAMS_UNION));//清空原先数据 //读出w25q32内部的结构体信息 W25Q32_Read((uint8_t *)&config_params_union, 0, sizeof(CONFIG_PARAMS_UNION)); //从W25Q32中读取结构体数据 memcpy(&g_config_params, &config_params_union.config_params, sizeof(CONFIG_PARAMS)); uint8_t *ptr=(uint8_t *)&g_config_params; //判断第一位数据是否有效 if(*ptr == 0xF1) { return 0; } return -1; } /* * 函数名:CONFIG_PARAMS *get_config_params() * 输入参数:无 * 输出参数:无 * 返回值:无 * 函数作用:获取配置参数 */ CONFIG_PARAMS *get_config_params() { return &g_config_params; } /* * 函数名:void write_struct_to_flash(uint32_t *data, int size) * 输入参数:*data,size、data为往w25q32内写入的数据、size为写入数据大小 * 输出参数:无 * 返回值:无 * 函数作用:往w25q32内写入的数据、一次最多写入一页数据、长度超过时要切换页 */ void write_struct_to_flash(uint32_t *data, int size) { uint8_t *pdata = (uint8_t *)data; //将数据按页写入一次写入256个字节 for (int i = 0; i <= size / 256; i++) { W25Q32_PageWrite(pdata + i * 256, i); } } /* * 函数名:clear_gateway_config_block(void) * 输入参数:无 * 输出参数:无 * 返回值:无 * 函数作用:清除http获取的参数配置 */ void clear_gateway_config_block(void) { W25Q32_Erase64K(0);//擦除一块区域的大小 }