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.
264 lines
7.6 KiB
264 lines
7.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
|
|
|
|
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;
|
|
|
|
#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);
|
|
|
|
|
|
|
|
|
|
|
|
#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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|