You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

337 lines
8.6 KiB

#ifndef APP_CONFIG_H
#define APP_CONFIG_H
#include "c_type51.h"
//#include "asp_para.h"
#include "app_weight.h"
///#include "app_save.h"
#define APP_VERSION 0x10
#define D_MCU_BIGENDIAN 1
// #define D_MCU_LITTLEENDIAN 1
#define POWER_NORMAL 0
#define POWER_LOW 1
#define LeaveForbid_OPEN 1 //1 打开,0 不打开
#define LeaveForbid_OFF 0
// #define RFID_FREE_NO 0x00FA
#define NET_STATUS_NOTCONNECT 1
#define NET_STATUS_CONNECTED 0
#define KG 0 //0 KG; 1 磅
#define lb 1
#define beep_on 1 //1 开启,0 关闭
#define beep_off 0
enum tp_handle
{
TP_HANDLED,
TP_UNHANDLE
};
////#define baud_rade L3_baud_rate_change(G.p.baud_rate)
//STEP 3 Register CONFIG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
///存放全局需要保存的数据
///cc 2023/04/07--5:12:12 包含系统运行需要的:通讯参数 低功耗配置 采集配置 功能配置(称重)等
/*
每个任务都有自己的变量,原则上没有所谓的整个系统全局的,最接近全局的应该是
低功耗的任务 有权利安排其他的任务,其他的任务都可以自己形成闭环 按消费者生产者的模式运行和信息交换
其他任务都可以有需要保存的变量和出厂的变量 (保存的变量和出厂的一般都一致,更简单一点)
这些需要保存的可以放到S中 TS_GlobalRegisterSave_
出厂数据放到 code中和程序hex文件一体,除非烧写程序(固件)
数据类型 数据状态 存放地方 初始化情况 修改情况 和其他数据的关系
S保存参数 整个(结构体) eeprom中 该批量实际测试参数 操作eeprom 如果出现问题,出厂参数赋值给保存参数,然后到eeprom
F出厂参数 整个(结构体) code/程序/hex 该批量实际测试参数 随着烧写程序
R运行参数 整个(结构体) ram中 参数来自保存参数 程序运行中修改
C缓存参数 多个独立结构体 ram 程序运行中
顺序 出厂参数--> 保存参数--> 运行参数-->缓存参数
大小 出厂参数 = 保存参数 >= 运行参数>= 缓存参数
R运行参数 拷贝到 eeprom中的保存参数中,内存丰厚的 可以把保存参数做个缓存,
内存需要精简的 S保存参数直接放到eeprom 不要建立缓存
寄存器模式 register
是包含再参数中 是先有参数后有相对地址,然后抽象成寄存器
或者说设计的时候,先设计寄存器,然后组合,最后形成了吧保存参数
系统存储区域分一个或多个扇区
每个系统存储区域 包含多个任务的参数区
每个任务:
分配地址
数据大小:也可以由数据结构 ,鼓励自己计算 确保每个细节可以把控“把正确的数据放到正确的地方”
数据结构
512个字节
一个扇区 512
有个区域配置这些
程序操作存储时 关闭一切中断
烧写程序的时候选择两种,一种清除掉所有的eeprom 在这种情况
程序运行时 读取eeprom中的0x55aa,如果不是那么就读取F然后放入eeprom中,然后 S 放入运行R参数中,如果是直
*/
/*********
///cc 2023/04/08--4:2:23 需要整理
写操作1字节,
擦除1扇区 512字节---4-6ms
字节中的0写为1时 擦除扇区
最安全最简单,最逻辑清楚的事,就是
每次擦一个扇区每次写一个扇区,
--->每次擦一个扇区每次写一个扇区的前面的有效数据,
1,要求我们尽量小,最好少于512字节
次数限制 30万次
2, 尽量减少写,擦.--->调试的时候要谨慎,最后才可打开写;
背景知识和应用需求决定了存储策略是如何设计的
flash 28k 分出8k EEp 则物理地址位28K的最后8K 物理地址为5000h-6FFFh
*******/
/*******
app_config 可以调用app_save 偏向应用级别的配置文件
app_save 保存的策略,不同程序可能要求不同
板子有什么外设,这些几乎是纯硬件的东西,另外根据基本的应用,需要板子的外设如何使用的大部分放到bsp中
asp 已经有模式的配置了,app通过参数调用asp,来决定使用外设什么模式.
协议发送,尽量是透明的.
app 结果 重量,保存校准参数
asp app support program wifi的模式设置,adc的读取后的处理
bsp board support program 板子上有的外设,wdt,wifi的底层配置函数,sensor
msp mcu support program ,cpu自身的外设,uart led
cpu
*****/
/*******
adc采样值
^
|
| o
| |
| o |
| | |
| ---|---- |------------0=adc=0
0 | |D_ADC_OFFSET
|____|_____|____________>重量 adc + D_ADC_OFFSET
0 40 80 重量点
称重需要保存的东西:
1,传感器正负转换的<偏移量 >
2,传感器找平的偏移量 一般选择四个传感器在0kg的时候的<最小值>
3,<三个重量点的校准> + <零点偏移量>
3.1 极端重量的过滤,超过250kg,或者坐偏的时候出现异常值,无效,维持上次值.<超过250kg,>
4, 上电自动校准零点:零点校准 刚上电的时候如果重量小于某个范围<(+-10kg)>,默认这个重量为此时的<零点>
所以这个范围需要配置,需要存储.
5,手工清零的时候,此时重量<零点>需要修改,产生一个偏移量,同时其他的两个校准点需要程序计算时同步更新.
相当于调用4,但是范围不限.
策略B:4不用保存零点,只有手工清零才保存一下.
---->策略C: 4.5 都不保存,只有用户校准状态才保存
选择c,按键配合,长按按键时重量为0 闪烁(H1sL0.5s)3下
本次称重功能需要保存的东西:
正负转换的<偏移量 > Byte x n=? 出厂才定.
找平的偏移量 Byte x n=? 出厂才定.
<三个重量点的校准> Byte x n=? 出厂才定.
<零点偏移量> 出厂定,校准清零
极端重量的过滤,超过250kg 出厂定
其他需要保存
版本号,id之类的
写3个扇区,之后判定两个扇区以上相同,并且在合理范围内,此参数才可使用.否则使用程序出厂内置的参数.
*****/
////整体放入eeprom的扇区种
typedef struct
{
//RO Register
//RW Register
TS_adc_SPara_ adc_SPara[4];
TS_weight_SPara_ weight_SPara;//// 称重的参数
U16 d0xaa55;
}TS_GlobalRegisterSave_;
extern TS_GlobalRegisterSave_ S;
typedef struct global_register
{
//称重
struct
{
U16 sensor_adc[4];
U16 kgx10_out;
U16 adc16;
S16 differ;
} weight;
//电量
U8 dl;
//网络状态
U8 net_status;
//单位
U8 danwei;
//蜂鸣器
U8 beep;
//蜂鸣器开启时间
U32 beep_startime;
//离床报警开启标志
U8 LeaveForbid_flag;
//离床报警手动解除标志
U8 ForbidDelate_flag;
//离床报警参考重量
U16 Weight_Ref;
//功耗模式
U8 power_mode;
//屏幕按键按下标志
U8 ScrTouch_flag;
//屏幕按键按下时间
U32 ScrTouch_time;
// 校准index
U8 calib_index;
// 校准重量
U16 calib_kg_x100;
} GlobalRegister;
extern GlobalRegister R;
#define D_S_LEN (D_TS_weight_SPara_len + D_TS_adc_SPara_LEN*D_ADC_CHANNEL_NUM +2 +8)///+8为了容错及扩展
///cc 2023/04/07--15:4:20 独立任务有独立的存储 ,还是比较麻烦,简单至上吧
/*
typedef struct
{
//RO Register
U16 add;
U16 num;
u8* pdat;
U16 0xaa55;////作为本任务保存的
}TS_para_;
*/
#define D_GlobalRegister_size 2
//寄存器内存基地址
#define REG_MEM_BASE ((U16*)(&S)) //寄存器基础地址(本文件外部不应该使用该宏定义)
//变量地址转寄存器
#define MEM_2_REG(mem) (((U16*)(mem) - REG_MEM_BASE) + 1)
//寄存器转变量地址
#define REG_2_MEM(reg) (REG_MEM_BASE + (U16)((reg) - 1))
#define D_EEP_BASE 0x0
extern vtype L3_S_init(void);
extern int L3_mcu_id_ok();
extern S32 L3_count_std_weight(S32 weight);
extern void L3_eeprom_persist_param(void);
extern U8 L1_para_read(U8 *buf,U8 *len);
extern U8 L1_para_write(U8 *buf, U8 len);
extern void L0_main_lowp(void);
extern void L3_S_2_R(void);
extern void L3_R_2_S(void);
extern void L3_reg_init(void);
#if 0
typedef struct
{
/// U8 enc_key[MCU_ID_KEY_LEN];
/// U8 mcu_id[MCU_ID_LEN];
/// U8 mcu_enc_id[MCU_ID_LEN];
}McuEncryptInfo;
#define D_ch_max_num 4
typedef struct global_param
{
//EncryptInfo
McuEncryptInfo e;
//Global Variables
S32 weight[D_ch_max_num]; //4路重量
S32 allweight; //总重量
S32 _total_weight; //实际重量*1000
S32 _total_zweight; //实际皮重*1000
}TS_GlobalParam_;
extern TS_GlobalParam_ G;
///extern TS_eeprom_param_ eep_param;
///extern TS_EEPROM_ENC_ eep_enc;
#endif
#endif