#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 //1 打开,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 Chinese 0 //0 Chinese 1 English #define English 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 Language; //蜂鸣器 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; //称重保持 U8 weight_keep_flag; U16 weight_keep_kgx10; } 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