Files
SM-1000M/RTX5_20220316/Driver/eeprom/eeprom.c
2026-04-23 10:50:18 +08:00

328 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*********************************************************************************
头文件
*********************************************************************************
*/
#include "eeprom.h"
#include "bsp.h"
#include "stm32l1xx_flash.h"
/*
************************************************************************************
变量定义
************************************************************************************
*/
Init_Data Init_Data_Equipment;
/*------------------------------------------------------------
Func: EEPROM数据按字节读出
Note:
-------------------------------------------------------------*/
void EEPROM_ReadBytes(u16 Addr,u8 *Buffer,u16 Length)
{
u8 *wAddr;
wAddr=(u8 *)(EEPROM_BASE_ADDR+Addr);
while(Length--){
*Buffer++=*wAddr++;
}
}
/*------------------------------------------------------------
Func: EEPROM数据读出
Note:
-------------------------------------------------------------*/
void EEPROM_ReadWords(u16 Addr,u16 *Buffer,u16 Length)
{
u32 *wAddr;
wAddr=(u32 *)(EEPROM_BASE_ADDR+Addr);
while(Length--){
*Buffer++=*wAddr;
wAddr+=2;
}
}
/*------------------------------------------------------------
Func: EEPROM数据读出双字
Note:
-------------------------------------------------------------*/
void EEPROM_ReadDWords(u16 Addr,u32 *Buffer,u16 Length)
{
u32 *wAddr;
wAddr=(u32 *)(EEPROM_BASE_ADDR+Addr);
while(Length--){
*Buffer++=*wAddr;
wAddr+=4;
}
}
/*------------------------------------------------------------
Func: EEPROM数据按字节写入
Note:
-------------------------------------------------------------*/
void EEPROM_WriteBytes(u16 Addr,u8 *Buffer,u16 Length)
{
u8 *wAddr;
wAddr=(u8 *)(EEPROM_BASE_ADDR+Addr);
FLASH->PEKEYR=PEKEY1; //unlock
FLASH->PEKEYR=PEKEY2;
while(FLASH->PECR&FLASH_PECR_PELOCK);
FLASH->PECR|=FLASH_PECR_FTDW; //not fast write
while(Length--){
*wAddr++=*Buffer++;
while(FLASH->SR&FLASH_SR_BSY);
}
FLASH->PECR|=FLASH_PECR_PELOCK;
}
/*------------------------------------------------------------
Func: EEPROM数据按字写入
Note: 字当半字用
-------------------------------------------------------------*/
void EEPROM_WriteWords(u16 Addr,u16 *Buffer,u16 Length)
{
u32 *wAddr;
wAddr=(u32 *)(EEPROM_BASE_ADDR+Addr);
FLASH->PEKEYR=PEKEY1; //unlock
FLASH->PEKEYR=PEKEY2;
while(FLASH->PECR&FLASH_PECR_PELOCK);
FLASH->PECR|=FLASH_PECR_FTDW; //not fast write
while(Length--){
*wAddr=*Buffer++;
wAddr+=2;
while(FLASH->SR&FLASH_SR_BSY);
}
FLASH->PECR|=FLASH_PECR_PELOCK;
}
/*------------------------------------------------------------
Func: EEPROM数据按双字写入
Note:
-------------------------------------------------------------*/
void EEPROM_WriteDWords(u16 Addr,u32 *Buffer,u16 Length)
{
u32 *wAddr;
wAddr=(u32 *)(EEPROM_BASE_ADDR+Addr);
FLASH->PEKEYR=PEKEY1; //unlock
FLASH->PEKEYR=PEKEY2;
while(FLASH->PECR&FLASH_PECR_PELOCK);
FLASH->PECR|=FLASH_PECR_FTDW; //not fast write
while(Length--){
*wAddr=*Buffer++;
wAddr+=4;
while(FLASH->SR&FLASH_SR_BSY);
}
FLASH->PECR|=FLASH_PECR_PELOCK;
}
/*
*********************************************************************************************************
* 函 数 名: Read_Equipment_Par()
* 功能说明: EERPOM读取存储参数
* 输 入 :无
* 输 出 Init_Data_Equipmend
*********************************************************************************************************
*/
Init_Data Read_Equipment_Par(void)
{
Init_Data Init_Data_Equipmend={'\0'};
EEPROM_ReadBytes(0, (u8*)Init_Data_Equipmend.Bc25_Ip,Bc25_Ip_len);
EEPROM_ReadBytes(20, (u8*)Init_Data_Equipmend.Bc25_Port,Bc25_Port_len);
EEPROM_ReadBytes(30, (u8*)Init_Data_Equipmend.ESP8266_AP_Ports,ESP8266_AP_Ports_len);
EEPROM_ReadBytes(60, (u8*)Init_Data_Equipmend.ESP8266_AP_PWDs,ESP8266_AP_PWDs_len);
EEPROM_ReadBytes(40, (u8*)Init_Data_Equipmend.ESP8266_AP_SSIDs,ESP8266_AP_SSIDs_len);
EEPROM_ReadBytes(100, (u8*)Init_Data_Equipmend.Measure_Interval,Measure_Interval_len);
EEPROM_ReadBytes(110, (u8*)Init_Data_Equipmend.Pub_Mode,Pub_Mode_len);
EEPROM_ReadBytes(120, (u8*)Init_Data_Equipmend.Pub_Time,Pub_Time_len);
EEPROM_ReadBytes(130, (u8*)Init_Data_Equipmend.Equipment_ID,Equipment_ID_len);
EEPROM_ReadBytes(150, (u8*)Init_Data_Equipmend.appointment_time,appointment_time_len);
EEPROM_ReadBytes(166, (u8*)Init_Data_Equipmend.measure_mode,measure_mode_len);
EEPROM_ReadBytes(185, &Init_Data_Equipmend.par_change,1);
EEPROM_ReadBytes(186, &Init_Data_Equipmend.Bc25_Send_Header,1);
EEPROM_ReadBytes(240, (u8*)Init_Data_Equipmend.IOT_Username,IOT_Username_len);
EEPROM_ReadBytes(260, (u8*)Init_Data_Equipmend.IOT_Password,IOT_Password_len);
EEPROM_ReadBytes(280, (u8*)Init_Data_Equipmend.IOT_Theme_name,IOT_Theme_name_len);
return Init_Data_Equipmend;
}
/*
*********************************************************************************************************
* 函 数 名: Write_Equipment_Par()
* 功能说明: 存储设备参数
* 输 入 :设备参数 Init_Data_Equipmend
* 输 出 :无
*********************************************************************************************************
*/
void Write_Equipment_Par(Init_Data Init_Data_Equipmend)
{
Clear_eeprom_par();
EEPROM_WriteBytes(0, (u8*)Init_Data_Equipmend.Bc25_Ip,strlen(Init_Data_Equipmend.Bc25_Ip));
EEPROM_WriteBytes(20, (u8*)Init_Data_Equipmend.Bc25_Port,strlen(Init_Data_Equipmend.Bc25_Port));
EEPROM_WriteBytes(30, (u8*)Init_Data_Equipmend.ESP8266_AP_Ports,strlen(Init_Data_Equipmend.ESP8266_AP_Ports));
EEPROM_WriteBytes(60, (u8*)Init_Data_Equipmend.ESP8266_AP_PWDs,strlen(Init_Data_Equipmend.ESP8266_AP_PWDs));
EEPROM_WriteBytes(40, (u8*)Init_Data_Equipmend.ESP8266_AP_SSIDs,strlen(Init_Data_Equipmend.ESP8266_AP_SSIDs));
EEPROM_WriteBytes(100, (u8*)Init_Data_Equipmend.Measure_Interval,strlen(Init_Data_Equipmend.Measure_Interval));
EEPROM_WriteBytes(110, (u8*)Init_Data_Equipmend.Pub_Mode,strlen(Init_Data_Equipmend.Pub_Mode));
EEPROM_WriteBytes(120, (u8*)Init_Data_Equipmend.Pub_Time,strlen(Init_Data_Equipmend.Pub_Time));
EEPROM_WriteBytes(130, (u8*)Init_Data_Equipmend.Equipment_ID,strlen(Init_Data_Equipmend.Equipment_ID));
EEPROM_WriteBytes(150, (u8*)Init_Data_Equipmend.appointment_time,appointment_time_len);
EEPROM_WriteBytes(166, (u8*)Init_Data_Equipmend.measure_mode,1);
EEPROM_WriteBytes(185, &Init_Data_Equipmend.par_change,1);
EEPROM_WriteBytes(185, &Init_Data_Equipmend.Bc25_Send_Header,1);
EEPROM_WriteBytes(140,&Par_store_flag,1);
EEPROM_WriteBytes(240, (u8*)Init_Data_Equipmend.IOT_Username,strlen(Init_Data_Equipmend.IOT_Username));
EEPROM_WriteBytes(260, (u8*)Init_Data_Equipmend.IOT_Password,strlen(Init_Data_Equipmend.IOT_Password));
EEPROM_WriteBytes(280, (u8*)Init_Data_Equipmend.IOT_Theme_name,strlen(Init_Data_Equipmend.IOT_Theme_name));
}
/*
*********************************************************************************************************
* 函 数 名: clear_Init_Data_Equipment()
* 功能说明: 清空运行参数
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void clear_Init_Data_Equipment(void)
{
memset(Init_Data_Equipment.Bc25_Ip,0,Bc25_Ip_len);
memset(Init_Data_Equipment.Bc25_Port,0,Bc25_Port_len);
memset(Init_Data_Equipment.ESP8266_AP_Ports,0,ESP8266_AP_Ports_len);
memset(Init_Data_Equipment.ESP8266_AP_PWDs,0,ESP8266_AP_PWDs_len);
memset(Init_Data_Equipment.ESP8266_AP_SSIDs,0,ESP8266_AP_SSIDs_len);
memset(Init_Data_Equipment.Measure_Interval,0,Measure_Interval_len);
memset(Init_Data_Equipment.Pub_Mode,0,Pub_Mode_len);
memset(Init_Data_Equipment.Pub_Time,0,Pub_Time_len);
memset(Init_Data_Equipment.Equipment_ID,0,Equipment_ID_len);
memset(Init_Data_Equipment.appointment_time,0,appointment_time_len);
memset(Init_Data_Equipment.measure_mode,0,measure_mode_len);
memset(Init_Data_Equipment.IOT_Username,0,IOT_Username_len);
memset(Init_Data_Equipment.IOT_Password,0,IOT_Password_len);
memset(Init_Data_Equipment.IOT_Theme_name,0,IOT_Theme_name_len);
Init_Data_Equipment.par_change=0;
Init_Data_Equipment.Bc25_Send_Header=0;
// Write_Equipment_Par(Init_Data_Equipment);
}
/*
*********************************************************************************************************
* 函 数 名: Clear_eeprom_par()
* 功能说明: 清空EEPROM
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void Clear_eeprom_par(void)
{
uint8_t data=0x00;
int i=0;
for(i=0;i<300;i++)
{
EEPROM_WriteBytes(i,&data,1);
}
}
/*
*********************************************************************************************************
* 函 数 名: Write_Factory_Par()
* 功能说明: 写入出厂参数
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void Write_Factory_Par(void)
{
clear_Init_Data_Equipment();//先清除存储器
sprintf(Init_Data_Equipment.Bc25_Ip,"%s","\"39.105.230.197\"");
sprintf(Init_Data_Equipment.Bc25_Port,"%s","1883");
// sprintf(Init_Data_Equipment.Bc25_Ip,"%s","\"219.238.240.58\"");
// sprintf(Init_Data_Equipment.Bc25_Port,"%s","9027");
sprintf(Init_Data_Equipment.ESP8266_AP_Ports,"%s","8080");
sprintf(Init_Data_Equipment.ESP8266_AP_PWDs,"%s","88888888");
sprintf(Init_Data_Equipment.ESP8266_AP_SSIDs,"%s","licawifi");
sprintf(Init_Data_Equipment.Measure_Interval,"%s","00001");
sprintf(Init_Data_Equipment.Pub_Mode,"%s","00");
sprintf(Init_Data_Equipment.Pub_Time,"%s","5");
sprintf(Init_Data_Equipment.Equipment_ID,"%s","123456789");
sprintf(Init_Data_Equipment.appointment_time,"%s","20221130114400");
sprintf(Init_Data_Equipment.measure_mode,"%s","0");
sprintf(Init_Data_Equipment.IOT_Username,"%s","\"lichao\"");
sprintf(Init_Data_Equipment.IOT_Password,"%s","\"910517@lc\"");
sprintf(Init_Data_Equipment.IOT_Theme_name,"%s","SM-1000M");
Init_Data_Equipment.par_change=0;
Init_Data_Equipment.Bc25_Send_Header=0;
Write_Equipment_Par(Init_Data_Equipment);
Par_store_flag=0x01;
EEPROM_WriteBytes(140,&Par_store_flag,1);
}
/*
*********************************************************************************************************
* 函 数 名: get_meaidv()
* 功能说明: 获取测量时间间隔S
* 输 入 :无
* 输 出 measurt_idv_set*60;
*********************************************************************************************************
*/
u32 get_meaidv(void)
{
uint32_t measurt_idv_set;
measurt_idv_set= hexToDec(Init_Data_Equipment.Measure_Interval);
return measurt_idv_set*60;
}
/*
*********************************************************************************************************
* 函 数 名: get_pubidv()
* 功能说明: 获取远传时间间隔S
* 输 入 :无
* 输 出 pub_idv_set*60
*********************************************************************************************************
*/
u32 get_pubidv(void)
{
uint32_t pub_idv_set;
pub_idv_set=hexToDec(Init_Data_Equipment.Pub_Time);
return pub_idv_set*60 + 60*2;
}
/*
*********************************************************************************************************
* 函 数 名: hexToDec()
* 功能说明: 数字字符串转10进制
* 输 入 字符串shex
* 输 出 转化后的数据mid
*********************************************************************************************************
*/
u16 hexToDec(char *shex)
{
u16 len,i,mid=0;
len=strlen(shex);
if(len>8)return 0;
for(i=0;i<len;i++)
{
if (shex[i] >= '0' && shex[i] <= '9')
{
if(i>0)mid*=10;
//mid *= (u16)pow(10,1);
mid += (shex[i] - '0');
}
else
return 0;
}
return mid;
}
/***************************** END OF FILE *********************************/