13 changed files with 423 additions and 17 deletions
@ -0,0 +1,58 @@ |
|||||
|
#include "../app/app_data_save.h" |
||||
|
#include "../msp/msp_eeprom.h" |
||||
|
#include "app_config.h" |
||||
|
|
||||
|
|
||||
|
DATA_SAVE data_save_arr[DATA_SAVE_LEN] = {0}; |
||||
|
|
||||
|
//初始化存放数据的结构体数组data_save_arr
|
||||
|
void data_save_init() |
||||
|
{ |
||||
|
int i = 0; |
||||
|
for(i = 0;i < DATA_SAVE_LEN; i++) |
||||
|
{ |
||||
|
data_save_arr[i].head[0] = HEAD0; |
||||
|
data_save_arr[i].head[1] = HEAD1; |
||||
|
data_save_arr[i].available = 1; |
||||
|
data_save_arr[i].val = 0; |
||||
|
data_save_arr[i].tail[0] = TAIL0; |
||||
|
data_save_arr[i].tail[1] = TAIL1; |
||||
|
} |
||||
|
} |
||||
|
//存放数据到eeprom中:1.从eeprom中取出数组 2.遍历寻找空位 3.把数组放回(写入)eeprom中
|
||||
|
void data_save_push(U8 Data) |
||||
|
{ |
||||
|
int i = 0; |
||||
|
int free = 0; |
||||
|
// 从eeprom中取出数组
|
||||
|
L0_Iap_Read_array(EEPROM_DATA_ADDR, data_save_arr,sizeof(data_save_arr)); |
||||
|
if(data_save_arr[0].head[0] != HEAD0 || data_save_arr[0].head[1] != HEAD1 |
||||
|
|| data_save_arr[0].tail[0] != TAIL0 || data_save_arr[0].tail[1] != TAIL1) |
||||
|
{ |
||||
|
data_save_init(); |
||||
|
} |
||||
|
// 遍历寻找空位
|
||||
|
for(i = 0;i < DATA_SAVE_LEN; i++) |
||||
|
{ |
||||
|
if(data_save_arr[i].available == 1) |
||||
|
{ |
||||
|
free = i; |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
// 当都有数据时
|
||||
|
if(i == DATA_SAVE_LEN) |
||||
|
{ |
||||
|
for(i = 0; i < DATA_SAVE_LEN - 1; i++) |
||||
|
{ |
||||
|
data_save_arr[i] = data_save_arr[i+1]; |
||||
|
} |
||||
|
free = DATA_SAVE_LEN - 1; |
||||
|
} |
||||
|
// 放到free位置
|
||||
|
data_save_arr[free].available = 0; |
||||
|
data_save_arr[free].val = Data; |
||||
|
|
||||
|
// 把数组放回(写入)eeprom中
|
||||
|
L0_Iap_Program_array(EEPROM_DATA_ADDR, data_save_arr,sizeof(data_save_arr)); |
||||
|
} |
@ -0,0 +1,32 @@ |
|||||
|
#ifndef _APP_DATA_SAVE_H |
||||
|
#define _APP_DATA_SAVE_H |
||||
|
|
||||
|
#include "../bsp/bsp_config.h" |
||||
|
|
||||
|
//定义所使用内存的起始和结尾标志
|
||||
|
#define HEAD0 0xa3 |
||||
|
#define HEAD1 0xa4 |
||||
|
#define TAIL0 0xa5 |
||||
|
#define TAIL1 0xa6 |
||||
|
|
||||
|
#define DATA_SAVE_LEN 10 //寄存器需要存放的最大数量为10组
|
||||
|
|
||||
|
#define EEPROM_DATA_ADDR 0x00 //定义一个起始地址为0x00的寄存器
|
||||
|
|
||||
|
//用来存储重量数据的结构体(数组)
|
||||
|
typedef struct |
||||
|
{ |
||||
|
U8 head[2]; |
||||
|
U8 available; |
||||
|
U8 val; |
||||
|
U8 tail[2]; |
||||
|
|
||||
|
}DATA_SAVE; |
||||
|
|
||||
|
extern DATA_SAVE data_save_arr[DATA_SAVE_LEN]; |
||||
|
|
||||
|
|
||||
|
extern void data_save_init(void); |
||||
|
extern void data_save_push(U8 Data); |
||||
|
|
||||
|
#endif |
@ -0,0 +1,238 @@ |
|||||
|
////////////////////////////////////////////////////////////////////////////
|
||||
|
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
|
||||
|
///-------------------------------------------------------------------------
|
||||
|
/// @file msp_eeprom.c
|
||||
|
/// @brief msp @ driver config
|
||||
|
///-------------------------------------------------------------------------
|
||||
|
/// @version 1.0
|
||||
|
/// @author CC
|
||||
|
/// @date 20190106
|
||||
|
/// @note cc_AS_stc02 由stc-isp v6.0860
|
||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||
|
|
||||
|
///cc 2023/04/07--8:44:38
|
||||
|
/*
|
||||
|
EEPROM 的写操作只能将字节中的 1 写为 0,当需要将字节中的 0 写为 1,则必须执行扇区 擦除操作。 |
||||
|
EEPROM 的读/写操作是以 1 字节为单位进行,而 EEPROM 擦除操作是以 1 扇区(512 字节) 为单位进行, |
||||
|
在执行擦除操作时,如果目标扇区中有需要保留的数据,则必须预先将这些数据读取到 RAM 中暂存, |
||||
|
待擦除完成后再将保存的数据和需要更新的数据一起再写回 |
||||
|
EEPROM Write operation can only write 1 in the byte as 0, when you need to write 0 in the byte as 1, |
||||
|
you must be sector erased. EEPROM Read / write operation is conducted in 1 byte, |
||||
|
while EEPROM, erasure operation is conducted in 1 sector (512 bytes). During the wipe operation, |
||||
|
if the data in the target sector, the data must be read in the RAM in advance, |
||||
|
and the saved data will be written back together with the data to be updated |
||||
|
|
||||
|
fixme:注意时钟和flash 相关 同时关注掉电和容错 |
||||
|
|
||||
|
*/ |
||||
|
|
||||
|
#include "msp_eeprom.h" |
||||
|
|
||||
|
#include "debug_drv.h" |
||||
|
|
||||
|
#if(TYPE_MCU == TYPE_MCU_STC_8A || TYPE_MCU == TYPE_MCU_STC_8F) |
||||
|
xxx |
||||
|
#define WT_30M 0x80 |
||||
|
#define WT_24M 0x81 |
||||
|
#define WT_20M 0x82 |
||||
|
#define WT_12M 0x83 |
||||
|
#define WT_6M 0x84 |
||||
|
#define WT_3M 0x85 |
||||
|
#define WT_2M 0x86 |
||||
|
#define WT_1M 0x87 |
||||
|
|
||||
|
//sdfasdfasdf
|
||||
|
void L0_Iap_Idle() |
||||
|
{ |
||||
|
IAP_CONTR = 0; //关闭IAP功能
|
||||
|
IAP_CMD = 0; //清除命令寄存器
|
||||
|
IAP_TRIG = 0; //清除触发寄存器
|
||||
|
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
|
||||
|
IAP_ADDRL = 0; |
||||
|
} |
||||
|
|
||||
|
char L0_Iap_Read(vU16 addr) |
||||
|
{ |
||||
|
char dat; |
||||
|
|
||||
|
IAP_CONTR = WT_12M; //使能IAP
|
||||
|
IAP_CMD = 1; //设置IAP读命令
|
||||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||||
|
_nop_(); |
||||
|
dat = IAP_DATA; //读IAP数据
|
||||
|
L0_Iap_Idle(); //关闭IAP功能
|
||||
|
|
||||
|
return dat; |
||||
|
} |
||||
|
|
||||
|
void L0_Iap_Program(vU16 addr, char dat) |
||||
|
{ |
||||
|
IAP_CONTR = WT_12M; //使能IAP
|
||||
|
IAP_CMD = 2; //设置IAP写命令
|
||||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||||
|
IAP_DATA = dat; //写IAP数据
|
||||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||||
|
_nop_(); |
||||
|
L0_Iap_Idle(); //关闭IAP功能
|
||||
|
} |
||||
|
|
||||
|
///每个扇区512字节
|
||||
|
///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区
|
||||
|
void L0_Iap_Erase(vU16 addr) |
||||
|
{ |
||||
|
IAP_CONTR = WT_12M; //使能IAP
|
||||
|
IAP_CMD = 3; //设置IAP擦除命令
|
||||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||||
|
_nop_(); //
|
||||
|
L0_Iap_Idle(); //关闭IAP功能
|
||||
|
} |
||||
|
|
||||
|
#elif (TYPE_MCU == TYPE_MCU_STC_8G || TYPE_MCU == TYPE_MCU_STC_8H) |
||||
|
void L0_Iap_Idle() |
||||
|
{ |
||||
|
IAP_CONTR = 0; //关闭IAP功能
|
||||
|
IAP_CMD = 0; //清除命令寄存器
|
||||
|
IAP_TRIG = 0; //清除触发寄存器
|
||||
|
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
|
||||
|
IAP_ADDRL = 0; |
||||
|
} |
||||
|
|
||||
|
char L0_Iap_Read(vU16 addr) |
||||
|
{ |
||||
|
char dat; |
||||
|
|
||||
|
IAP_CONTR = 0x80; //使能IAP
|
||||
|
IAP_TPS = 12; |
||||
|
IAP_CMD = 1; //设置IAP读命令
|
||||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||||
|
_nop_(); |
||||
|
dat = IAP_DATA; //读IAP数据
|
||||
|
L0_Iap_Idle(); //关闭IAP功能
|
||||
|
|
||||
|
return dat; |
||||
|
} |
||||
|
|
||||
|
void L0_Iap_Program(vU16 addr, char dat) |
||||
|
{ |
||||
|
IAP_CONTR = 0x80; //使能IAP
|
||||
|
IAP_TPS = 12; //设置擦除等待参数 12MHz
|
||||
|
IAP_CMD = 2; //设置IAP写命令
|
||||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||||
|
IAP_DATA = dat; //写IAP数据
|
||||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||||
|
_nop_(); |
||||
|
L0_Iap_Idle(); //关闭IAP功能
|
||||
|
} |
||||
|
|
||||
|
///每个扇区512字节
|
||||
|
///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区
|
||||
|
void L0_Iap_Erase(vU16 addr) |
||||
|
{ |
||||
|
IAP_CONTR = 0x80; //使能IAP
|
||||
|
IAP_TPS = 12; //设置擦除等待参数 12MHz
|
||||
|
IAP_CMD = 3; //设置IAP擦除命令
|
||||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||||
|
_nop_(); //
|
||||
|
L0_Iap_Idle(); //关闭IAP功能
|
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len) |
||||
|
{ |
||||
|
U8 i = 0; |
||||
|
L0_Iap_Erase(addr);/////fixme: 需要和addr配合好 一次就擦除512字节
|
||||
|
for(i=0;i<len;i++) |
||||
|
{ |
||||
|
L0_Iap_Program(addr + i,buf[i]); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void L0_Iap_Read_array(vU16 addr,U8 *buf,U8 len) |
||||
|
{ |
||||
|
U8 i = 0; |
||||
|
for(i = 0;i < len;i ++) |
||||
|
{ |
||||
|
buf[i] = L0_Iap_Read(addr + i); |
||||
|
} |
||||
|
/// L1_uartD_uchexArray(buf,len);
|
||||
|
} |
||||
|
|
||||
|
/****************************************************
|
||||
|
|
||||
|
U_F16 uf_ee_add; |
||||
|
|
||||
|
//// AX CMD R2 R3 R4
|
||||
|
/// Ae 01 01 03 04
|
||||
|
///L3_GC032A_fun
|
||||
|
// bsp/bsp_debug
|
||||
|
void L1_Iap_main(void) |
||||
|
{ |
||||
|
|
||||
|
int i;char m; |
||||
|
L0_Iap_Erase(0); |
||||
|
|
||||
|
|
||||
|
for(i = 0;i <100; i++) |
||||
|
{ |
||||
|
L0_Iap_Program(i,i); |
||||
|
} |
||||
|
for(i = 0;i <200; i++) |
||||
|
{ |
||||
|
m = L0_Iap_Read(i); |
||||
|
L0_uart0_uc(m); |
||||
|
} |
||||
|
|
||||
|
/// while(1);
|
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
///
|
||||
|
void L3_eeprom_fun(U8 *pPara) |
||||
|
{ |
||||
|
TS_P_debug *p = pPara; |
||||
|
switch(p->cmd) |
||||
|
{ |
||||
|
//Ae 03 03 04 00
|
||||
|
//xx 03 R2 R3 xx
|
||||
|
case 4: |
||||
|
L0_Iap_Erase(uf_ee_add.us); |
||||
|
break; |
||||
|
case 5: |
||||
|
L0_Iap_Program(uf_ee_add.us,p->R2); |
||||
|
break; |
||||
|
case 6: |
||||
|
L0_uart0_uc(L0_Iap_Read(uf_ee_add.us)); |
||||
|
break; |
||||
|
case 7:///选择地址
|
||||
|
uf_ee_add.BYTE2.H = p->R2; //h
|
||||
|
uf_ee_add.BYTE2.L = p->R3; //L
|
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
****************************************************/ |
||||
|
|
||||
|
|
||||
|
|
@ -0,0 +1,41 @@ |
|||||
|
//////////////////////////////////////////////////////////////////////////
|
||||
|
/// COPYRIGHT NOTICE
|
||||
|
/// Copyright (c) 2018, 传控科技
|
||||
|
/// All rights reserved.
|
||||
|
///
|
||||
|
/// @file msp_eeprom
|
||||
|
/// @brief msp_eeprom
|
||||
|
/// @info
|
||||
|
///(本文件实现的功能的详述)
|
||||
|
///
|
||||
|
/// @version 1.1 CCsens technology
|
||||
|
/// @author CC
|
||||
|
/// @date 20190106
|
||||
|
|
||||
|
//
|
||||
|
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
||||
|
#ifndef _msp_eeprom_H_ |
||||
|
#define _msp_eeprom_H_ |
||||
|
|
||||
|
#include "c_type51.h" |
||||
|
#include "c_lib.h" |
||||
|
|
||||
|
|
||||
|
///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
|
|
||||
|
#include "../bsp/bsp_config.h" |
||||
|
|
||||
|
extern void L3_eeprom_fun(U8 *pPara); |
||||
|
|
||||
|
///每个扇区512字节
|
||||
|
extern void L0_Iap_Erase(vU16 addr); |
||||
|
extern void L0_Iap_Program(vU16 addr, char dat); |
||||
|
extern char L0_Iap_Read(vU16 addr); |
||||
|
extern void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len); |
||||
|
extern void L0_Iap_Read_array(vU16 addr,U8 *buf,U8 len); |
||||
|
extern void L1_Iap_main(void); |
||||
|
|
||||
|
#endif// #ifndef _msp_eeprom_H_
|
||||
|
|
||||
|
|
Loading…
Reference in new issue