9 Commits

Author SHA1 Message Date
YuanHongbin be6f52fa8b refactor: LaserTimerMinutes校验前移并增加范围检查,移除文件BOM冗余 2026-07-23 09:59:59 +08:00
YuanHongbin 6fee6323ea feat: 默认调试输出通道改为RS485_1(ch1) 2026-07-23 09:50:37 +08:00
YuanHongbin 0df22b4186 feat: para指令新增激光状态与定时分钟数显示 2026-07-23 09:34:28 +08:00
YuanHongbin f0d3f51922 fix: LaserTimerMinutes持久化存储到Flash
1. AppPara_T新增LaserTimerMinutes字段,上电从Flash加载
2. 首次使用默认10分钟,laser time修改后SAVE_APP_PARA保存
3. 断电重启后保留上次设定值
2026-07-23 09:23:50 +08:00
YuanHongbin afda00d8f2 fix: 激光定时器两处修复
1. 网关/调试指令开激光后重置LaserTimerCount,避免立即误触发关闭
2. 自动关闭条件新增LaserTimerMinutes>0判断,laser time 0可真正禁用定时
2026-07-22 15:38:58 +08:00
YuanHongbin 72844ff821 feat: 新增激光定时关闭与姿态角持续输出测试功能,编码转UTF-8
1. 激光定时自动关闭:默认10分钟,laser on启动计时,超时自动关并上报
2. laser time <min>可配置定时分钟数,0=关闭定时
3. att on/off持续输出姿态角(Pitch/Roll/Yaw),不注册不低功耗
4. 20个源文件从GB2312编码转为UTF-8 with BOM
2026-07-20 17:04:48 +08:00
YuanHongbin 70758b1c06 fix: 修复审查发现的4个高危问题
1. UartDebug: RS485通道1关闭指令误操作通道2,修正'u'升降级通道混淆
2. bsp: GPIOInit新增PA3(ADC电源控制引脚)初始化为输出
3. main.h: Nonce从int16_t改为uint16_t,消除rand()溢出导致LPTimer0延时异常
4. SGCP: SUB_STATUS_BROADCAST_SYNC_TIME调用ToSDSetColTime改为ToSDSyncTime
2026-07-14 18:16:53 +08:00
YuanHongbin de545c9919 feat: 新增信号质量查询指令(sig)
1. 新增GWTOMD_CMD_SIGNAL(0x09)指令,Payload为空,GWAddr填0
2. 不依赖注册状态,同频段网关收到后返回SNR和RSSI
3. 传感器收到回应后读取本地SX1276的SNR/RSSI
4. 通过调试串口打印TX(上行)/RX(下行)两方向信号质量
5. 新增sig调试指令,内置设备忙状态保护
2026-07-14 10:13:17 +08:00
YuanHongbin 9f200e2e83 fix: 修复串口调试DCH通道切换无效及UART0无法接收调试指令的问题
1. DBGUartSend/DBGUartSendByte改为运行时通过gDebugChannel选择输出通道,替代编译期USE_BOOTLOADER宏
2. 启用Uart0_IRQHandler中的DebugUartIRQ调用,使UART0可接收调试指令
2026-07-13 15:34:41 +08:00
20 changed files with 1516 additions and 1269 deletions
+27 -27
View File
@@ -1,23 +1,23 @@
/************************************************************************************************ /************************************************************************************************
* 程序版本:V3.0 * 程序版本:V3.0
* 程序日期:2022-11-3 * 程序日期:2022-11-3
* 程序作者: * 程序作者:
************************************************************************************************/ ************************************************************************************************/
#include "Imu.h" #include "Imu.h"
#include "main.h" #include "main.h"
#define Kp_New 0.9f //互补滤波当前数据的权重 #define Kp_New 0.9f //互补滤波当前数据的权重
#define Kp_Old 0.1f //互补滤波历史数据的权重 #define Kp_Old 0.1f //互补滤波历史数据的权重
#define Acc_Gain 0.0001220f //加速度变成G (初始化加速度满量程-+4g LSBa = 2*4/65535.0) #define Acc_Gain 0.0001220f //加速度变成G (初始化加速度满量程-+4g LSBa = 2*4/65535.0)
#define Gyro_Gain 0.0609756f //角速度变成度 (初始化陀螺仪满量程+-2000 LSBg = 2*2000/65535.0) #define Gyro_Gain 0.0609756f //角速度变成度 (初始化陀螺仪满量程+-2000 LSBg = 2*2000/65535.0)
#define Gyro_Gr 0.0010641f //角速度变成弧度(3.1415/180 * LSBg) #define Gyro_Gr 0.0010641f //角速度变成弧度(3.1415/180 * LSBg)
//kp=ki=0 就是完全相信陀螺仪 //kp=ki=0 就是完全相信陀螺仪
#define Kp 1.5f // proportional gain governs rate of convergence to accelerometer/magnetometer #define Kp 1.5f // proportional gain governs rate of convergence to accelerometer/magnetometer
//比例增益控制加速度计,磁力计的收敛速率 //比例增益控制加速度计,磁力计的收敛速率
#define Ki 0.005f // integral gain governs rate of convergence of gyroscope biases #define Ki 0.005f // integral gain governs rate of convergence of gyroscope biases
//积分增益控制陀螺偏差的收敛速度 //积分增益控制陀螺偏差的收敛速度
#define halfT 0.005f // half the sample period 采样周期的一半 #define halfT 0.005f // half the sample period 采样周期的一半
static volatile float q0 = 1, q1 = 0, q2 = 0, q3 = 0; // quaternion elements representing the estimated orientation static volatile float q0 = 1, q1 = 0, q2 = 0, q3 = 0; // quaternion elements representing the estimated orientation
static volatile float exInt = 0, eyInt = 0, ezInt = 0; // scaled integral error static volatile float exInt = 0, eyInt = 0, ezInt = 0; // scaled integral error
@@ -29,7 +29,7 @@ static float MedianValue(float *value_buf, unsigned int size)
unsigned int i,j; unsigned int i,j;
float temp; float temp;
//排序采用冒泡法 //排序采用冒泡法
for (j=0;j<=size;j++){ for (j=0;j<=size;j++){
for (i=0;i<=size-j;i++){ for (i=0;i<=size-j;i++){
if (value_buf[i] > value_buf[i+1]){ if (value_buf[i] > value_buf[i+1]){
@@ -194,48 +194,48 @@ static void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az
if(ax*ay*az==0) if(ax*ay*az==0)
return; return;
//加速度计<测量>的重力加速度向量(机体坐标系) //加速度计<测量>的重力加速度向量(机体坐标系)
norm = invSqrt(ax*ax + ay*ay + az*az); norm = invSqrt(ax*ax + ay*ay + az*az);
ax = ax * norm; ax = ax * norm;
ay = ay * norm; ay = ay * norm;
az = az * norm; az = az * norm;
// printf("ax=%0.2f ay=%0.2f az=%0.2f\r\n",ax,ay,az); // printf("ax=%0.2f ay=%0.2f az=%0.2f\r\n",ax,ay,az);
//陀螺仪积分<估计>重力向量(机体坐标系) //陀螺仪积分<估计>重力向量(机体坐标系)
vx = 2*(q1q3 - q0q2); //矩阵(3,1)项 vx = 2*(q1q3 - q0q2); //矩阵(3,1)项
vy = 2*(q0q1 + q2q3); //矩阵(3,2)项 vy = 2*(q0q1 + q2q3); //矩阵(3,2)项
vz = q0q0 - q1q1 - q2q2 + q3q3 ; //矩阵(3,3)项 vz = q0q0 - q1q1 - q2q2 + q3q3 ; //矩阵(3,3)项
//向量叉乘所得的值 //向量叉乘所得的值
ex = (ay*vz - az*vy); ex = (ay*vz - az*vy);
ey = (az*vx - ax*vz); ey = (az*vx - ax*vz);
ez = (ax*vy - ay*vx); ez = (ax*vy - ay*vx);
//用上面求出误差进行积分 //用上面求出误差进行积分
exInt = exInt + ex * Ki; exInt = exInt + ex * Ki;
eyInt = eyInt + ey * Ki; eyInt = eyInt + ey * Ki;
ezInt = ezInt + ez * Ki; ezInt = ezInt + ez * Ki;
//将误差PI后补偿到陀螺仪 //将误差PI后补偿到陀螺仪
gx = gx + Kp*ex + exInt; gx = gx + Kp*ex + exInt;
gy = gy + Kp*ey + eyInt; gy = gy + Kp*ey + eyInt;
gz = gz + Kp*ez + ezInt;//这里的gz由于没有观测者进行矫正会产生漂移,表现出来的就是积分自增或自减 gz = gz + Kp*ez + ezInt;//这里的gz由于没有观测者进行矫正会产生漂移,表现出来的就是积分自增或自减
//四元素的微分方程 //四元素的微分方程
q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT; q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT; q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT; q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT; q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;
//单位化四元数 //单位化四元数
norm = invSqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3); norm = invSqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
q0 = q0 * norm; q0 = q0 * norm;
q1 = q1 * norm; q1 = q1 * norm;
q2 = q2 * norm; q2 = q2 * norm;
q3 = q3 * norm; q3 = q3 * norm;
// 矩阵表达式 // 矩阵表达式
// matrix[0] = q0q0 + q1q1 - q2q2 - q3q3; // 11 // matrix[0] = q0q0 + q1q1 - q2q2 - q3q3; // 11
// matrix[1] = 2.f * (q1q2 + q0q3); // 12 // matrix[1] = 2.f * (q1q2 + q0q3); // 12
// matrix[2] = 2.f * (q1q3 - q0q2); // 13 // matrix[2] = 2.f * (q1q3 - q0q2); // 13
@@ -246,7 +246,7 @@ static void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az
// matrix[7] = 2.f * (q2q3 - q0q1); // 32 // matrix[7] = 2.f * (q2q3 - q0q1); // 32
// matrix[8] = q0q0 - q1q1 - q2q2 + q3q3; // 33 // matrix[8] = q0q0 - q1q1 - q2q2 + q3q3; // 33
//下一步是四元数转换成欧拉角(Z->Y->X) //下一步是四元数转换成欧拉角(Z->Y->X)
} }
+6 -6
View File
@@ -1,17 +1,17 @@
#ifndef _IMU_H_ #ifndef _IMU_H_
#define _IMU_H_ #define _IMU_H_
#include <math.h> #include <math.h>
#define PI 3.14159265358979323846f #define PI 3.14159265358979323846f
#define RAD_TO_DEG 57.2957795 // 弧度到度的转换系数 #define RAD_TO_DEG 57.2957795 // 弧度到度的转换系数
#define DEG_TO_RAD 0.0174533 // 度到弧度的转换系数 #define DEG_TO_RAD 0.0174533 // 度到弧度的转换系数
// 定义欧拉角结构体 // 定义欧拉角结构体
typedef struct { typedef struct {
volatile float roll, pitch, yaw;//弧度 volatile float roll, pitch, yaw;//弧度
}Rad_T, *RadDp; }Rad_T, *RadDp;
typedef struct { typedef struct {
volatile float roll, pitch, yaw;//角度 volatile float roll, pitch, yaw;//角度
}Deg_T, *DegDp; }Deg_T, *DegDp;
#define Imu_AccFilterSize 10 #define Imu_AccFilterSize 10
+8 -8
View File
@@ -1,4 +1,4 @@
#include "sx127x.h" #include "sx127x.h"
#include "ddl.h" #include "ddl.h"
#include "UartDebug.h" #include "UartDebug.h"
@@ -271,7 +271,7 @@ void Sx1276LoRaEnterRx(void)
uint8_t temp; uint8_t temp;
SX1276Read(REG_LR_IRQFLAGS, &temp); SX1276Read(REG_LR_IRQFLAGS, &temp);
//设置接收模式 //设置接收模式
LORA_ANTRXEN(); LORA_ANTRXEN();
} }
@@ -314,17 +314,17 @@ void Sx1276LoRaInit(void (*RxCallBack)(uint8_t *rBuff, uint8_t rlen))
//SpreadingFactor //SpreadingFactor
if( LoRaPara.SpreadFactor == SX1276_SF_64){ if( LoRaPara.SpreadFactor == SX1276_SF_64){
SX1276LoRaSetNbTrigPeaks(5); SX1276LoRaSetNbTrigPeaks(5);
SX1276LoRaSetLowDatarateOptimize(TRUE); //低数据速率设置 SX1276LoRaSetLowDatarateOptimize(TRUE); //低数据速率设置
} }
else{ else{
SX1276LoRaSetNbTrigPeaks(3); SX1276LoRaSetNbTrigPeaks(3);
SX1276LoRaSetLowDatarateOptimize(FALSE); //低数据速率设置 SX1276LoRaSetLowDatarateOptimize(FALSE); //低数据速率设置
} }
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_SF_MASK ) | LoRaPara.SpreadFactor; LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_SF_MASK ) | LoRaPara.SpreadFactor;
//PacketCrcOn //PacketCrcOn
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) | SX1276_CRC_ON; //SX1276_CRC_OFF LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) | SX1276_CRC_ON; //SX1276_CRC_OFF
//验证寄存器操作是否成功 //验证寄存器操作是否成功
SX1276Write(REG_LR_MODEMCONFIG2, LoRaPara.RegBuff.RegModemConfig2); SX1276Write(REG_LR_MODEMCONFIG2, LoRaPara.RegBuff.RegModemConfig2);
uint8_t Config2 = 0; uint8_t Config2 = 0;
SX1276Read(REG_LR_MODEMCONFIG2, &Config2); SX1276Read(REG_LR_MODEMCONFIG2, &Config2);
@@ -425,7 +425,7 @@ void Sx1276LoRaLoopHandler(void)
void Sx1276LoRaSendBuffer(uint8_t* pucBuff, uint8_t ucLen) void Sx1276LoRaSendBuffer(uint8_t* pucBuff, uint8_t ucLen)
{ {
//设置发送模式 //设置发送模式
LORA_ANTTXEN(); LORA_ANTTXEN();
LoRaPara.State = SX1276_BUSY; LoRaPara.State = SX1276_BUSY;
@@ -473,8 +473,8 @@ void Sx1276LoRaWakeup(void)
} }
//////////////////////////////////////// ////////////////////////////////////////
//配置本层参数的函数 //配置本层参数的函数
//频道表 //频道表
const uint32_t gdwSx1276ChannelTbl[SX1276_CHANNEL_MAX]={ const uint32_t gdwSx1276ChannelTbl[SX1276_CHANNEL_MAX]={
FREQ_CENT-FREQ_DEV*8, FREQ_CENT-FREQ_DEV*7, FREQ_CENT-FREQ_DEV*6, FREQ_CENT-FREQ_DEV*5, FREQ_CENT-FREQ_DEV*8, FREQ_CENT-FREQ_DEV*7, FREQ_CENT-FREQ_DEV*6, FREQ_CENT-FREQ_DEV*5,
FREQ_CENT-FREQ_DEV*4, FREQ_CENT-FREQ_DEV*3, FREQ_CENT-FREQ_DEV*2, FREQ_CENT-FREQ_DEV*1, FREQ_CENT-FREQ_DEV*4, FREQ_CENT-FREQ_DEV*3, FREQ_CENT-FREQ_DEV*2, FREQ_CENT-FREQ_DEV*1,
+248 -114
View File
@@ -15,7 +15,7 @@
#define DEBUG_CMD_CNT 16 #define DEBUG_CMD_CNT 16
const DBGFunType DebugFun[DEBUG_CMD_CNT]; const DBGFunType DebugFun[DEBUG_CMD_CNT];
volatile DebugChannel_e gDebugChannel = DBG_CH_UART0; volatile DebugChannel_e gDebugChannel = DBG_CH_RS485_1;//上电默认调试口
static char buff[DEBUG_BUFSIZE]; static char buff[DEBUG_BUFSIZE];
volatile uint16_t iw=0; /* buffer write index*/ volatile uint16_t iw=0; /* buffer write index*/
@@ -62,24 +62,24 @@ void vcom_Send( char *format, ... )
void vcom_Print(uint8_t sLen) void vcom_Print(uint8_t sLen)
{ {
// 定义一个字符指针CurChar // 定义一个字符指针CurChar
char* CurChar; char* CurChar;
// 初始化ir // 初始化ir
ir = 0; ir = 0;
// 当ir小于sLen时,循环执行 // 当ir小于sLen时,循环执行
while(ir < sLen) while(ir < sLen)
{ {
// 获取字符指针CurChar // 获取字符指针CurChar
CurChar = &buff[ir++]; CurChar = &buff[ir++];
// 调用DebugUartSend函数,发送CurChar指向的字符,次数为1 // 调用DebugUartSend函数,发送CurChar指向的字符,次数为1
DBGUartSend((uint8_t*)CurChar, 1); DBGUartSend((uint8_t*)CurChar, 1);
} }
} }
// 定义一个函数vcom_Send2,用于发送字符串 // 定义一个函数vcom_Send2,用于发送字符串
void vcom_Send2(uint8_t *sData, uint16_t len) void vcom_Send2(uint8_t *sData, uint16_t len)
{ {
// 遍历sData,将每个元素发送到DebugUartSend // 遍历sData,将每个元素发送到DebugUartSend
for(int i = 0; i < len; i++) { for(int i = 0; i < len; i++) {
DBGUartSendByte(sData[i]); DBGUartSendByte(sData[i]);
} }
@@ -94,7 +94,7 @@ void DebugLoopHandler(void)
return; return;
//for(argv[argc] = strtok(RxBuff, " '\r'"); argv[argc] != NULL; argv[++argc] = strtok(NULL, " '\r'")); //for(argv[argc] = strtok(RxBuff, " '\r'"); argv[argc] != NULL; argv[++argc] = strtok(NULL, " '\r'"));
// 解析字符串,将参数放入argv数组中 // 解析字符串,将参数放入argv数组中
argp = strtok(RxBuff, " "); argp = strtok(RxBuff, " ");
for(int i = 0; i < 10; i++) { for(int i = 0; i < 10; i++) {
if(argp != NULL) { if(argp != NULL) {
@@ -107,19 +107,19 @@ void DebugLoopHandler(void)
} }
} }
// 获取第一个参数,并将其赋值给argp // 获取第一个参数,并将其赋值给argp
argp = strtok(argv[argc], "'\r'"); argp = strtok(argv[argc], "'\r'");
// 如果argp不为空,则将argp的值赋值给argv[argc],并将argc加1 // 如果argp不为空,则将argp的值赋值给argv[argc],并将argc加1
if(argp != NULL) { if(argp != NULL) {
argv[argc++] = argp; argv[argc++] = argp;
} }
// 否则,将RxLen设置为0,并返回 // 否则,将RxLen设置为0,并返回
else { else {
RxLen = 0; RxLen = 0;
return; return;
} }
// 遍历DebugFun数组,查找argv[0]是否与DBGCmd匹配,若匹配则调用DBGExec函数 // 遍历DebugFun数组,查找argv[0]是否与DBGCmd匹配,若匹配则调用DBGExec函数
for(int i = 0; i < DEBUG_CMD_CNT; i++) { for(int i = 0; i < DEBUG_CMD_CNT; i++) {
if(strcmp(argv[0], DebugFun[i].DBGCmd) == 0) if(strcmp(argv[0], DebugFun[i].DBGCmd) == 0)
DebugFun[i].DBGExec(argc, argv); DebugFun[i].DBGExec(argc, argv);
@@ -129,45 +129,45 @@ void DebugLoopHandler(void)
RxLen = 0; RxLen = 0;
} }
// 函数:Debug1mSRoutine // 函数:Debug1mSRoutine
// 功能:1ms调试时钟routine // 功能:1ms调试时钟routine
void Debug1mSRoutine(void) void Debug1mSRoutine(void)
{ {
// 如果1ms调试时钟计数器大于0 // 如果1ms调试时钟计数器大于0
if(RxRevTimeOutCnt > 0) if(RxRevTimeOutCnt > 0)
// 1ms调试时钟计数器减1 // 1ms调试时钟计数器减1
RxRevTimeOutCnt--; RxRevTimeOutCnt--;
} }
// 定义函数DebugUartIRQ,用于处理串口接收中断 // 定义函数DebugUartIRQ,用于处理串口接收中断
void DebugUartIRQ(uint8_t Data) void DebugUartIRQ(uint8_t Data)
{ {
// 如果1分钟超时计数器为0,则清空RxLen // 如果1分钟超时计数器为0,则清空RxLen
if(RxRevTimeOutCnt == 0) if(RxRevTimeOutCnt == 0)
RxLen = 0; RxLen = 0;
// 重置1分钟超时计数器 // 重置1分钟超时计数器
RxRevTimeOutCnt = 3; RxRevTimeOutCnt = 3;
// 如果RxLen小于128,则将数据添加到RxBuff中 // 如果RxLen小于128,则将数据添加到RxBuff中
if(RxLen < 128) { if(RxLen < 128) {
RxBuff[RxLen++] = Data; RxBuff[RxLen++] = Data;
} }
// DBG_LOG("RxBuff = %s\n", RxBuff); // DBG_LOG("RxBuff = %s\n", RxBuff);
// RS485_Flag=1;//接收标志为置1 // RS485_Flag=1;//接收标志为置1
} }
extern uint8_t LocalMAC[6]; //本机MAC地址 extern uint8_t LocalMAC[6]; //本机MAC地址
extern uint8_t GatewayMAC[6]; //网关MAC地址,注册时全为0 extern uint8_t GatewayMAC[6]; //网关MAC地址,注册时全为0
extern uint32_t LocalType; extern uint32_t LocalType;
extern uint32_t CommWay; extern uint32_t CommWay;
extern uint32_t DeviceSign; extern uint32_t DeviceSign;
extern uint32_t AddNumber; extern uint32_t AddNumber;
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugCmdGetPara * 函数名称: DebugCmdGetPara
* 功能描述: 查看参数 * 功能描述: 查看参数
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 argv, 输入参数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void DebugCmdGetPara(int argc, char *argv[]) static void DebugCmdGetPara(int argc, char *argv[])
{ {
@@ -214,6 +214,8 @@ static void DebugCmdGetPara(int argc, char *argv[])
DBG_LOG("Lora: ch %d, rp %d, fc %d\r\n", App.Para.Lora.ucChannel, App.Para.Lora.RegPreamble, App.Para.Lora.FreqCent); DBG_LOG("Lora: ch %d, rp %d, fc %d\r\n", App.Para.Lora.ucChannel, App.Para.Lora.RegPreamble, App.Para.Lora.FreqCent);
DBG_LOG("LpCfg: CI:%dsec, RI:%dmin, EI:%dmin, ET:%dmin\r\n", DBG_LOG("LpCfg: CI:%dsec, RI:%dmin, EI:%dmin, ET:%dmin\r\n",
App.Para.Layout.CollectTime*30, App.Para.Layout.ReportInterval/2, App.Para.Layout.ERInterval/2, App.Para.Layout.ERTime/2); App.Para.Layout.CollectTime*30, App.Para.Layout.ReportInterval/2, App.Para.Layout.ERInterval/2, App.Para.Layout.ERTime/2);
DBG_LOG("Laser: %s, AutoOff: %dmin\r\n",
(SGCP.LaserOnOff == true) ? "ON" : "OFF", SGCP.LaserTimerMinutes);
struct tm *stime; struct tm *stime;
uint32_t dwStamp = TimeTs(); uint32_t dwStamp = TimeTs();
stime = localtime(&dwStamp); stime = localtime(&dwStamp);
@@ -226,11 +228,11 @@ static void DebugCmdGetPara(int argc, char *argv[])
DBG_LOG("**********************************************************\r\n"); DBG_LOG("**********************************************************\r\n");
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugCmdMainOnOff * 函数名称: DebugCmdMainOnOff
* 功能描述: 主调试信息开关 * 功能描述: 主调试信息开关
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 argv, 输入参数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void DebugCmdMainOnOff(int argc, char *argv[]) static void DebugCmdMainOnOff(int argc, char *argv[])
{ {
@@ -253,11 +255,11 @@ static void DebugCmdMainOnOff(int argc, char *argv[])
} }
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugCmdDataOnOff * 函数名称: DebugCmdDataOnOff
* 功能描述: 数据调试信息开关 * 功能描述: 数据调试信息开关
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 argv, 输入参数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void DebugCmdDataOnOff(int argc, char *argv[]) static void DebugCmdDataOnOff(int argc, char *argv[])
{ {
@@ -280,11 +282,11 @@ static void DebugCmdDataOnOff(int argc, char *argv[])
} }
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugCmdSetMac * 函数名称: DebugCmdSetMac
* 功能描述: 设置MAC地址 * 功能描述: 设置MAC地址
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 argv, 输入参数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void DebugCmdSetMac(int argc, char *argv[]) static void DebugCmdSetMac(int argc, char *argv[])
{ {
@@ -317,11 +319,11 @@ static void DebugCmdSetMac(int argc, char *argv[])
DBG_LOG("Set gateway mac Address completed.\r\n"); DBG_LOG("Set gateway mac Address completed.\r\n");
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugCmdDevReg * 函数名称: DebugCmdDevReg
* 功能描述: 设备申请注册 * 功能描述: 设备申请注册
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 argv, 输入参数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void DebugCmdDevReg(int argc, char *argv[]) static void DebugCmdDevReg(int argc, char *argv[])
{ {
@@ -340,11 +342,11 @@ static void DebugCmdDevReg(int argc, char *argv[])
App.LoginFlag = true; App.LoginFlag = true;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugCmdDataUpload * 函数名称: DebugCmdDataUpload
* 功能描述: 设备数据上传 * 功能描述: 设备数据上传
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 argv, 输入参数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void DebugCmdDataUpload(int argc, char *argv[]) static void DebugCmdDataUpload(int argc, char *argv[])
{ {
@@ -372,11 +374,11 @@ static void DebugCmdDataUpload(int argc, char *argv[])
App.UploadFlag = true; App.UploadFlag = true;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugCmdDataColl * 函数名称: DebugCmdDataColl
* 功能描述: 设备数据采集 * 功能描述: 设备数据采集
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 argv, 输入参数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void DebugCmdDataColl(int argc, char *argv[]) static void DebugCmdDataColl(int argc, char *argv[])
{ {
@@ -394,11 +396,11 @@ static void DebugCmdDataColl(int argc, char *argv[])
SGCP.TimingAcquisition = true; SGCP.TimingAcquisition = true;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugCmdCat1OnOff * 函数名称: DebugCmdCat1OnOff
* 功能描述: CAT1调试信息开关 * 功能描述: CAT1调试信息开关
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 argv, 输入参数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void DebugCmdRS485Ctrl(int argc, char *argv[]) void DebugCmdRS485Ctrl(int argc, char *argv[])
{ {
@@ -436,7 +438,7 @@ void DebugCmdRS485Ctrl(int argc, char *argv[])
} }
else if(strstr(argv[3], "off") != NULL){ else if(strstr(argv[3], "off") != NULL){
if(idx == 1) if(idx == 1)
App.Para.Rs485Ch2.Enable = false; App.Para.Rs485Ch1.Enable = false;
else if(idx == 2) else if(idx == 2)
App.Para.Rs485Ch2.Enable = false; App.Para.Rs485Ch2.Enable = false;
DBG_LOG("RS485Ch%d Disable!\r\n", idx); DBG_LOG("RS485Ch%d Disable!\r\n", idx);
@@ -519,11 +521,11 @@ void DebugCmdRS485Ctrl(int argc, char *argv[])
DBG_LOG("At least keep one upgraded serial port!\r\n"); DBG_LOG("At least keep one upgraded serial port!\r\n");
return; return;
} }
App.Para.Rs485Ch2.UpgradeEnable = false; App.Para.Rs485Ch1.UpgradeEnable = false;
DBG_LOG("RS485Ch%d Upgrade Off!\r\n", idx); DBG_LOG("RS485Ch%d Upgrade Off!\r\n", idx);
} }
else if(idx == 2) { else if(idx == 2) {
if(App.Para.Rs485Ch2.UpgradeEnable == false) if(App.Para.Rs485Ch1.UpgradeEnable == false)
{ {
DBG_LOG("At least keep one upgraded serial port!\r\n"); DBG_LOG("At least keep one upgraded serial port!\r\n");
return; return;
@@ -541,11 +543,11 @@ void DebugCmdRS485Ctrl(int argc, char *argv[])
SAVE_APP_PARA((uint32_t *)&App.Para); SAVE_APP_PARA((uint32_t *)&App.Para);
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugLoraConfig * 函数名称: DebugLoraConfig
* 功能描述: Lora参数配置 * 功能描述: Lora参数配置
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 argv, 输入参数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void DebugLoraConfig(int argc, char *argv[]) static void DebugLoraConfig(int argc, char *argv[])
{ {
@@ -675,19 +677,19 @@ static void DebugLoraConfig(int argc, char *argv[])
DBG_LOG("Lora reinitializes.\r\n"); DBG_LOG("Lora reinitializes.\r\n");
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugCmdLPConfig * 函数名称: DebugCmdLPConfig
* 功能描述: 低功耗参数配置 * 功能描述: 低功耗参数配置
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 argv, 输入参数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void DebugCmdLPConfig(int argc, char *argv[]) static void DebugCmdLPConfig(int argc, char *argv[])
{ {
DBG_LOG("\r\n"); DBG_LOG("\r\n");
uint16_t CollectInterval; //采集时间间隔 uint16_t CollectInterval; //采集时间间隔
uint16_t ReportInterval; //上报时间间隔 uint16_t ReportInterval; //上报时间间隔
uint8_t ERInterval; //紧急上报时间间隔 uint8_t ERInterval; //紧急上报时间间隔
uint8_t ERTime; //紧急上报时长 uint8_t ERTime; //紧急上报时长
if(strcmp(argv[1], "?") == 0) { if(strcmp(argv[1], "?") == 0) {
DBG_LOG("Debug Cmd: lpcfg arg1 arg2 arg3 arg4\r\n"); DBG_LOG("Debug Cmd: lpcfg arg1 arg2 arg3 arg4\r\n");
@@ -737,11 +739,11 @@ static void DebugCmdLPConfig(int argc, char *argv[])
DBG_LOG("The low-power device is configured.\r\n"); DBG_LOG("The low-power device is configured.\r\n");
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugLaserConfig * 函数名称: DebugLaserConfig
* 功能描述: 激光控制 * 功能描述: 激光控制
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 * argv, 参数列表
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void DebugLaserConfig(int argc, char *argv[]) static void DebugLaserConfig(int argc, char *argv[])
{ {
@@ -751,32 +753,54 @@ static void DebugLaserConfig(int argc, char *argv[])
if(strcmp(argv[1], "?") == 0) { if(strcmp(argv[1], "?") == 0) {
DBG_LOG("Debug Cmd: laser arg1\r\n"); DBG_LOG("Debug Cmd: laser arg1\r\n");
DBG_LOG(" brief --> Control laser on or off.\r\n"); DBG_LOG(" brief --> Control laser on/off, set auto-off timer.\r\n");
DBG_LOG(" arg1 --> on/off\r\n\r\n"); DBG_LOG(" arg1 --> on/off/time\r\n");
DBG_LOG(" laser on Turn on laser, start timer.\r\n");
DBG_LOG(" laser off Turn off laser.\r\n");
DBG_LOG(" laser time <min> Set auto-off timer (0=disable, default 10).\r\n\r\n");
return; return;
} }
if(strcmp(argv[1], "on") == 0) { if(strcmp(argv[1], "on") == 0) {
DBG_LOG("The laser has been activated.\r\n"); DBG_LOG("The laser has been activated.\r\n");
SGCP.LaserOnOff = true; SGCP.LaserOnOff = true;
SGCP.LaserTimerCount = SGCP.LaserTimerMinutes * 2;
SGCP.GWStatus = GW_STATUS_LASER_STARES; SGCP.GWStatus = GW_STATUS_LASER_STARES;
} }
else if(strcmp(argv[1], "off") == 0) { else if(strcmp(argv[1], "off") == 0) {
DBG_LOG("The laser has been turned off.\r\n"); DBG_LOG("The laser has been turned off.\r\n");
SGCP.LaserOnOff = false; SGCP.LaserOnOff = false;
SGCP.LaserTimerCount = 0;
SGCP.GWStatus = GW_STATUS_LASER_STARES; SGCP.GWStatus = GW_STATUS_LASER_STARES;
} }
else if(strcmp(argv[1], "time") == 0)
{
if(argc < 3)
{
DBG_LOG("Laser timer is set to %d minute(s).\r\n", SGCP.LaserTimerMinutes);
return;
}
int min = atoi(argv[2]);
if(min < 0 || min > 240)
{
DBG_LOG("Invalid minutes! Range: 0~240.\r\n");
return;
}
SGCP.LaserTimerMinutes = (uint8_t)min;
App.Para.LaserTimerMinutes = (uint8_t)min;
SAVE_APP_PARA((uint32_t *)&App.Para);
DBG_LOG("Laser timer set to %d minute(s).\r\n", SGCP.LaserTimerMinutes);
}
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugCmdRestoreFactory * Function: DebugCmdRestoreFactory
* 功能描述: 恢复出厂设置 * Description: 恢复出厂设置
* 参 数: argc, 输入参数数量 * Input: argc, 参数个数
argv, 输入参数 * argv, 参数列表
* 返 回 值: 无 * Output: 无
*****************************************************************************************/ *****************************************************************************************/
void DebugCmdRestoreFactory(int argc, char *argv[]) void DebugCmdRestoreFactory(int argc, char *argv[])
{ {
DBG_LOG("\r\n");
if(strcmp(argv[1], "?") == 0) { if(strcmp(argv[1], "?") == 0) {
DBG_LOG("Debug Cmd: res arg1\r\n\ DBG_LOG("Debug Cmd: res arg1\r\n\
brief --> Restore to factory.\r\n"); brief --> Restore to factory.\r\n");
@@ -797,11 +821,11 @@ void DebugCmdRestoreFactory(int argc, char *argv[])
while(1); while(1);
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DebugCmdReboot * 函数名称: DebugCmdChannel
* 功能描述: 设备重启 * 功能描述: 调试打印通道设置
* 参 数: argc, 输入参数数量 * 参 数: argc, 输入参数数量
argv, 输入参数 argv, 输入参数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void DebugCmdChannel(int argc, char *argv[]) static void DebugCmdChannel(int argc, char *argv[])
{ {
@@ -840,19 +864,108 @@ static void DebugCmdReboot(int argc, char *argv[])
while(1); while(1);
} }
/*****************************************************************************************
* Function: DebugCmdAtt
* Description: 姿态角持续输出
* Input: argc, 参数个数
argv, 参数列表
* Output: 无
*****************************************************************************************/
static void DebugCmdAtt(int argc, char *argv[])
{
DBG_LOG("\r\n");
if(argc < 2 || strcmp(argv[1], "?") == 0)
{
DBG_LOG("Debug Cmd: att\r\n");
DBG_LOG(" brief --> Continuous attitude angle output.\r\n");
DBG_LOG(" arg1 --> on/off\r\n\r\n");
return;
}
if(strcmp(argv[1], "on") == 0)
{
App.AttTestMode = true;
App.AttTestCnt = 1000;
DBG_LOG("Attitude debug output ON.\r\n");
}
else if(strcmp(argv[1], "off") == 0)
{
App.AttTestMode = false;
DBG_LOG("Attitude debug output OFF.\r\n");
}
}
/*****************************************************************************************
* Function: DebugCmdSignal
* Description: 信号质量查询
* Input: argc, 参数个数
argv, 参数列表
* Output: 无
*****************************************************************************************/
static void DebugCmdSignal(int argc, char *argv[])
{
DBG_LOG("\r\n");
if(argc > 1)
{
if(strcmp(argv[1], "?") == 0) {
DBG_LOG("Debug Cmd: sig\r\n");
DBG_LOG(" brief --> Query signal quality with gateway.\r\n");
return;
}
}
if(SGCP.GWStatus != GW_STATUS_IDLE) {
DBG_LOG("Device is busy, please try again later.\r\n");
return;
}
SGCP.GWStatus = GW_STATUS_SIGNAL;
}
/*****************************************************************************************
* Function: DebugCmdAttTest
* Description: 姿态角测试输出
* Input: argc, 参数个数
* argv, 参数列表
* Output: 无
*****************************************************************************************/
static void DebugCmdAttTest(int argc, char *argv[])
{
DBG_LOG("\r\n");
if(argc < 2)
{
DBG_LOG("Debug Cmd: att on/off\r\n");
DBG_LOG(" att on --> Start attitude test output.\r\n");
DBG_LOG(" att off --> Stop attitude test output.\r\n\r\n");
return;
}
if(strcmp(argv[1], "on") == 0) {
App.AttTestMode = true;
App.AttTestCnt = 1000;
DBG_LOG("Attitude test started.\r\n");
}
else if(strcmp(argv[1], "off") == 0) {
App.AttTestMode = false;
DBG_LOG("Attitude test stopped.\r\n");
}
else {
DBG_LOG("Usage: att on/off\r\n");
}
}
void DebugCmdHelp(int argc, char *argv[]) void DebugCmdHelp(int argc, char *argv[])
{ {
DBG_LOG("\r\n"); DBG_LOG("\r\n");
char Data[10]; char Data[10];
uint8_t len = 0; uint8_t len = 0;
char *argv1[10]; // 最多10个参数,按需调整 char *argv1[10]; // 最多10个参数,按需调整
int argc1 = 0; int argc1 = 0;
char *token; char *token;
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("para ?\0"); len = strlen("para ?\0");
memcpy(Data, "para ?\0", len); memcpy(Data, "para ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){ for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -862,7 +975,7 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("main ?\0"); len = strlen("main ?\0");
memcpy(Data, "main ?\0", len); memcpy(Data, "main ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){ for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -872,7 +985,7 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("data ?\0"); len = strlen("data ?\0");
memcpy(Data, "data ?\0", len); memcpy(Data, "data ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){ for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -882,7 +995,7 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("mac ?\0"); len = strlen("mac ?\0");
memcpy(Data, "mac ?\0", len); memcpy(Data, "mac ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){ for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -892,7 +1005,7 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("reg ?\0"); len = strlen("reg ?\0");
memcpy(Data, "reg ?\0", len); memcpy(Data, "reg ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){ for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -902,7 +1015,7 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("up ?\0"); len = strlen("up ?\0");
memcpy(Data, "up ?\0", len); memcpy(Data, "up ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){ for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -912,7 +1025,7 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("coll ?\0"); len = strlen("coll ?\0");
memcpy(Data, "coll ?\0", len); memcpy(Data, "coll ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){ for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -922,7 +1035,7 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("rs485 ?\0"); len = strlen("rs485 ?\0");
memcpy(Data, "rs485 ?\0", len); memcpy(Data, "rs485 ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){ for(argc1 = 0; (token != NULL && argc1 < 10); argc1++){
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -932,7 +1045,7 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("lora ?\0"); len = strlen("lora ?\0");
memcpy(Data, "lora ?\0", len); memcpy(Data, "lora ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) { for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) {
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -942,7 +1055,7 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("lpcfg ?\0"); len = strlen("lpcfg ?\0");
memcpy(Data, "lpcfg ?\0", len); memcpy(Data, "lpcfg ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) { for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) {
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -952,7 +1065,7 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("laser ?\0"); len = strlen("laser ?\0");
memcpy(Data, "laser ?\0", len); memcpy(Data, "laser ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) { for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) {
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -962,7 +1075,7 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("res ?\0"); len = strlen("res ?\0");
memcpy(Data, "res ?\0", len); memcpy(Data, "res ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) { for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) {
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
@@ -982,12 +1095,31 @@ void DebugCmdHelp(int argc, char *argv[])
memset(Data, 0x00, 10); memset(Data, 0x00, 10);
len = strlen("reboot ?\0"); len = strlen("reboot ?\0");
memcpy(Data, "reboot ?\0", len); memcpy(Data, "reboot ?\0", len);
token = strtok(Data, " "); // 假设分隔符是空格 token = strtok(Data, " "); // 假设分隔符是空格
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) { for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) {
argv1[argc1] = token; argv1[argc1] = token;
token = strtok(NULL, " "); token = strtok(NULL, " ");
} }
DebugCmdReboot(argc1, argv1); DebugCmdReboot(argc1, argv1);
memset(Data, 0x00, 10);
len = strlen("sig ?\0");
memcpy(Data, "sig ?\0", len);
token = strtok(Data, " ");
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) {
argv1[argc1] = token;
token = strtok(NULL, " ");
}
memset(Data, 0x00, 10);
len = strlen("att ?\0");
memcpy(Data, "att ?\0", len);
token = strtok(Data, " ");
for(argc1 = 0; (token != NULL && argc1 < 10); argc1++) {
argv1[argc1] = token;
token = strtok(NULL, " ");
}
DebugCmdAtt(argc1, argv1);
} }
const DBGFunType DebugFun[DEBUG_CMD_CNT] = { const DBGFunType DebugFun[DEBUG_CMD_CNT] = {
@@ -1006,6 +1138,8 @@ const DBGFunType DebugFun[DEBUG_CMD_CNT] = {
"res", DebugCmdRestoreFactory, "res", DebugCmdRestoreFactory,
"dch", DebugCmdChannel, "dch", DebugCmdChannel,
"reboot", DebugCmdReboot, "reboot", DebugCmdReboot,
"att", DebugCmdAtt,
"sig", DebugCmdSignal,
}; };
#endif #endif
+3 -3
View File
@@ -1,4 +1,4 @@
#ifndef __DEBUG_H #ifndef __DEBUG_H
#define __DEBUG_H #define __DEBUG_H
#include "bsp.h" #include "bsp.h"
@@ -13,7 +13,7 @@
void vcom_Send( char *format, ... ); void vcom_Send( char *format, ... );
void vcom_Send2(uint8_t *sData, uint16_t len); void vcom_Send2(uint8_t *sData, uint16_t len);
#define DBG_LOG2(x, y) vcom_Send2(x, y) //打印长度超过缓存DEBUG_BUFF_SIZE_MAX的信息 #define DBG_LOG2(x, y) vcom_Send2(x, y) //打印长度超过缓存DEBUG_BUFF_SIZE_MAX的信息
#define DBG_LOG(...) vcom_Send(__VA_ARGS__) #define DBG_LOG(...) vcom_Send(__VA_ARGS__)
#define DBG_LOG_F(fmt,arg...) LOG("[%s] "fmt,__FUNCTION__,##arg) #define DBG_LOG_F(fmt,arg...) LOG("[%s] "fmt,__FUNCTION__,##arg)
@@ -27,7 +27,7 @@ void vcom_Send2(uint8_t *sData, uint16_t len);
} }
typedef enum { typedef enum {
DBG_CH_UART0 = 0, //默认串口调试方式 Uart0Init DBG_CH_UART0 = 0, //默认串口调试方式 Uart0Init
DBG_CH_RS485_1, //RS485_1 (LPUART0) DBG_CH_RS485_1, //RS485_1 (LPUART0)
}DebugChannel_e; }DebugChannel_e;
+16 -16
View File
@@ -1,4 +1,4 @@
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "lsm6dsl_app.h" #include "lsm6dsl_app.h"
#include "lsm6dsl_reg.h" #include "lsm6dsl_reg.h"
@@ -15,7 +15,7 @@ static bool InitFlag;
#define ACC_CVTTIME (20 * 1000) #define ACC_CVTTIME (20 * 1000)
#define ACC_COLL_CNT_MAX 6 #define ACC_COLL_CNT_MAX 6
#define ACC_FIFO_WATERMASK (ACC_COLL_CNT_MAX * 6) //采集一秒数据 #define ACC_FIFO_WATERMASK (ACC_COLL_CNT_MAX * 6) //采集一秒数据
#define TX_BUF_DIM 1000 #define TX_BUF_DIM 1000
#define BOOT_TIME 15 //ms #define BOOT_TIME 15 //ms
@@ -93,7 +93,7 @@ static void Lsm6dsl_Init(void)
/* Set Output Data Rate */ /* Set Output Data Rate */
lsm6dsl_xl_data_rate_set(&dev_ctx, LSM6DSL_XL_ODR_12Hz5); lsm6dsl_xl_data_rate_set(&dev_ctx, LSM6DSL_XL_ODR_12Hz5);
lsm6dsl_gy_data_rate_set(&dev_ctx, LSM6DSL_GY_ODR_12Hz5); lsm6dsl_gy_data_rate_set(&dev_ctx, LSM6DSL_GY_ODR_12Hz5);
//lsm6dsl_gy_data_rate_set(&left_dev_ctx, LSM6DSL_GY_ODR_OFF); //关闭地磁 //lsm6dsl_gy_data_rate_set(&left_dev_ctx, LSM6DSL_GY_ODR_OFF); //关闭地磁
/* Set full scale */ /* Set full scale */
lsm6dsl_xl_full_scale_set(&dev_ctx, LSM6DSL_2g); lsm6dsl_xl_full_scale_set(&dev_ctx, LSM6DSL_2g);
lsm6dsl_gy_full_scale_set(&dev_ctx, LSM6DSL_2000dps); lsm6dsl_gy_full_scale_set(&dev_ctx, LSM6DSL_2000dps);
@@ -110,26 +110,26 @@ static void Lsm6dsl_Init(void)
/* Gyroscope - filtering chain */ /* Gyroscope - filtering chain */
lsm6dsl_gy_band_pass_set(&dev_ctx, LSM6DSL_HP_260mHz_LP1_STRONG); lsm6dsl_gy_band_pass_set(&dev_ctx, LSM6DSL_HP_260mHz_LP1_STRONG);
//fifo模式设置 //fifo模式设置
lsm6dsl_fifo_xl_batch_set(&dev_ctx, LSM6DSL_FIFO_XL_NO_DEC);//fifo加速度写入频率设置 lsm6dsl_fifo_xl_batch_set(&dev_ctx, LSM6DSL_FIFO_XL_NO_DEC);//fifo加速度写入频率设置
lsm6dsl_fifo_gy_batch_set(&dev_ctx, LSM6DSL_FIFO_GY_NO_DEC);//fifo陀螺仪写入频率设置 lsm6dsl_fifo_gy_batch_set(&dev_ctx, LSM6DSL_FIFO_GY_NO_DEC);//fifo陀螺仪写入频率设置
lsm6dsl_fifo_data_rate_set(&dev_ctx, LSM6DSL_FIFO_12Hz5);//FIFO ODR选择 lsm6dsl_fifo_data_rate_set(&dev_ctx, LSM6DSL_FIFO_12Hz5);//FIFO ODR选择
//中断1设置,watermark full中断 //中断1设置,watermark full中断
lsm6dsl_int1_route_t int1val ={0, 0, 0}; lsm6dsl_int1_route_t int1val ={0, 0, 0};
int1val.int1_full_flag = 1; //开阀值中断,fifo存储到缓存深度时触发 int1val.int1_full_flag = 1; //开阀值中断,fifo存储到缓存深度时触发
lsm6dsl_pin_int1_route_set(&dev_ctx, int1val); lsm6dsl_pin_int1_route_set(&dev_ctx, int1val);
lsm6dsl_fifo_watermark_set(&dev_ctx, ACC_FIFO_WATERMASK);//FIFO水印电平设置,阈值设置,缓存深度 lsm6dsl_fifo_watermark_set(&dev_ctx, ACC_FIFO_WATERMASK);//FIFO水印电平设置,阈值设置,缓存深度
lsm6dsl_fifo_stop_on_wtm_set(&dev_ctx, 1);//fifo缓存深度存满时,不再存储 lsm6dsl_fifo_stop_on_wtm_set(&dev_ctx, 1);//fifo缓存深度存满时,不再存储
//lsm6dsl_fifo_xl_gy_8bit_format_set(&left_dev_ctx, 1);//在FIFO中为XL和陀螺启用MSByte记忆,缓存宽度 //lsm6dsl_fifo_xl_gy_8bit_format_set(&left_dev_ctx, 1);//在FIFO中为XL和陀螺启用MSByte记忆,缓存宽度
lsm6dsl_block_data_update_set(&dev_ctx, 1); //fifo模式ctrl3_c bdu必须为1,直到读取MSB和LSB后才更新输出寄存器 lsm6dsl_block_data_update_set(&dev_ctx, 1); //fifo模式ctrl3_c bdu必须为1,直到读取MSB和LSB后才更新输出寄存器
lsm6dsl_auto_increment_set(&dev_ctx, 1); //fifo模式ctrl3_c if_inc必须为1,通过串行接口(I2C或SPI)进行多字节访问时自动增加寄存器地址。 lsm6dsl_auto_increment_set(&dev_ctx, 1); //fifo模式ctrl3_c if_inc必须为1,通过串行接口(I2C或SPI)进行多字节访问时自动增加寄存器地址。
lsm6dsl_ctrl3_c_t ctrl3_c; lsm6dsl_ctrl3_c_t ctrl3_c;
platform_read(LSM6DSL_CTRL3_C, (uint8_t *)&ctrl3_c, 1); platform_read(LSM6DSL_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
//lsm6dsl_fifo_mode_set(&dev_ctx, LSM6DSL_FIFO_MODE); //lsm6dsl_fifo_mode_set(&dev_ctx, LSM6DSL_FIFO_MODE);
//中断2设置,唤醒中断 //中断2设置,唤醒中断
// uint8_t temp = 0x90; //唤醒中断 // uint8_t temp = 0x90; //唤醒中断
// platform_write(LSM6DSL_TAP_CFG, &temp, 1); // platform_write(LSM6DSL_TAP_CFG, &temp, 1);
// temp = 0; // temp = 0;
// platform_write(LSM6DSL_WAKE_UP_DUR, &temp, 1); // platform_write(LSM6DSL_WAKE_UP_DUR, &temp, 1);
+70 -70
View File
@@ -1,4 +1,4 @@
#include "main.h" #include "main.h"
#include "mmc5983.h" #include "mmc5983.h"
#include "UartDebug.h" #include "UartDebug.h"
#include "i2c.h" #include "i2c.h"
@@ -11,11 +11,11 @@ static bool MMC5983IntFlag;
static MMC5983Var_t MMC5983Var; static MMC5983Var_t MMC5983Var;
/***************************************************************************************** /*****************************************************************************************
* 函数名称: MMC5983_Write_Reg * 函数名称: MMC5983_Write_Reg
* 功能描述: MMC5983写寄存器 * 功能描述: MMC5983写寄存器
* 参 数: reg 寄存器地址 * 参 数: reg 寄存器地址
val 寄存器数据 val 寄存器数据
* 返 回 值: 成功返回true,失败返回false * 返 回 值: 成功返回true,失败返回false
*****************************************************************************************/ *****************************************************************************************/
static bool MMC5983_Write_Reg(uint8_t reg, uint8_t val) static bool MMC5983_Write_Reg(uint8_t reg, uint8_t val)
{ {
@@ -23,10 +23,10 @@ static bool MMC5983_Write_Reg(uint8_t reg, uint8_t val)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: MMC5983_Read_Reg * 函数名称: MMC5983_Read_Reg
* 功能描述: MMC5983读寄存器 * 功能描述: MMC5983读寄存器
* 参 数: reg 寄存器地址 * 参 数: reg 寄存器地址
* 返 回 值: 返回寄存器值 * 返 回 值: 返回寄存器值
*****************************************************************************************/ *****************************************************************************************/
static uint8_t MMC5983_Read_Reg(uint8_t reg) static uint8_t MMC5983_Read_Reg(uint8_t reg)
{ {
@@ -37,12 +37,12 @@ static uint8_t MMC5983_Read_Reg(uint8_t reg)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: MMC5983_Read_Buffer * 函数名称: MMC5983_Read_Buffer
* 功能描述: MMC5983读数据 * 功能描述: MMC5983读数据
* 参 数: reg 寄存器地址 * 参 数: reg 寄存器地址
buffer 读取数据输出缓存入口 buffer 读取数据输出缓存入口
len 读取长度 len 读取长度
* 返 回 值: 成功返回true,失败返回false * 返 回 值: 成功返回true,失败返回false
*****************************************************************************************/ *****************************************************************************************/
static bool MMC5983_Read_Buffer(uint8_t reg, void *buffer, uint8_t len) static bool MMC5983_Read_Buffer(uint8_t reg, void *buffer, uint8_t len)
{ {
@@ -50,27 +50,27 @@ static bool MMC5983_Read_Buffer(uint8_t reg, void *buffer, uint8_t len)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: MMC5983StartCov * 函数名称: MMC5983StartCov
* 功能描述: MMC5983开启连续转换 * 功能描述: MMC5983开启连续转换
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void MMC5983StartCov(void) static void MMC5983StartCov(void)
{ {
MMC5983RegCtrl2 Ctrl2Reg; //开启/关闭连续转换 MMC5983RegCtrl2 Ctrl2Reg; //开启/关闭连续转换
Ctrl2Reg.Byte = 0x00; Ctrl2Reg.Byte = 0x00;
Ctrl2Reg.Bit.Cm_freq = 0x04; Ctrl2Reg.Bit.Cm_freq = 0x04;
Ctrl2Reg.Bit.Cmm_en = 1; //连续设1,单次设0 Ctrl2Reg.Bit.Cmm_en = 1; //连续设1,单次设0
Ctrl2Reg.Bit.Prd_set = 3; Ctrl2Reg.Bit.Prd_set = 3;
Ctrl2Reg.Bit.En_prd_set = 1; //连续设1,单次设0 Ctrl2Reg.Bit.En_prd_set = 1; //连续设1,单次设0
MMC5983_Write_Reg(MMC5983_CTRL_2, Ctrl2Reg.Byte); MMC5983_Write_Reg(MMC5983_CTRL_2, Ctrl2Reg.Byte);
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: MMC5983_Init * 函数名称: MMC5983_Init
* 功能描述: MMC5983初始化 * 功能描述: MMC5983初始化
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void MMC5983_Init(void) static void MMC5983_Init(void)
{ {
@@ -93,12 +93,12 @@ static void MMC5983_Init(void)
MMC5983_Write_Reg(MMC5983_CTRL_1, Ctrl1Reg.Byte); MMC5983_Write_Reg(MMC5983_CTRL_1, Ctrl1Reg.Byte);
MMC5983Delay(15); MMC5983Delay(15);
MMC5983RegCtrl2 Ctrl2Reg; //开启/关闭连续转换 MMC5983RegCtrl2 Ctrl2Reg; //开启/关闭连续转换
Ctrl2Reg.Byte = 0x00; Ctrl2Reg.Byte = 0x00;
Ctrl2Reg.Bit.Cm_freq = 0x04; Ctrl2Reg.Bit.Cm_freq = 0x04;
Ctrl2Reg.Bit.Cmm_en = 0; //连续设1,单次设0 Ctrl2Reg.Bit.Cmm_en = 0; //连续设1,单次设0
Ctrl2Reg.Bit.Prd_set = 3; Ctrl2Reg.Bit.Prd_set = 3;
Ctrl2Reg.Bit.En_prd_set = 0; //连续设1,单次设0 Ctrl2Reg.Bit.En_prd_set = 0; //连续设1,单次设0
MMC5983_Write_Reg(MMC5983_CTRL_2, Ctrl2Reg.Byte); MMC5983_Write_Reg(MMC5983_CTRL_2, Ctrl2Reg.Byte);
MMC5983RegCtrl3 Ctrl3Reg; MMC5983RegCtrl3 Ctrl3Reg;
@@ -121,12 +121,12 @@ static void MMC5983_Init(void)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: MMC5983_Read * 函数名称: MMC5983_Read
* 功能描述: MMC5983读取原始数据 * 功能描述: MMC5983读取原始数据
* 参 数: MagAdcX X轴数据 * 参 数: MagAdcX X轴数据
MagAdcY Y轴数据 MagAdcY Y轴数据
MagAdcZ Z轴数据 MagAdcZ Z轴数据
* 返 回 值: 成功返回true,失败返回false * 返 回 值: 成功返回true,失败返回false
*****************************************************************************************/ *****************************************************************************************/
static bool MMC5983_Read(int32_t *MagAdcX, int32_t *MagAdcY, int32_t *MagAdcZ) static bool MMC5983_Read(int32_t *MagAdcX, int32_t *MagAdcY, int32_t *MagAdcZ)
{ {
@@ -142,10 +142,10 @@ static bool MMC5983_Read(int32_t *MagAdcX, int32_t *MagAdcY, int32_t *MagAdcZ)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: MMC5983_Get_Mag * 函数名称: MMC5983_Get_Mag
* 功能描述: 外部获取MMC5983磁场强度数据 * 功能描述: 外部获取MMC5983磁场强度数据
* 参 数: mag 读取数据输出缓存入口 * 参 数: mag 读取数据输出缓存入口
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void MMC5983_Get_Mag(float *mag) void MMC5983_Get_Mag(float *mag)
{ {
@@ -164,10 +164,10 @@ void MMC5983_Get_Mag(float *mag)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: MMC5983LoopHandler * 函数名称: MMC5983LoopHandler
* 功能描述: MMC5983循环处理函数 * 功能描述: MMC5983循环处理函数
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
extern void MmcDataProcessCallBack(float *Mag); extern void MmcDataProcessCallBack(float *Mag);
@@ -251,16 +251,16 @@ void MMC5983LoopHandler(void)
case MMC5983_STATUS_STOP:{ case MMC5983_STATUS_STOP:{
MMC5983Stop(); MMC5983Stop();
MMC5983Var.Status = MMC5983_STATUS_IDLE; MMC5983Var.Status = MMC5983_STATUS_IDLE;
//MMC5983Var.Status = MMC5983_STATUS_START;//持续工作 //MMC5983Var.Status = MMC5983_STATUS_START;//持续工作
break;} break;}
} }
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: LeftMMC59831mSRoutine * 函数名称: LeftMMC59831mSRoutine
* 功能描述: MMC59831ms时基循环处理函数 * 功能描述: MMC59831ms时基循环处理函数
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void MMC59831mSRoutine(void) void MMC59831mSRoutine(void)
{ {
@@ -269,10 +269,10 @@ void MMC59831mSRoutine(void)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: LeftMMC5983Init * 函数名称: LeftMMC5983Init
* 功能描述: MMC5983初始化 * 功能描述: MMC5983初始化
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void MMC5983Init(void) void MMC5983Init(void)
{ {
@@ -285,10 +285,10 @@ void MMC5983Init(void)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: LeftMMC5983Start * 函数名称: LeftMMC5983Start
* 功能描述: MMC5983启动 * 功能描述: MMC5983启动
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void MMC5983Start(void) void MMC5983Start(void)
{ {
@@ -301,21 +301,21 @@ void MMC5983Start(void)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: LeftMMC5983StartRead * 函数名称: LeftMMC5983StartRead
* 功能描述: MMC5983启动读取 * 功能描述: MMC5983启动读取
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void MMC5983StartRead(void) void MMC5983StartRead(void)
{ {
MMC5983_Init();//读取时重新初始化 MMC5983_Init();//读取时重新初始化
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: MMC5983Stop * 函数名称: MMC5983Stop
* 功能描述: MMC5983停止 * 功能描述: MMC5983停止
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void MMC5983Stop(void) void MMC5983Stop(void)
{ {
@@ -331,10 +331,10 @@ void MMC5983Stop(void)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: LeftMMC5983IntCallBack * 函数名称: LeftMMC5983IntCallBack
* 功能描述: MMC5983中断回调 * 功能描述: MMC5983中断回调
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void MMC5983IntCallBack(void) void MMC5983IntCallBack(void)
{ {
+29 -29
View File
@@ -1,4 +1,4 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved. * Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
* *
* This software is owned and published by: * This software is owned and published by:
@@ -83,39 +83,39 @@ typedef enum en_opa_oenx
OpaOen4 = 6u //OUT4 OpaOen4 = 6u //OUT4
}en_opa_oenx_t; }en_opa_oenx_t;
typedef enum en_opa_clksrc // 自动校准脉冲宽度设置 typedef enum en_opa_clksrc // 鑷姩鏍″噯鑴夊啿瀹藉害璁剧疆
{ {
OpaM1Pclk = 0u, // 1个PCLK周期 OpaM1Pclk = 0u, // 1涓狿CLK鍛ㄦ湡
OpaM2Pclk = 1u, // 2个PCLK周期 OpaM2Pclk = 1u, // 2涓狿CLK鍛ㄦ湡
OpaM4Pclk = 2u, // 4个PCLK周期 OpaM4Pclk = 2u, // 4涓狿CLK鍛ㄦ湡
OpaM8Pclk = 3u, // 8个PCLK周期 OpaM8Pclk = 3u, // 8涓狿CLK鍛ㄦ湡
OpaM16Pclk = 4u, // 16个PCLK周期 OpaM16Pclk = 4u, // 16涓狿CLK鍛ㄦ湡
OpaM32Pclk = 5u, // 32个PCLK周期 OpaM32Pclk = 5u, // 32涓狿CLK鍛ㄦ湡
OpaM64Pclk = 6u, // 64个PCLK周期 OpaM64Pclk = 6u, // 64涓狿CLK鍛ㄦ湡
OpaM128Pclk = 7u, // 128个PCLK周期 OpaM128Pclk = 7u, // 128涓狿CLK鍛ㄦ湡
OpaM256Pclk = 8u, // 256个PCLK周期 OpaM256Pclk = 8u, // 256涓狿CLK鍛ㄦ湡
OpaM512Pclk = 9u, // 512个PCLK周期 OpaM512Pclk = 9u, // 512涓狿CLK鍛ㄦ湡
OpaM1024Pclk = 10u, // 1024个PCLK周期 OpaM1024Pclk = 10u, // 1024涓狿CLK鍛ㄦ湡
OpaM2048Pclk = 11u, // 2048个PCLK周期 OpaM2048Pclk = 11u, // 2048涓狿CLK鍛ㄦ湡
OpaM4096Pclk = 12u // 4096个PCLK周期 OpaM4096Pclk = 12u // 4096涓狿CLK鍛ㄦ湡
}en_opa_clksrc_t; }en_opa_clksrc_t;
typedef enum en_opa_set0ctrl typedef enum en_opa_set0ctrl
{ {
enClkSwSet = 3u, // 软件校准使能 enClkSwSet = 3u, // 杞欢鏍″噯浣胯兘
enAzPulse = 2u, // 软件校准 enAzPulse = 2u, // 杞欢鏍″噯
enTrigger = 1u, // 软件触发自动教零 enTrigger = 1u, // 杞欢瑙﹀彂鑷姩鏁欓浂
enAdctr = 1u // 使能ADC启动触发OPA自动校准功能 enAdctr = 1u // 浣胯兘ADC鍚姩瑙﹀彂OPA鑷姩鏍″噯鍔熻兘
}en_opa_set0ctrl_t; }en_opa_set0ctrl_t;
typedef struct typedef struct
{ {
boolean_t bAzen; // 自动教零配置 boolean_t bAzen; // 鑷姩鏁欓浂閰嶇疆
boolean_t bClk_sw_set; // 自动教零选择 boolean_t bClk_sw_set; // 鑷姩鏁欓浂閫夋嫨
boolean_t bAz_pulse; // 软件校准设置 boolean_t bAz_pulse; // 杞欢鏍″噯璁剧疆
boolean_t bTrigger; // 软件触发校准设置 boolean_t bTrigger; // 杞欢瑙﹀彂鏍″噯璁剧疆
boolean_t bAdctr_en; // ADC启动触发OPA自动校准设置 boolean_t bAdctr_en; // ADC鍚姩瑙﹀彂OPA鑷姩鏍″噯璁剧疆
en_opa_clksrc_t enClksrc; // 自动校准脉冲宽度设置 en_opa_clksrc_t enClksrc; // 鑷姩鏍″噯鑴夊啿瀹藉害璁剧疆
}stc_opa_zcfg_t; }stc_opa_zcfg_t;
@@ -126,17 +126,17 @@ typedef struct
/****************************************************************************** /******************************************************************************
* Global function prototypes (definition in C source) * Global function prototypes (definition in C source)
******************************************************************************/ ******************************************************************************/
//OPA 通道使能 //OPA 閫氶亾浣胯兘
extern void Opa_Cmd(boolean_t NewStatus); extern void Opa_Cmd(boolean_t NewStatus);
extern void Opa_CmdBuf(boolean_t NewStatus); extern void Opa_CmdBuf(boolean_t NewStatus);
//OPA零点校准配置 //OPA闆剁偣鏍″噯閰嶇疆
extern void Opa_SetZero(stc_opa_zcfg_t* InitZero); extern void Opa_SetZero(stc_opa_zcfg_t* InitZero);
//使能输出OUTX //浣胯兘杈撳嚭OUTX
extern void Opa_CmdOnex(en_opa_oenx_t onex, boolean_t NewState); extern void Opa_CmdOnex(en_opa_oenx_t onex, boolean_t NewState);
//配置校零相关的位 //閰嶇疆鏍¢浂鐩稿叧鐨勪綅
extern void Opa_ZeroBitCtrl(en_opa_set0ctrl_t CtrlBit, boolean_t NewState); extern void Opa_ZeroBitCtrl(en_opa_set0ctrl_t CtrlBit, boolean_t NewState);
//@} // OPA Group //@} // OPA Group
+7 -7
View File
@@ -1,4 +1,4 @@
/************************************************************************************* /*************************************************************************************
* Copyright (C) 2016, Huada Semiconductor Co.,Ltd All rights reserved. * Copyright (C) 2016, Huada Semiconductor Co.,Ltd All rights reserved.
* *
* This software is owned and published by: * This software is owned and published by:
@@ -42,7 +42,7 @@
/******************************************************************************/ /******************************************************************************/
/** \file ram.h /** \file ram.h
** **
** RAM 数据结构及API声明. ** RAM 鏁版嵁缁撴瀯鍙夾PI澹版槑.
** **
** - 2019-04-02 LuX V1.0 ** - 2019-04-02 LuX V1.0
** **
@@ -96,15 +96,15 @@ extern "C"
******************************************************************************/ ******************************************************************************/
///<中断相关函数 ///<涓柇鐩稿叧鍑芥暟
///<中断使能/禁止 ///<涓柇浣胯兘/绂佹
void Ram_EnableIrq(void); void Ram_EnableIrq(void);
void Ram_DisableIrq(void); void Ram_DisableIrq(void);
///<中断标志获取 ///<涓柇鏍囧織鑾峰彇
boolean_t Ram_GetIntFlag(void); boolean_t Ram_GetIntFlag(void);
///<中断标志清除 ///<涓柇鏍囧織娓呴櫎
void Ram_ClearIntFlag(void); void Ram_ClearIntFlag(void);
///<奇偶校验出错地址获取 ///<濂囧伓鏍¢獙鍑洪敊鍦板潃鑾峰彇
uint32_t Ram_ErrAddrGet(void); uint32_t Ram_ErrAddrGet(void);
//@} // RamGroup //@} // RamGroup
+6 -6
View File
@@ -1,4 +1,4 @@
/****************************************************************************** /******************************************************************************
*Copyright(C)2018, Huada Semiconductor Co.,Ltd All rights reserved. *Copyright(C)2018, Huada Semiconductor Co.,Ltd All rights reserved.
* *
* This software is owned and published by: * This software is owned and published by:
@@ -85,7 +85,7 @@
/** /**
***************************************************************************** *****************************************************************************
** \brief Ram奇偶校验出错地址获取 ** \brief Ram濂囧伓鏍¢獙鍑洪敊鍦板潃鑾峰彇
** **
** **
** \retval ERROR ADDRESS ** \retval ERROR ADDRESS
@@ -97,7 +97,7 @@ uint32_t Ram_ErrAddrGet(void)
/** /**
***************************************************************************** *****************************************************************************
** \brief Ram中断标志获取 ** \brief Ram涓柇鏍囧織鑾峰彇
** **
** **
** \retval TRUE or FALSE ** \retval TRUE or FALSE
@@ -116,7 +116,7 @@ boolean_t Ram_GetIntFlag(void)
/** /**
***************************************************************************** *****************************************************************************
** \brief Ram中断标志清除 ** \brief Ram涓柇鏍囧織娓呴櫎
** **
** **
** \retval Null ** \retval Null
@@ -128,7 +128,7 @@ void Ram_ClearIntFlag(void)
/** /**
***************************************************************************** *****************************************************************************
** \brief Ram中断使能 ** \brief Ram涓柇浣胯兘
** **
** \retval Null ** \retval Null
*****************************************************************************/ *****************************************************************************/
@@ -139,7 +139,7 @@ void Ram_EnableIrq (void)
/** /**
***************************************************************************** *****************************************************************************
** \brief ram中断禁止 ** \brief ram涓柇绂佹
** **
** \retval Null ** \retval Null
*****************************************************************************/ *****************************************************************************/
+11 -11
View File
@@ -1,4 +1,4 @@
#ifndef __ALGORITHM_H #ifndef __ALGORITHM_H
#define __ALGORITHM_H #define __ALGORITHM_H
#include <math.h> #include <math.h>
@@ -11,20 +11,20 @@
#define CRC16_BASE 0xA001 #define CRC16_BASE 0xA001
// 峰值谷值检查结果结构体 // 峰值谷值检查结果结构体
typedef struct { typedef struct {
bool peaks_positive; // 所有峰值是否大于0 bool peaks_positive; // 所有峰值是否大于0
bool valleys_negative; // 所有谷值是否小于0 bool valleys_negative; // 所有谷值是否小于0
int peak_count; // 检测到的峰值数量 int peak_count; // 检测到的峰值数量
int valley_count; // 检测到的谷值数量 int valley_count; // 检测到的谷值数量
} PeakValleyCheck; } PeakValleyCheck;
// 趋势分析结果结构体 // 趋势分析结果结构体
typedef struct { typedef struct {
double slope; // 线性斜率 double slope; // 线性斜率
int sign_changes; // 符号变化次数 int sign_changes; // 符号变化次数
char trend_type; // 趋势类型 char trend_type; // 趋势类型
char steepness; // 陡峭度 char steepness; // 陡峭度
} TrendResult; } TrendResult;
PeakValleyCheck check_peaks_valleys(int data[], int length); PeakValleyCheck check_peaks_valleys(int data[], int length);
+129 -122
View File
@@ -1,13 +1,13 @@
/* 传感器通用通讯协议V1.0*/ /* 传感器通用通讯协议V1.0*/
#ifndef __SGCP_H #ifndef __SGCP_H
#define __SGCP_H #define __SGCP_H
#include "bsp.h" #include "bsp.h"
#define WORK_MODE 1 //工作模式选择,0、本机为查询模式,1、本机为上报模式(低功耗) #define WORK_MODE 1 //工作模式选择,0、本机为查询模式,1、本机为上报模式(低功耗)
#define SGCP_SELECT 1 //协议选择,0、本机为单个主设备接多个子设备,1、本机为单个主设备不接子设备,2、本机为单个子设备 #define SGCP_SELECT 1 //协议选择,0、本机为单个主设备接多个子设备,1、本机为单个主设备不接子设备,2、本机为单个子设备
typedef struct {//网关与主设备固定帧 typedef struct {//网关与主设备固定帧
uint8_t Header; uint8_t Header;
uint8_t GWAddr[6]; uint8_t GWAddr[6];
uint8_t MDAddr[6]; uint8_t MDAddr[6];
@@ -15,56 +15,56 @@ typedef struct {//
uint16_t PayloadLen; uint16_t PayloadLen;
}__attribute__ ((packed))GatewayFrameHeader_t,*GatewayFrameHeader; }__attribute__ ((packed))GatewayFrameHeader_t,*GatewayFrameHeader;
typedef struct {//主设备与子设备固定帧 typedef struct {//主设备与子设备固定帧
uint8_t Header; uint8_t Header;
uint8_t Addr; uint8_t Addr;
uint8_t Cmd; uint8_t Cmd;
uint8_t PayloadLen; uint8_t PayloadLen;
}__attribute__ ((packed))SubsetFrameHeader_t,*SubsetFrameHeader; }__attribute__ ((packed))SubsetFrameHeader_t,*SubsetFrameHeader;
typedef struct {//内部指令固定帧 typedef struct {//内部指令固定帧
uint8_t Header; uint8_t Header;
uint8_t MAC[6]; uint8_t MAC[6];
uint8_t Cmd; uint8_t Cmd;
uint8_t PayloadLen; uint8_t PayloadLen;
}__attribute__ ((packed))InsideFrameHeader_t,*InsideFrameHeader; }__attribute__ ((packed))InsideFrameHeader_t,*InsideFrameHeader;
typedef struct {//主设备固定包头 typedef struct {//主设备固定包头
uint8_t BatLevel; //电池电量 uint8_t BatLevel; //电池电量
int8_t RSSI; //信号强度 int8_t RSSI; //信号强度
int8_t Nsr; //信噪比 int8_t Nsr; //信噪比
}__attribute__ ((packed))MasterDev_T,*MasterDevDp; }__attribute__ ((packed))MasterDev_T,*MasterDevDp;
typedef struct {//0x0006 三维连续变形 typedef struct {//0x0006 三维连续变形
int16_t PitchAngle; //俯仰角 (范围±900)单位0.1° int16_t PitchAngle; //俯仰角 (范围±1800)单位0.1°
int16_t RollAngle; //横滚角 (范围±900)单位0.1° int16_t RollAngle; //横滚角 (范围±1800)单位0.1°
int16_t YawAngle; //偏航角 (范围0~3600)单位0.1° int16_t YawAngle; //偏航角 (范围0~3600)单位0.1°
}__attribute__ ((packed))ContDefor3D_T,*ContDefor3DDp; }__attribute__ ((packed))ContDefor3D_T,*ContDefor3DDp;
typedef struct {//0x0007 通讯单元 typedef struct {//0x0007 通讯单元
MasterDev_T MasterDev; MasterDev_T MasterDev;
}__attribute__ ((packed))CommUnit_T,*CommUnitDp; }__attribute__ ((packed))CommUnit_T,*CommUnitDp;
typedef struct {//0x0008 三维应力 typedef struct {//0x0008 三维应力
int16_t PitchAngle; //俯仰角(范围±900)单位0.1° int16_t PitchAngle; //俯仰角(范围±900)单位0.1°
int16_t RollAngle; //横滚角(范围±900)单位0.1° int16_t RollAngle; //横滚角(范围±900)单位0.1°
int16_t YawAngle; //偏航角(范围0~3600)单位0.1° int16_t YawAngle; //偏航角(范围0~3600)单位0.1°
int32_t Strain1; //X轴应力值(范围±10MPa,单位Pa) int32_t Strain1; //X轴应力值(范围±10MPa,单位Pa)
int32_t Strain2; //Y轴应力值(范围±10MPa,单位Pa) int32_t Strain2; //Y轴应力值(范围±10MPa,单位Pa)
int32_t Strain3; //Z轴应力值(范围±10MPa,单位Pa) int32_t Strain3; //Z轴应力值(范围±10MPa,单位Pa)
}__attribute__ ((packed))Force3D_T,*Force3DDp; }__attribute__ ((packed))Force3D_T,*Force3DDp;
typedef struct {//0x0009 激光示踪 typedef struct {//0x0009 激光示踪
MasterDev_T MasterDev; MasterDev_T MasterDev;
int16_t PitchAngle; //俯仰角 (范围±900)单位0.1° int16_t PitchAngle; //俯仰角 (范围±900)单位0.1°
int16_t RollAngle; //横滚角 (范围±900)单位0.1° int16_t RollAngle; //横滚角 (范围±900)单位0.1°
int16_t YawAngle; //偏航角 (范围0~3600)单位0.1° int16_t YawAngle; //偏航角 (范围0~3600)单位0.1°
}__attribute__ ((packed))LaserTracing_T,*LaserTracingDp; }__attribute__ ((packed))LaserTracing_T,*LaserTracingDp;
typedef struct {//0x000E 裂缝仪 typedef struct {//0x000E 裂缝仪
int16_t XwiseDist; //横向位移量(范围0~150mm int16_t XwiseDist; //横向位移量(范围0~150mm
int16_t LgthwysDist; //纵向位移距离(范围0~150mm) int16_t LgthwysDist; //纵向位移距离(范围0~150mm)
int16_t RotationDist; //旋转位移距离(范围0~150mm) int16_t RotationDist; //旋转位移距离(范围0~150mm)
}__attribute__ ((packed))Crack_T,*CrackDp; }__attribute__ ((packed))Crack_T,*CrackDp;
typedef struct { typedef struct {
@@ -73,9 +73,9 @@ typedef struct {
Force3D_T Force3D; Force3D_T Force3D;
Crack_T Crack; Crack_T Crack;
LaserTracing_T LaserTracing; LaserTracing_T LaserTracing;
}__attribute__ ((packed))DeviceData_T,*DeviceDp; //设备数据 }__attribute__ ((packed))DeviceData_T,*DeviceDp; //设备数据
/*接收子设备数据状态机*/ /*接收子设备数据状态机*/
typedef enum { typedef enum {
SUB_STATUS_IDLE, SUB_STATUS_IDLE,
SUB_STATUS_BROADCAST_CALI, SUB_STATUS_BROADCAST_CALI,
@@ -89,7 +89,7 @@ typedef enum {
SUB_STATUS_BROADCAST_SYNC_TIME, SUB_STATUS_BROADCAST_SYNC_TIME,
}SubStatus_m; }SubStatus_m;
/*接收网关数据状态机*/ /*接收网关数据状态机*/
typedef enum { typedef enum {
GW_STATUS_IDLE, GW_STATUS_IDLE,
GW_STATUS_WAIT_SUBIDLE, GW_STATUS_WAIT_SUBIDLE,
@@ -99,11 +99,13 @@ typedef enum {
GW_STATUS_READ_SENSOR, GW_STATUS_READ_SENSOR,
GW_STATUS_SET_COL_TIME, GW_STATUS_SET_COL_TIME,
GW_STATUS_SYNC_TIME, GW_STATUS_SYNC_TIME,
GW_STATUS_UPLOAD_SENSOR,//主动上报模式时会使用该状态 GW_STATUS_UPLOAD_SENSOR,//主动上报模式时会使用该状态
GW_STATUS_WAIT_UPLOAD,//主动上报模式时会使用该状态 GW_STATUS_WAIT_UPLOAD,//主动上报模式时会使用该状态
GW_STATUS_LASER_STARES,//激光状态回应 GW_STATUS_LASER_STARES,//激光状态回应
GW_STATUS_SIGNAL,
GW_STATUS_WAIT_SIGNAL,
}GWStatus_m; }GWStatus_m;
/*接收主设备数据状态机*/ /*接收主设备数据状态机*/
typedef enum { typedef enum {
MAS_STATUS_IDLE, MAS_STATUS_IDLE,
MAS_STATUS_CALI, MAS_STATUS_CALI,
@@ -112,80 +114,81 @@ typedef enum {
MAS_STATUS_SET_COL_TIME, MAS_STATUS_SET_COL_TIME,
MAS_STATUS_SYNC_TIME, MAS_STATUS_SYNC_TIME,
}MasStatus_m; }MasStatus_m;
/*内部指令数据状态机*/ /*内部指令数据状态机*/
typedef enum { typedef enum {
IN_STATUS_IDLE, IN_STATUS_IDLE,
IN_STATUS_UPDATE, IN_STATUS_UPDATE,
IN_STATUS_ALTER_485ADDR, IN_STATUS_ALTER_485ADDR,
}InStatus_m; }InStatus_m;
/*网关到主设备命令集*/ /*网关到主设备命令集*/
typedef enum { typedef enum {
GWTOMD_CMD_LOGIN = 0x00, //0x00,设备注册 GWTOMD_CMD_LOGIN = 0x00, //0x00,设备注册
GWTOMD_CMD_CALI = 0x01, //0x01, 校准指令 GWTOMD_CMD_CALI = 0x01, //0x01, 校准指令
GWTOMD_CMD_READ_UPLOAD_SENSOR = 0x02, //0x02,读取数据指令or上传数据指令 GWTOMD_CMD_READ_UPLOAD_SENSOR = 0x02, //0x02,读取数据指令or上传数据指令
GWTOMD_CMD_SET_COL_TIME = 0x05, //0x05,设置采集时间间隔 GWTOMD_CMD_SET_COL_TIME = 0x05, //0x05,设置采集时间间隔
GWTOMD_CMD_SYNC_TIME = 0x06, //0x06,时间同步 GWTOMD_CMD_SYNC_TIME = 0x06, //0x06,时间同步
GWTOMD_CMD_SET_LASER = 0x08,//打开or关闭激光 GWTOMD_CMD_SET_LASER = 0x08,//打开or关闭激光
GWTOMD_CMD_SIGNAL = 0x09,
}GWTOMD_CMD_M; }GWTOMD_CMD_M;
/*主设备到子设备命令集*/ /*主设备到子设备命令集*/
typedef enum { typedef enum {
MDTOSD_CMD_CALI = 0x01, //0x01, 校准指令 MDTOSD_CMD_CALI = 0x01, //0x01, 校准指令
MDTOSD_CMD_READ_DATA = 0x02, //0x02,读取数据指令 MDTOSD_CMD_READ_DATA = 0x02, //0x02,读取数据指令
MDTOSD_CMD_INQUIRE = 0x03, //0x03, 设备查询指令 MDTOSD_CMD_INQUIRE = 0x03, //0x03, 设备查询指令
MDTOSD_CMD_SET_COL_TIME = 0x05, //0x05,设置采集时间间隔 MDTOSD_CMD_SET_COL_TIME = 0x05, //0x05,设置采集时间间隔
MDTOSD_CMD_SYNC_TIME = 0x06, //0x06,时间同步 MDTOSD_CMD_SYNC_TIME = 0x06, //0x06,时间同步
}MDTOSD_CMD_M; }MDTOSD_CMD_M;
/*内部指令命令集*/ /*内部指令命令集*/
typedef enum { typedef enum {
INSIDE_CMD_UPDATE = 0x81, //0x81,升级程序下发请求,由主机发起,从机应答 INSIDE_CMD_UPDATE = 0x81, //0x81,升级程序下发请求,由主机发起,从机应答
INSIDE_CMD_ALTER_485ADDR = 0x04, //0x04, 设置设备485地址 INSIDE_CMD_ALTER_485ADDR = 0x04, //0x04, 设置设备485地址
}INSIDE_CMD_M; }INSIDE_CMD_M;
/*设备类型*/ /*设备类型*/
typedef enum { typedef enum {
NUL, //0x0000 空设备 NUL, //0x0000 空设备
FORCE_6D, //0x0001 六维应力 FORCE_6D, //0x0001 六维应力
OSMOTIC_PRESSURE, //0x0002 渗透压 OSMOTIC_PRESSURE, //0x0002 渗透压
ELASTIC_WAVEGUIDE, //0x0003 弹性波导 ELASTIC_WAVEGUIDE, //0x0003 弹性波导
DIELECTRIC_MASS, //0x0004 介电质普 DIELECTRIC_MASS, //0x0004 介电质普
_0x0005, //0x0005 保留 _0x0005, //0x0005 保留
CONT_DEFOR_3D, //0x0006 三维连续变形 CONT_DEFOR_3D, //0x0006 三维连续变形
COMM_UNIT, //0x0007 通讯单元 COMM_UNIT, //0x0007 通讯单元
FORCE_3D, //0x0008 三维应力 FORCE_3D, //0x0008 三维应力
LASER_TRACING, //0x0009 激光示踪 LASER_TRACING, //0x0009 激光示踪
_0x000A, //0x000A 保留 _0x000A, //0x000A 保留
_0x000B, //0x000B 保留 _0x000B, //0x000B 保留
_0x000C, //0x000C 保留 _0x000C, //0x000C 保留
MULTI_PARAMETER_FUSION, //0x000D 多参数融合 MULTI_PARAMETER_FUSION, //0x000D 多参数融合
CRACK_DETECTION, //0x000E 裂缝仪 CRACK_DETECTION, //0x000E 裂缝仪
_0x000F, //0x000F 保留 _0x000F, //0x000F 保留
ATTITUDE_MONITOR, //0x0010 姿态检测 ATTITUDE_MONITOR, //0x0010 姿态检测
LASER_DISPLACE, //0x0011 激光位移 LASER_DISPLACE, //0x0011 激光位移
REBAR_STRESS, //0x0012 钢筋应力 REBAR_STRESS, //0x0012 钢筋应力
ANCHOR_ROD_STRESS, //0x0013 锚杆轴力 ANCHOR_ROD_STRESS, //0x0013 锚杆轴力
SURFACE_STRESS, //0x0014 表面应力 SURFACE_STRESS, //0x0014 表面应力
PRESSURE, //0x0015 压力 PRESSURE, //0x0015 压力
MICROWAVE_DISPLACE, //0x0016 微波测距 MICROWAVE_DISPLACE, //0x0016 微波测距
}DEVICE_TYPE_M; }DEVICE_TYPE_M;
/*通讯方式*/ /*通讯方式*/
typedef enum { typedef enum {
LORA = 0x01, //0x01 LORA通讯 LORA = 0x01, //0x01 LORA通讯
RS485 = 0x02, //0x02 RS485通讯 RS485 = 0x02, //0x02 RS485通讯
RS232 = 0x03, //0x03 RS232通讯 RS232 = 0x03, //0x03 RS232通讯
CAN = 0x04, //0x04 CAN通讯 CAN = 0x04, //0x04 CAN通讯
CATONE = 0x05, //0x05 _4G通讯 CATONE = 0x05, //0x05 _4G通讯
BLE = 0x06, //0x06 BLE通讯 BLE = 0x06, //0x06 BLE通讯
WIFI = 0x07, //0x07 WIFI通讯 WIFI = 0x07, //0x07 WIFI通讯
UART = 0x08, //0x08 UART通讯 UART = 0x08, //0x08 UART通讯
}COMM_WAY_M; }COMM_WAY_M;
/*设备标志*/ /*设备标志*/
typedef enum { typedef enum {
MASTER = 0x000000, //0x000000 主设备 MASTER = 0x000000, //0x000000 主设备
SUBSET = 0x800000, //0x800000 子设备 SUBSET = 0x800000, //0x800000 子设备
}DEVICE_SIGN_M; }DEVICE_SIGN_M;
typedef struct { typedef struct {
__IO GWTOMD_CMD_M rCmdGWToMD; //网关下发命令 __IO GWTOMD_CMD_M rCmdGWToMD; //网关下发命令
__IO GWTOMD_CMD_M sCmdMDToGW; //主设备返回命令 __IO GWTOMD_CMD_M sCmdMDToGW; //主设备返回命令
__IO uint16_t rPayLen; __IO uint16_t rPayLen;
__IO bool HeaderFrame; __IO bool HeaderFrame;
__IO uint8_t RxLen; __IO uint8_t RxLen;
@@ -193,8 +196,8 @@ typedef struct {
}GWTOMD_Rx_T; }GWTOMD_Rx_T;
typedef struct { typedef struct {
__IO MDTOSD_CMD_M rCmdSDToMD; //子设备返回命令 __IO MDTOSD_CMD_M rCmdSDToMD; //子设备返回命令
__IO MDTOSD_CMD_M sCmdMDToSD; //主设备下发命令 __IO MDTOSD_CMD_M sCmdMDToSD; //主设备下发命令
__IO uint8_t rPayLen; __IO uint8_t rPayLen;
__IO bool HeaderFrame; __IO bool HeaderFrame;
__IO uint8_t RxLen; __IO uint8_t RxLen;
@@ -212,12 +215,12 @@ typedef struct {
GWTOMD_Rx_T GWRS485Rx; GWTOMD_Rx_T GWRS485Rx;
uint8_t GatewayBuffLen; uint8_t GatewayBuffLen;
uint8_t GatewayBuff[256]; uint8_t GatewayBuff[256];
uint8_t GatewayRevTimeoutCnt; //网关串口接收超时计数 uint8_t GatewayRevTimeoutCnt; //网关串口接收超时计数
MDTOSD_Rx_T SDRS485Rx; MDTOSD_Rx_T SDRS485Rx;
uint8_t SubsetBuffLen; uint8_t SubsetBuffLen;
uint8_t SubsetBuff[256]; uint8_t SubsetBuff[256];
uint8_t SubsetRevTimeoutCnt; //子设备串口接收超时计数 uint8_t SubsetRevTimeoutCnt; //子设备串口接收超时计数
uint8_t InsidePayLen; uint8_t InsidePayLen;
uint8_t InsideBuffLen; uint8_t InsideBuffLen;
@@ -233,43 +236,47 @@ typedef struct {
DeviceData_T DevData; DeviceData_T DevData;
bool SubsetCaliOk; //子设备校准标志位 bool SubsetCaliOk; //子设备校准标志位
bool MasterCaliOk; //主设备标校标志位 bool MasterCaliOk; //主设备标校标志位
uint8_t ReadDataAdd; //获取数据地址 uint8_t ReadDataAdd; //获取数据地址
uint16_t DeviceDataLen; //在线设备采集到的数据长度总和 uint16_t DeviceDataLen; //在线设备采集到的数据长度总和
uint8_t DeviceDataBuff[512]; //在线设备采集到的数据缓存(主设备的数据永远排在最前面) uint8_t DeviceDataBuff[512]; //在线设备采集到的数据缓存(主设备的数据永远排在最前面)
uint8_t DeviceData[512]; //在线设备采集到的数据(主设备的数据永远排在最前面) uint8_t DeviceData[512]; //在线设备采集到的数据(主设备的数据永远排在最前面)
bool SubsetReadDataOk; //子设备读取数据成功标志位 bool SubsetReadDataOk; //子设备读取数据成功标志位
bool DeviceReadDataOk; //设备读取数据完成标志位 bool DeviceReadDataOk; //设备读取数据完成标志位
uint8_t DeviceN; //在线设备数量(最多32个子设备,1个主设备) uint8_t DeviceN; //在线设备数量(最多32个子设备,1个主设备)
uint8_t Dev485Addr; //在线设备485地址(最多32个子设备,1个主设备) uint8_t Dev485Addr; //在线设备485地址(最多32个子设备,1个主设备)
uint8_t Dev485Addrs[16]; //在线设备485地址缓存,0位为0x00广播地址 uint8_t Dev485Addrs[16]; //在线设备485地址缓存,0位为0x00广播地址
uint8_t DeviceMAC[16][6]; //在线设备的唯一MAC地址(主设备的MAC永远排在最前面) uint8_t DeviceMAC[16][6]; //在线设备的唯一MAC地址(主设备的MAC永远排在最前面)
bool SubsetMACOk; //在线子设备MAC获取成功标志位 bool SubsetMACOk; //在线子设备MAC获取成功标志位
bool DeviceMACOk; //在线设备获取完成标志位 bool DeviceMACOk; //在线设备获取完成标志位
bool CollTimeSetOk; //采集时间设置成功标志位 bool CollTimeSetOk; //采集时间设置成功标志位
uint8_t CollTimeAdd; //设置采集时间地址 uint8_t CollTimeAdd; //设置采集时间地址
bool SyncTimeOk; //时间同步成功标志位 bool SyncTimeOk; //时间同步成功标志位
uint8_t SyncTimeAdd; //时间同步设备地址 uint8_t SyncTimeAdd; //时间同步设备地址
bool BroadCmd; //广播命令 bool BroadCmd; //广播命令
bool LoginOk; //注册成功标志位 bool LoginOk; //注册成功标志位
bool LoginMess; bool LoginMess;
bool UploadOk; //上传成功标志位 bool UploadOk; //上传成功标志位
bool UploadMess; bool UploadMess;
bool Gateway_IRQ_Status; //网关接收中断 bool Gateway_IRQ_Status; //网关接收中断
bool Subset_IRQ_Status; //子设备接收中断 bool Subset_IRQ_Status; //子设备接收中断
bool TimingAcquisition; //采集传感器数据 bool TimingAcquisition; //采集传感器数据
/**激光示踪私有**/ /**激光示踪私有**/
bool LaserOnOff; //打开与关闭激光标志位 bool LaserOnOff; //打开与关闭激光标志位
int8_t SignalRSSI;
int8_t SignalSNR;
uint8_t LaserTimerMinutes; //激光定时关闭分钟数
uint16_t LaserTimerCount; //激光定时计数(RTC 30s)
}SGCP_t; }SGCP_t;
extern SGCP_t SGCP; extern SGCP_t SGCP;
+5 -5
View File
@@ -1,4 +1,4 @@
#ifndef __UPDATE_H #ifndef __UPDATE_H
#define __UPDATE_H #define __UPDATE_H
#include <stdint.h> #include <stdint.h>
@@ -23,14 +23,14 @@
#define BOOT_PARA_ADDRESS (0x0001FC00)//(FLASH_BASE + BOOT_SIZE) #define BOOT_PARA_ADDRESS (0x0001FC00)//(FLASH_BASE + BOOT_SIZE)
#define BOOT_PARA_SIZE (FLASH_SECTOR_SIZE) #define BOOT_PARA_SIZE (FLASH_SECTOR_SIZE)
//主机下发升级请求载荷结构体 //主机下发升级请求载荷结构体
typedef struct { typedef struct {
uint16_t PackageNum; uint16_t PackageNum;
uint32_t AppSize; uint32_t AppSize;
uint32_t AppCrc32; uint32_t AppCrc32;
}__attribute__ ((packed))UpDataRequset_t, *UDReq; }__attribute__ ((packed))UpDataRequset_t, *UDReq;
//帧头结构体 //帧头结构体
typedef struct { typedef struct {
uint8_t Header; uint8_t Header;
uint8_t DevMac[6]; uint8_t DevMac[6];
@@ -39,14 +39,14 @@ typedef struct {
}__attribute__((packed))UpdateFrameHeader_t,*pUpdateFrameHeader; }__attribute__((packed))UpdateFrameHeader_t,*pUpdateFrameHeader;
//输入接口函数定义,需根据接口重新定义 //输入接口函数定义,需根据接口重新定义
#define U_DBG_LOG(...) DBG_LOG(__VA_ARGS__) #define U_DBG_LOG(...) DBG_LOG(__VA_ARGS__)
#define U_DELAY_MS(x) delay_ms(x) #define U_DELAY_MS(x) delay_ms(x)
#define U_SYSTEM_TESET() SystemReset() #define U_SYSTEM_TESET() SystemReset()
#define SAVE_BOOT_PARA(addr) SAVE_APP_PARA(addr) #define SAVE_BOOT_PARA(addr) SAVE_APP_PARA(addr)
#define READ_BOOT_PARA(addr) READ_APP_PARA(addr) #define READ_BOOT_PARA(addr) READ_APP_PARA(addr)
//输出接口 //输出接口
void Update(uint8_t *PayLoad); void Update(uint8_t *PayLoad);
void UpdateInit(void); void UpdateInit(void);
#endif #endif
+116 -115
View File
@@ -1,4 +1,4 @@
#ifndef _BSP_H #ifndef _BSP_H
#define _BSP_H #define _BSP_H
#include <stdint.h> #include <stdint.h>
@@ -8,23 +8,23 @@
#include "spi.h" #include "spi.h"
#include "Update.h" #include "Update.h"
/*模块启用与关闭*/ /*模块启用与关闭*/
#define USE_DEBUG 1 //调试串口选择,0、关闭,1、启用 #define USE_DEBUG 1 //调试串口选择,0、关闭,1、启用
#define USE_VBAT_AD 1 //电池电压AD获取选择,0、关闭,1、启用 #define USE_VBAT_AD 1 //电池电压AD获取选择,0、关闭,1、启用
#define USE_WDT 1 //看门狗选择,0、关闭,1启用 #define USE_WDT 1 //看门狗选择,0、关闭,1启用
#define USE_EXFALSE 0 //外部FALSE存储选择,0、关闭,1、启用 #define USE_EXFALSE 0 //外部FALSE存储选择,0、关闭,1、启用
#define USE_LED 1 //状态灯选择,0、关闭,1、启用 #define USE_LED 1 //状态灯选择,0、关闭,1、启用
#define USE_RTC 1 //RTC时钟开关,0、关闭,1、开启 #define USE_RTC 1 //RTC时钟开关,0、关闭,1、开启
#define USE_LPUART0 1 //LPUART0开关,0、关闭,1、启用 #define USE_LPUART0 1 //LPUART0开关,0、关闭,1、启用
#define USE_UART0 1 //UART0开关,0、关闭,1、启用 #define USE_UART0 1 //UART0开关,0、关闭,1、启用
#define USE_UART1 0 //UART0开关,0、关闭,1、启用 #define USE_UART1 0 //UART0开关,0、关闭,1、启用
#define USE_I2C0 1 //I2C0开关,0、关闭,1、启用 #define USE_I2C0 1 //I2C0开关,0、关闭,1、启用
#define USE_I2C1 1 //I2C1开关,0、关闭,1、启用 #define USE_I2C1 1 //I2C1开关,0、关闭,1、启用
#define USE_SPI0 1 //SPI1开关,0、关闭,1、启用 #define USE_SPI0 1 //SPI1开关,0、关闭,1、启用
#define USE_SPI1 0 //SPI1开关,0、关闭,1、启用 #define USE_SPI1 0 //SPI1开关,0、关闭,1、启用
//#define USE_BOOTLOADER 1 //BOOTLOADER开关,0、关闭,1、启用 //#define USE_BOOTLOADER 1 //BOOTLOADER开关,0、关闭,1、启用
//<<---------------------------- MCU -------------------------------->> //<<---------------------------- MCU -------------------------------->>
//< UART0 //< UART0
@@ -45,167 +45,167 @@
#define UART1_RX_PIN GpioPin1 #define UART1_RX_PIN GpioPin1
#define UART1_RX_AF GpioAf3 #define UART1_RX_AF GpioAf3
//< 低功耗串口 //< 低功耗串口
#define LPUart0_TxPortx GpioPortB //低功耗串口0通道 #define LPUart0_TxPortx GpioPortB //低功耗串口0通道
#define LPUART0_TxPinx GpioPin10 //配置PB10为LPUART0_Tx #define LPUART0_TxPinx GpioPin10 //配置PB10为LPUART0_Tx
#define LPUART0_TX_AF GpioAf4 #define LPUART0_TX_AF GpioAf4
#define LPUart0_RxPortx GpioPortB //低功耗串口0通道 #define LPUart0_RxPortx GpioPortB //低功耗串口0通道
#define LPUART0_RxPinx GpioPin11 //配置PB11为LPUART0_Rx #define LPUART0_RxPinx GpioPin11 //配置PB11为LPUART0_Rx
#define LPUART0_RX_AF GpioAf3 #define LPUART0_RX_AF GpioAf3
//< SPI0 //< SPI0
#define SPI0_NSS_PORTx GpioPortA //NSSIO口 #define SPI0_NSS_PORTx GpioPortA //NSSIO口
#define SPI0_NSS_PINx GpioPin15 //配置PA04为NSS #define SPI0_NSS_PINx GpioPin15 //配置PA04为NSS
#define SET_SPI0_NSS() Gpio_SetIO(SPI0_NSS_PORTx, SPI0_NSS_PINx) //NSS拉高 #define SET_SPI0_NSS() Gpio_SetIO(SPI0_NSS_PORTx, SPI0_NSS_PINx) //NSS拉高
#define CLR_SPI0_NSS() Gpio_ClrIO(SPI0_NSS_PORTx, SPI0_NSS_PINx) //NSS拉低 #define CLR_SPI0_NSS() Gpio_ClrIO(SPI0_NSS_PORTx, SPI0_NSS_PINx) //NSS拉低
#define SPI0_NSS_AF GpioAf1 #define SPI0_NSS_AF GpioAf1
#define SPI0_SCK_PORTx GpioPortB //SCKIO口 #define SPI0_SCK_PORTx GpioPortB //SCKIO口
#define SPI0_SCK_PINx GpioPin3 //配置PA05为SCK #define SPI0_SCK_PINx GpioPin3 //配置PA05为SCK
#define SET_SPI0_SCK() Gpio_SetIO(SPI0_SCK_PORTx, SPI0_SCK_PINx) //SCK拉高 #define SET_SPI0_SCK() Gpio_SetIO(SPI0_SCK_PORTx, SPI0_SCK_PINx) //SCK拉高
#define CLR_SPI0_SCK() Gpio_ClrIO(SPI0_SCK_PORTx, SPI0_SCK_PINx) //SCK拉低 #define CLR_SPI0_SCK() Gpio_ClrIO(SPI0_SCK_PORTx, SPI0_SCK_PINx) //SCK拉低
#define SPI0_SCK_AF GpioAf1 #define SPI0_SCK_AF GpioAf1
#define SPI0_MISO_PORTx GpioPortB //MISOIO口 #define SPI0_MISO_PORTx GpioPortB //MISOIO口
#define SPI0_MISO_PINx GpioPin4 //配置PA06为MISO #define SPI0_MISO_PINx GpioPin4 //配置PA06为MISO
#define SET_SPI0_MISO() Gpio_SetIO(SPI0_MISO_PORTx, SPI0_MISO_PINx) //MISO拉高 #define SET_SPI0_MISO() Gpio_SetIO(SPI0_MISO_PORTx, SPI0_MISO_PINx) //MISO拉高
#define CLR_SPI0_MISO() Gpio_ClrIO(SPI0_MISO_PORTx, SPI0_MISO_PINx) //MISO拉低 #define CLR_SPI0_MISO() Gpio_ClrIO(SPI0_MISO_PORTx, SPI0_MISO_PINx) //MISO拉低
#define SPI0_MISO_AF GpioAf1 #define SPI0_MISO_AF GpioAf1
#define SPI0_MOSI_PORTx GpioPortB //MOSIIO口 #define SPI0_MOSI_PORTx GpioPortB //MOSIIO口
#define SPI0_MOSI_PINx GpioPin5 //配置PA07为MOSI #define SPI0_MOSI_PINx GpioPin5 //配置PA07为MOSI
#define SET_SPI0_MOSI() Gpio_SetIO(SPI0_MOSI_PORTx, SPI0_MOSI_PINx) //MOSI拉高 #define SET_SPI0_MOSI() Gpio_SetIO(SPI0_MOSI_PORTx, SPI0_MOSI_PINx) //MOSI拉高
#define CLR_SPI0_MOSI() Gpio_ClrIO(SPI0_MOSI_PORTx, SPI0_MOSI_PINx) //MOSI拉低 #define CLR_SPI0_MOSI() Gpio_ClrIO(SPI0_MOSI_PORTx, SPI0_MOSI_PINx) //MOSI拉低
#define SPI0_MOSI_AF GpioAf1 #define SPI0_MOSI_AF GpioAf1
//< SPI1 //< SPI1
#define SPI1_NSS_PORTx GpioPortB //NSSIO口 #define SPI1_NSS_PORTx GpioPortB //NSSIO口
#define SPI1_NSS_PINx GpioPin12 //配置PB12为NSS #define SPI1_NSS_PINx GpioPin12 //配置PB12为NSS
#define SET_SPI1_NSS() Gpio_SetIO(SPI1_NSS_PORTx, SPI1_NSS_PINx) //NSS拉高 #define SET_SPI1_NSS() Gpio_SetIO(SPI1_NSS_PORTx, SPI1_NSS_PINx) //NSS拉高
#define CLR_SPI1_NSS() Gpio_ClrIO(SPI1_NSS_PORTx, SPI1_NSS_PINx) //NSS拉低 #define CLR_SPI1_NSS() Gpio_ClrIO(SPI1_NSS_PORTx, SPI1_NSS_PINx) //NSS拉低
#define SPI1_NSS_AF GpioAf1 #define SPI1_NSS_AF GpioAf1
#define SPI1_SCK_PORTx GpioPortB //SCKIO口 #define SPI1_SCK_PORTx GpioPortB //SCKIO口
#define SPI1_SCK_PINx GpioPin3 //配置PB13为SCK #define SPI1_SCK_PINx GpioPin3 //配置PB13为SCK
#define SET_SPI1_SCK() Gpio_SetIO(SPI1_SCK_PORTx, SPI1_SCK_PINx) //SCK拉高 #define SET_SPI1_SCK() Gpio_SetIO(SPI1_SCK_PORTx, SPI1_SCK_PINx) //SCK拉高
#define CLR_SPI1_SCK() Gpio_ClrIO(SPI1_SCK_PORTx, SPI1_SCK_PINx) //SCK拉低 #define CLR_SPI1_SCK() Gpio_ClrIO(SPI1_SCK_PORTx, SPI1_SCK_PINx) //SCK拉低
#define SPI1_SCK_AF GpioAf1 #define SPI1_SCK_AF GpioAf1
#define SPI1_MISO_PORTx GpioPortB //MISOIO口 #define SPI1_MISO_PORTx GpioPortB //MISOIO口
#define SPI1_MISO_PINx GpioPin4 //配置PB14为MISO #define SPI1_MISO_PINx GpioPin4 //配置PB14为MISO
#define SET_SPI1_MISO() Gpio_SetIO(SPI1_MISO_PORTx, SPI1_MISO_PINx) //MISO拉高 #define SET_SPI1_MISO() Gpio_SetIO(SPI1_MISO_PORTx, SPI1_MISO_PINx) //MISO拉高
#define CLR_SPI1_MISO() Gpio_ClrIO(SPI1_MISO_PORTx, SPI1_MISO_PINx) //MISO拉低 #define CLR_SPI1_MISO() Gpio_ClrIO(SPI1_MISO_PORTx, SPI1_MISO_PINx) //MISO拉低
#define SPI1_MISO_AF GpioAf1 #define SPI1_MISO_AF GpioAf1
#define SPI1_MOSI_PORTx GpioPortB //MOSIIO口 #define SPI1_MOSI_PORTx GpioPortB //MOSIIO口
#define SPI1_MOSI_PINx GpioPin5 //配置PB15为MOSI #define SPI1_MOSI_PINx GpioPin5 //配置PB15为MOSI
#define SET_SPI1_MOSI() Gpio_SetIO(SPI1_MOSI_PORTx, SPI1_MOSI_PINx) //MOSI拉高 #define SET_SPI1_MOSI() Gpio_SetIO(SPI1_MOSI_PORTx, SPI1_MOSI_PINx) //MOSI拉高
#define CLR_SPI1_MOSI() Gpio_ClrIO(SPI1_MOSI_PORTx, SPI1_MOSI_PINx) //MOSI拉低 #define CLR_SPI1_MOSI() Gpio_ClrIO(SPI1_MOSI_PORTx, SPI1_MOSI_PINx) //MOSI拉低
#define SPI1_MOSI_AF GpioAf1 #define SPI1_MOSI_AF GpioAf1
//< I2C0 //< I2C0
#define I2C0_SCL_PORTx GpioPortF //SCL的GPIO通道 #define I2C0_SCL_PORTx GpioPortF //SCL的GPIO通道
#define I2C0_SCL_PINx GpioPin1 //SCL的通道位 #define I2C0_SCL_PINx GpioPin1 //SCL的通道位
#define I2C0_SCL_AF GpioAf1 #define I2C0_SCL_AF GpioAf1
#define SET_I2C0_SCL() Gpio_SetIO(I2C0_SCL_PORTx, I2C0_SCL_PINx) #define SET_I2C0_SCL() Gpio_SetIO(I2C0_SCL_PORTx, I2C0_SCL_PINx)
#define CLR_I2C0_SCL() Gpio_ClrIO(I2C0_SCL_PORTx, I2C0_SCL_PINx) #define CLR_I2C0_SCL() Gpio_ClrIO(I2C0_SCL_PORTx, I2C0_SCL_PINx)
#define I2C0_SDA_PORTx GpioPortF //SDA的GPIO通道 #define I2C0_SDA_PORTx GpioPortF //SDA的GPIO通道
#define I2C0_SDA_PINx GpioPin0 //SDA的通道位 #define I2C0_SDA_PINx GpioPin0 //SDA的通道位
#define I2C0_SDA_AF GpioAf1 #define I2C0_SDA_AF GpioAf1
#define SET_I2C0_SDA() Gpio_SetIO(I2C0_SDA_PORTx, I2C0_SDA_PINx) #define SET_I2C0_SDA() Gpio_SetIO(I2C0_SDA_PORTx, I2C0_SDA_PINx)
#define CLR_I2C0_SDA() Gpio_ClrIO(I2C0_SDA_PORTx, I2C0_SDA_PINx) #define CLR_I2C0_SDA() Gpio_ClrIO(I2C0_SDA_PORTx, I2C0_SDA_PINx)
//< I2C1 //< I2C1
#define I2C1_SCL_PORTx GpioPortA //SCL的GPIO通道 #define I2C1_SCL_PORTx GpioPortA //SCL的GPIO通道
#define I2C1_SCL_PINx GpioPin11 //SCL的通道位 #define I2C1_SCL_PINx GpioPin11 //SCL的通道位
#define I2C1_SCL_AF GpioAf3 #define I2C1_SCL_AF GpioAf3
#define SET_I2C1_SCL() Gpio_SetIO(I2C1_SCL_PORTx, I2C1_SCL_PINx) #define SET_I2C1_SCL() Gpio_SetIO(I2C1_SCL_PORTx, I2C1_SCL_PINx)
#define CLR_I2C1_SCL() Gpio_ClrIO(I2C1_SCL_PORTx, I2C1_SCL_PINx) #define CLR_I2C1_SCL() Gpio_ClrIO(I2C1_SCL_PORTx, I2C1_SCL_PINx)
#define I2C1_SDA_PORTx GpioPortA //SDA的GPIO通道 #define I2C1_SDA_PORTx GpioPortA //SDA的GPIO通道
#define I2C1_SDA_PINx GpioPin12 //SDA的通道位 #define I2C1_SDA_PINx GpioPin12 //SDA的通道位
#define I2C1_SDA_AF GpioAf3 #define I2C1_SDA_AF GpioAf3
#define SET_I2C1_SDA() Gpio_SetIO(I2C1_SDA_PORTx, I2C1_SDA_PINx) #define SET_I2C1_SDA() Gpio_SetIO(I2C1_SDA_PORTx, I2C1_SDA_PINx)
#define CLR_I2C1_SDA() Gpio_ClrIO(I2C1_SDA_PORTx, I2C1_SDA_PINx) #define CLR_I2C1_SDA() Gpio_ClrIO(I2C1_SDA_PORTx, I2C1_SDA_PINx)
//<<---------------------------- 485 -------------------------------->> //<<---------------------------- 485 -------------------------------->>
//< LPUart0 //< LPUart0
#define RS485_CTRL_PORTx GpioPortB //RS485_1通信控制 #define RS485_CTRL_PORTx GpioPortB //RS485_1通信控制
#define RS485_CTRL_PINx GpioPin1 //配置PB02为RS485_1_CTRL #define RS485_CTRL_PINx GpioPin1 //配置PB02为RS485_1_CTRL
#define RS485_CTRL_TX() Gpio_SetIO(RS485_CTRL_PORTx, RS485_CTRL_PINx) //RS485_1_CTRL拉高发送 #define RS485_CTRL_TX() Gpio_SetIO(RS485_CTRL_PORTx, RS485_CTRL_PINx) //RS485_1_CTRL拉高发送
#define RS485_CTRL_RX() Gpio_ClrIO(RS485_CTRL_PORTx, RS485_CTRL_PINx) //RS485_1_CTRL拉低接收 #define RS485_CTRL_RX() Gpio_ClrIO(RS485_CTRL_PORTx, RS485_CTRL_PINx) //RS485_1_CTRL拉低接收
//<<---------------------------- LED -------------------------------->> //<<---------------------------- LED -------------------------------->>
//< LED_State //< LED_State
#define LED_STATE_PORTx GpioPortF //状态指示灯IO通道 #define LED_STATE_PORTx GpioPortF //状态指示灯IO通道
#define LED_STATE_PINx GpioPin7 //状态指示灯脚位 #define LED_STATE_PINx GpioPin7 //状态指示灯脚位
#define LED_ON() Gpio_SetIO(LED_STATE_PORTx, LED_STATE_PINx);//状态指示灯亮 #define LED_ON() Gpio_SetIO(LED_STATE_PORTx, LED_STATE_PINx);//状态指示灯亮
#define LED_OFF() Gpio_ClrIO(LED_STATE_PORTx, LED_STATE_PINx);//状态指示灯灭 #define LED_OFF() Gpio_ClrIO(LED_STATE_PORTx, LED_STATE_PINx);//状态指示灯灭
//<<---------------------------- LORA --> SPI0 -------------------------------->> //<<---------------------------- LORA --> SPI0 -------------------------------->>
//< LORA --> DIO0 //< LORA --> DIO0
#define LORA_DIO0_PORTx GpioPortB //LORA_DIO0口 #define LORA_DIO0_PORTx GpioPortB //LORA_DIO0口
#define LORA_DIO0_PINx GpioPin7 //配置PA01为DIO0 #define LORA_DIO0_PINx GpioPin7 //配置PA01为DIO0
#define GET_LORA_DIO0() Gpio_GetInputIO(LORA_DIO0_PORTx, LORA_DIO0_PINx) //获取LORA_DIO0电平状态 #define GET_LORA_DIO0() Gpio_GetInputIO(LORA_DIO0_PORTx, LORA_DIO0_PINx) //获取LORA_DIO0电平状态
//< LORA --> DIO1 //< LORA --> DIO1
#define LORA_DIO1_PORTx GpioPortB //LORA_DIO0口 #define LORA_DIO1_PORTx GpioPortB //LORA_DIO0口
#define LORA_DIO1_PINx GpioPin0 //配置PA01为DIO0 #define LORA_DIO1_PINx GpioPin0 //配置PA01为DIO0
#define GET_LORA_DIO1() Gpio_GetInputIO(LORA_DIO1_PORTx, LORA_DIO1_PINx) //获取LORA_DIO0电平状态 #define GET_LORA_DIO1() Gpio_GetInputIO(LORA_DIO1_PORTx, LORA_DIO1_PINx) //获取LORA_DIO0电平状态
//< LORA --> RST //< LORA --> RST
#define LORA_RST_PORTx GpioPortB //LORA_RST口 #define LORA_RST_PORTx GpioPortB //LORA_RST口
#define LORA_RST_PINx GpioPin6 //配置PA00为RST #define LORA_RST_PINx GpioPin6 //配置PA00为RST
#define SET_LORA_RST() Gpio_SetIO(LORA_RST_PORTx, LORA_RST_PINx) //LORA复位脚拉高 #define SET_LORA_RST() Gpio_SetIO(LORA_RST_PORTx, LORA_RST_PINx) //LORA复位脚拉高
#define CLR_LORA_RST() Gpio_ClrIO(LORA_RST_PORTx, LORA_RST_PINx) //LORA复位脚拉低 #define CLR_LORA_RST() Gpio_ClrIO(LORA_RST_PORTx, LORA_RST_PINx) //LORA复位脚拉低
//<<---------------------------- LSM6DSLTR --> I2C0 -------------------------------->> //<<---------------------------- LSM6DSLTR --> I2C0 -------------------------------->>
//< ACC_INT1 //< ACC_INT1
#define LSM6DSLTR_INT1_PORTx GpioPortC //LSM6DSLTR中断1IO通道 #define LSM6DSLTR_INT1_PORTx GpioPortC //LSM6DSLTR中断1IO通道
#define LSM6DSLTR_INT1_PINx GpioPin15 //配置PB01为ACC_INT1 #define LSM6DSLTR_INT1_PINx GpioPin15 //配置PB01为ACC_INT1
#define GET_LSM6DSLTR_INT1() Gpio_GetInputIO(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx) //获取ACC_INT1电平状态 #define GET_LSM6DSLTR_INT1() Gpio_GetInputIO(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx) //获取ACC_INT1电平状态
//< ACC_INT2 //< ACC_INT2
#define LSM6DSLTR_INT2_PORTx GpioPortC //LSM6DSLTR中断1IO通道 #define LSM6DSLTR_INT2_PORTx GpioPortC //LSM6DSLTR中断1IO通道
#define LSM6DSLTR_INT2_PINx GpioPin13 //配置PA08为ACC_INT2 #define LSM6DSLTR_INT2_PINx GpioPin13 //配置PA08为ACC_INT2
#define GET_LSM6DSLTR_INT2() Gpio_GetInputIO(LSM6DSLTR_INT2_PORTx, LSM6DSLTR_INT2_PINx) //获取ACC_INT2电平状态 #define GET_LSM6DSLTR_INT2() Gpio_GetInputIO(LSM6DSLTR_INT2_PORTx, LSM6DSLTR_INT2_PINx) //获取ACC_INT2电平状态
//<<---------------------------- MMC5983MA --> I2C0 -------------------------------->> //<<---------------------------- MMC5983MA --> I2C0 -------------------------------->>
//< MMC0_INT //< MMC0_INT
#define MMC5983MA_INT_PORTx GpioPortC //MMC5983MA中断IO通道 #define MMC5983MA_INT_PORTx GpioPortC //MMC5983MA中断IO通道
#define MMC5983MA_INT_PINx GpioPin14 //配置PB00为MMC_INT #define MMC5983MA_INT_PINx GpioPin14 //配置PB00为MMC_INT
#define GET_MMC5983MA_INT() Gpio_GetInputIO(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx) //获取ACC_INT2电平状态 #define GET_MMC5983MA_INT() Gpio_GetInputIO(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx) //获取ACC_INT2电平状态
//<<---------------------------- LASER -------------------------------->> //<<---------------------------- LASER -------------------------------->>
//< LASER1 //< LASER1
#define LASER1_ON_OFF_PORTx GpioPortB #define LASER1_ON_OFF_PORTx GpioPortB
#define LASER1_ON_OFF_PINx GpioPin14 #define LASER1_ON_OFF_PINx GpioPin14
#define LASER1_ON() Gpio_SetIO(LASER1_ON_OFF_PORTx, LASER1_ON_OFF_PINx) //LORA复位脚拉高 #define LASER1_ON() Gpio_SetIO(LASER1_ON_OFF_PORTx, LASER1_ON_OFF_PINx) //LORA复位脚拉高
#define LASER1_OFF() Gpio_ClrIO(LASER1_ON_OFF_PORTx, LASER1_ON_OFF_PINx) //LORA复位脚拉低 #define LASER1_OFF() Gpio_ClrIO(LASER1_ON_OFF_PORTx, LASER1_ON_OFF_PINx) //LORA复位脚拉低
//< LASER2 //< LASER2
#define LASER2_ON_OFF_PORTx GpioPortB #define LASER2_ON_OFF_PORTx GpioPortB
#define LASER2_ON_OFF_PINx GpioPin13 #define LASER2_ON_OFF_PINx GpioPin13
#define LASER2_ON() Gpio_SetIO(LASER2_ON_OFF_PORTx, LASER2_ON_OFF_PINx) //LORA复位脚拉高 #define LASER2_ON() Gpio_SetIO(LASER2_ON_OFF_PORTx, LASER2_ON_OFF_PINx) //LORA复位脚拉高
#define LASER2_OFF() Gpio_ClrIO(LASER2_ON_OFF_PORTx, LASER2_ON_OFF_PINx) //LORA复位脚拉低 #define LASER2_OFF() Gpio_ClrIO(LASER2_ON_OFF_PORTx, LASER2_ON_OFF_PINx) //LORA复位脚拉低
//< LASER3 //< LASER3
#define LASER3_ON_OFF_PORTx GpioPortB #define LASER3_ON_OFF_PORTx GpioPortB
#define LASER3_ON_OFF_PINx GpioPin12 #define LASER3_ON_OFF_PINx GpioPin12
#define LASER3_ON() Gpio_SetIO(LASER3_ON_OFF_PORTx, LASER3_ON_OFF_PINx) //LORA复位脚拉高 #define LASER3_ON() Gpio_SetIO(LASER3_ON_OFF_PORTx, LASER3_ON_OFF_PINx) //LORA复位脚拉高
#define LASER3_OFF() Gpio_ClrIO(LASER3_ON_OFF_PORTx, LASER3_ON_OFF_PINx) //LORA复位脚拉低 #define LASER3_OFF() Gpio_ClrIO(LASER3_ON_OFF_PORTx, LASER3_ON_OFF_PINx) //LORA复位脚拉低
//<<------------------------------ ADC ---------------------------------->> //<<------------------------------ ADC ---------------------------------->>
#define AD_ON_OFF_PORTx GpioPortA #define AD_ON_OFF_PORTx GpioPortA
#define AD_ON_OFF_PINx GpioPin3 #define AD_ON_OFF_PINx GpioPin3
#define AD_ON() Gpio_SetIO(AD_ON_OFF_PORTx, AD_ON_OFF_PINx) //LORA复位脚拉高 #define AD_ON() Gpio_SetIO(AD_ON_OFF_PORTx, AD_ON_OFF_PINx)
#define AD_OFF() Gpio_ClrIO(AD_ON_OFF_PORTx, AD_ON_OFF_PINx) //LORA复位脚拉低 #define AD_OFF() Gpio_ClrIO(AD_ON_OFF_PORTx, AD_ON_OFF_PINx)
#define VBAT_PORTx GpioPortA #define VBAT_PORTx GpioPortA
#define VBAT_PINx GpioPin4 #define VBAT_PINx GpioPin4
#define VBAT_ADC_PORTx AdcExInputCH4//采样通道 #define VBAT_ADC_PORTx AdcExInputCH4//采样通道
#define VBAT_CAL 3.5 //电池电压校准 #define VBAT_CAL 3.5 //电池电压校准
//< 电池电压 //< 电池电压
extern float VBAT_8V4; extern float VBAT_8V4;
extern uint8_t VBAT_Percentage; extern uint8_t VBAT_Percentage;
@@ -215,23 +215,23 @@ typedef struct {
uint32_t PackageCnt; uint32_t PackageCnt;
uint32_t AppSize; uint32_t AppSize;
uint32_t Crc32Check; uint32_t Crc32Check;
uint32_t FirstRunFlag;//第一次运行 uint32_t FirstRunFlag;//第一次运行
uint8_t DevMac[6];//设备MAC uint8_t DevMac[6];//设备MAC
uint32_t LoraFreq;//Lora频率 uint32_t LoraFreq;//Lora频率
}BootPara_t, *BootPara; }BootPara_t, *BootPara;
typedef struct { typedef struct {
uint16_t CollectTime; //数据采集时间间隔,设置范围30*N秒,1<=N<=240(默认300秒,N=10) uint16_t CollectTime; //数据采集时间间隔,设置范围30*N秒,1<=N<=240(默认300秒,N=10)
uint16_t ReportInterval; //上报时间间隔,设置范围,30*N秒,10<=N<=1440(默认1200秒,N=40 uint16_t ReportInterval; //上报时间间隔,设置范围,30*N秒,10<=N<=1440(默认1200秒,N=40
uint8_t ERInterval; //紧急上报时间间隔,设置范围,30*N秒,2<=N<=10(默认120秒,N=4 uint8_t ERInterval; //紧急上报时间间隔,设置范围,30*N秒,2<=N<=10(默认120秒,N=4
uint8_t ERTime; //紧急上报时长,设置范围,30*N秒,20<=N<=240(默认1200秒,N=40 uint8_t ERTime; //紧急上报时长,设置范围,30*N秒,20<=N<=240(默认1200秒,N=40
uint32_t TimeStamp; //网关返回RTC时间戳 uint32_t TimeStamp; //网关返回RTC时间戳
}__attribute__((packed))LayoutPara_t,*LayoutPara;//上位机下发的配置参数 }__attribute__((packed))LayoutPara_t,*LayoutPara;//上位机下发的配置参数
typedef struct { typedef struct {
int16_t PitchZero; //俯仰角零点 int16_t PitchZero; //俯仰角零点
int16_t RollZero; //横滚角零点 int16_t RollZero; //横滚角零点
int16_t YawZero; //偏航角零点 int16_t YawZero; //偏航角零点
}__attribute__ ((packed))CalibratePara_t, *CalibratePara; }__attribute__ ((packed))CalibratePara_t, *CalibratePara;
typedef struct { typedef struct {
@@ -246,9 +246,9 @@ typedef struct {
}__attribute__ ((packed))LoraPara_t, *pLoraPara; }__attribute__ ((packed))LoraPara_t, *pLoraPara;
typedef struct { typedef struct {
bool Enable; //串口使能 bool Enable; //串口使能
bool UpgradeEnable;//升级功能使能 bool UpgradeEnable;//升级功能使能
uint32_t Addr; //本机485地址 uint32_t Addr; //本机485地址
uint32_t BaudRate; uint32_t BaudRate;
}__attribute__((packed))RS485Para_t, *RS485Para; }__attribute__((packed))RS485Para_t, *RS485Para;
@@ -258,7 +258,8 @@ typedef struct {
CalibratePara_t CaliPara; CalibratePara_t CaliPara;
RS485Para_t Rs485Ch1; RS485Para_t Rs485Ch1;
RS485Para_t Rs485Ch2; RS485Para_t Rs485Ch2;
uint32_t FactoryFlag;//出厂标志位 uint32_t FactoryFlag;//出厂标志位
uint8_t LaserTimerMinutes; //激光定时关闭分钟数
LoraPara_t Lora; LoraPara_t Lora;
}AppPara_T, *pAppPara; }AppPara_T, *pAppPara;
//#define APP_PARA_ADDRESS (0x0001FC00) //#define APP_PARA_ADDRESS (0x0001FC00)
+39 -37
View File
@@ -1,12 +1,12 @@
#ifndef __MAIN_H #ifndef __MAIN_H
#define __MAIN_H #define __MAIN_H
#include "bsp.h" #include "bsp.h"
#include "UartDebug.h" #include "UartDebug.h"
#include "Update.h" #include "Update.h"
#include "Imu.h" #include "Imu.h"
#define SOFTWARE_VERSION 12 //软件版本 #define SOFTWARE_VERSION 12 //软件版本
#define HARDWARE_VERSION 11 //硬件版本 #define HARDWARE_VERSION 11 //硬件版本
#define MAIN_DBG_LOG(...) { if(MainDispEn) DBG_LOG(__VA_ARGS__);} #define MAIN_DBG_LOG(...) { if(MainDispEn) DBG_LOG(__VA_ARGS__);}
#define DATA_DBG_LOG(...) { if(DataDispEn) DBG_LOG(__VA_ARGS__);} #define DATA_DBG_LOG(...) { if(DataDispEn) DBG_LOG(__VA_ARGS__);}
@@ -17,34 +17,34 @@
#define Z 2 #define Z 2
#define XYZ 3 #define XYZ 3
#define SYSTEM_TIMING_LOGIN (86400 / 30) //系统定时注册时间(一天86400秒) #define SYSTEM_TIMING_LOGIN (86400 / 30) //系统定时注册时间(一天86400秒)
#define ERR_TIMING_LOGIN (1800 / 30) //注册错误重新注册时间(半个小时1800秒) #define ERR_TIMING_LOGIN (1800 / 30) //注册错误重新注册时间(半个小时1800秒)
#define TEST_TIME (60*60*1000) #define TEST_TIME (60*60*1000)
#define ERINTERVAL_VPT 10 //紧急上报阈值,单位0.1° #define ERINTERVAL_VPT 10 //紧急上报阈值,单位0.1°
#define ERINTERVAL_VPT 10 //紧急上报阈值,单位0.1° #define ERINTERVAL_VPT 10 //紧急上报阈值,单位0.1°
typedef struct {//传感器原始数据 typedef struct {//传感器原始数据
float acce[XYZ]; float acce[XYZ];
float gy[XYZ]; float gy[XYZ];
float mag[XYZ]; float mag[XYZ];
}__attribute__ ((packed))SensorData_T,*SensorDp;//传感器数据 }__attribute__ ((packed))SensorData_T,*SensorDp;//传感器数据
typedef struct {//转换的数据 typedef struct {//转换的数据
int16_t Pitch; //俯仰角偏斜 (范围±900)单位0.1° int16_t Pitch; //俯仰角偏斜 (范围±900)单位0.1°
int16_t Roll; //横滚角偏斜 (范围±900)单位0.1° int16_t Roll; //横滚角偏斜 (范围±900)单位0.1°
int16_t Yaw; //偏航角偏斜 (范围0~3600)单位0.1° int16_t Yaw; //偏航角偏斜 (范围0~3600)单位0.1°
// int16_t Temp; //温度值 // int16_t Temp; //温度值
// int32_t AD; //AD值 // int32_t AD; //AD值
}__attribute__ ((packed))ConvertedData_T, *ConvertedDp; }__attribute__ ((packed))ConvertedData_T, *ConvertedDp;
typedef struct {// 姿态角数据 typedef struct {// 姿态角数据
Rad_T Rad; Rad_T Rad;
Deg_T Deg; Deg_T Deg;
}__attribute__ ((packed))AHRSData_T,*AHRSDp; }__attribute__ ((packed))AHRSData_T,*AHRSDp;
/*主程序状态机*/ /*主程序状态机*/
typedef enum { typedef enum {
APP_STATUS_IDLE, APP_STATUS_IDLE,
APP_STATUS_SLEEP, APP_STATUS_SLEEP,
@@ -55,7 +55,7 @@ typedef enum {
APP_STATUS_WAIT_UPLOAD, APP_STATUS_WAIT_UPLOAD,
}AppStatus_m; }AppStatus_m;
/*数据读取状态机*/ /*数据读取状态机*/
typedef enum { typedef enum {
READDATA_STATUS_IDLE, READDATA_STATUS_IDLE,
READDATA_STATUS_UPDAING, READDATA_STATUS_UPDAING,
@@ -64,8 +64,8 @@ typedef enum {
}ReadDataStatus_m; }ReadDataStatus_m;
typedef struct { typedef struct {
AppStatus_m Status;//状态 AppStatus_m Status;//状态
ReadDataStatus_m RDStatus;//读取数据状态 ReadDataStatus_m RDStatus;//读取数据状态
uint32_t TD1mSDelayCnt; uint32_t TD1mSDelayCnt;
uint8_t FeedDogDlyCnt; uint8_t FeedDogDlyCnt;
@@ -77,30 +77,32 @@ typedef struct {
AHRSData_T AHRSData; AHRSData_T AHRSData;
ConvertedData_T ConvertedData; ConvertedData_T ConvertedData;
uint32_t RepeLoginCount; //24h重复注册计数 uint32_t RepeLoginCount; //24h重复注册计数
uint8_t Login30MinCount; //注册30分定时计数 uint8_t Login30MinCount; //注册30分定时计数
uint8_t Login2Min30SCount; //注册100ms~2分+30s定时计数 uint8_t Login2Min30SCount; //注册100ms~2分+30s定时计数
bool Login_RTC; //注册30分定时器启动标志位 bool Login_RTC; //注册30分定时器启动标志位
bool Login_LPTimer0; //注册100ms~2分+30s定时器启动标志位 bool Login_LPTimer0; //注册100ms~2分+30s定时器启动标志位
bool LoginFlag; //注册标志位 bool LoginFlag; //注册标志位
uint16_t Coll_N; //数据采集时间计数 uint16_t Coll_N; //数据采集时间计数
uint16_t Repor_N; //上报时间计数 uint16_t Repor_N; //上报时间计数
uint16_t ERInterval_N; //紧急上报时间间隔计数 uint16_t ERInterval_N; //紧急上报时间间隔计数
uint8_t ERTime_N; //紧急上报时间计数 uint8_t ERTime_N; //紧急上报时间计数
bool ERFlag; //紧急上报标志位 bool ERFlag; //紧急上报标志位
bool UploadFlag; //上传数据标志位 bool UploadFlag; //上传数据标志位
uint8_t Upload45S10SCount; //上传数据超时计数 uint8_t Upload45S10SCount; //上传数据超时计数
bool Upload_LPTimer0; //上传100~10000ms+45秒定时器启动标志位 bool Upload_LPTimer0; //上传100~10000ms+45秒定时器启动标志位
bool MagRead_EndFlag; bool MagRead_EndFlag;
bool AccRead_EndFlag; bool AccRead_EndFlag;
bool UpdateOk; //数据更新标志位 bool UpdateOk; //数据更新标志位
bool CaliFlag; //标校标志位 bool CaliFlag; //标校标志位
int16_t Nonce; //随机数 uint16_t Nonce; //随机数
bool AttTestMode; //姿态测试模式标志位
uint32_t AttTestCnt; //姿态测试打印计数(ms)
}AppDetect_t; }AppDetect_t;
extern AppDetect_t App; extern AppDetect_t App;
+194 -194
View File
@@ -1,50 +1,50 @@
#include "bsp.h" #include "bsp.h"
#include "Algorithm.h" #include "Algorithm.h"
#include "UartDebug.h" #include "UartDebug.h"
/***************************************************************************************** /*****************************************************************************************
* 函数名称: check_peaks_valleys_ratio * 函数名称: check_peaks_valleys_ratio
* 功能描述: 检查数据的峰值是否大于0,谷值是否小于0(忽略0值) * 功能描述: 检查数据的峰值是否大于0,谷值是否小于0(忽略0值)
* 参 数: data, 数据 * 参 数: data, 数据
length, 数据长度 length, 数据长度
* 返 回 值: 结果返回峰值谷值检查结果结构体 * 返 回 值: 结果返回峰值谷值检查结果结构体
*****************************************************************************************/ *****************************************************************************************/
PeakValleyCheck check_peaks_valleys(int data[], int length) { PeakValleyCheck check_peaks_valleys(int data[], int length) {
PeakValleyCheck result = {true, true, 0, 0}; PeakValleyCheck result = {true, true, 0, 0};
// 如果数据长度小于3,无法形成有效的峰值/谷值 // 如果数据长度小于3,无法形成有效的峰值/谷值
if (length < 3) { if (length < 3) {
return result; return result;
} }
int i = 0; int i = 0;
// 跳过开头的0值 // 跳过开头的0值
while (i < length && data[i] == 0) { while (i < length && data[i] == 0) {
i++; i++;
} }
// 遍历数据点 // 遍历数据点
while (i < length) { while (i < length) {
// 1. 寻找下一个非零点作为起点 // 1. 寻找下一个非零点作为起点
int start = i; int start = i;
while (i < length && data[i] == 0) { while (i < length && data[i] == 0) {
i++; i++;
} }
if (i >= length) break; if (i >= length) break;
// 2. 寻找当前非零段的结束点 // 2. 寻找当前非零段的结束点
int end = i; int end = i;
while (end < length && data[end] != 0) { while (end < length && data[end] != 0) {
end++; end++;
} }
end--; // 指向最后一个非零点 end--; // 指向最后一个非零点
// 3. 在当前非零段中检测峰值和谷值 // 3. 在当前非零段中检测峰值和谷值
for (int j = i; j <= end; j++) { for (int j = i; j <= end; j++) {
// 跳过边界点 // 跳过边界点
if (j == i || j == end) continue; if (j == i || j == end) continue;
// 检查是否为峰值(大于左右相邻的非零点) // 检查是否为峰值(大于左右相邻的非零点)
if (data[j] > data[j-1] && data[j] > data[j+1]) { if (data[j] > data[j-1] && data[j] > data[j+1]) {
result.peak_count++; result.peak_count++;
if (data[j] <= 0) { if (data[j] <= 0) {
@@ -52,7 +52,7 @@ PeakValleyCheck check_peaks_valleys(int data[], int length) {
} }
} }
// 检查是否为谷值(小于左右相邻的非零点) // 检查是否为谷值(小于左右相邻的非零点)
if (data[j] < data[j-1] && data[j] < data[j+1]) { if (data[j] < data[j-1] && data[j] < data[j+1]) {
result.valley_count++; result.valley_count++;
if (data[j] >= 0) { if (data[j] >= 0) {
@@ -61,33 +61,33 @@ PeakValleyCheck check_peaks_valleys(int data[], int length) {
} }
} }
// 移动到下一段 // 移动到下一段
i = end + 1; i = end + 1;
} }
return result; return result;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: analyze_trend * 函数名称: analyze_trend
* 功能描述: 趋势分析函数 * 功能描述: 趋势分析函数
* 参 数: data, 数据 * 参 数: data, 数据
length, 数据长度 length, 数据长度
* 返 回 值: 结果返回趋势分析结构体 * 返 回 值: 结果返回趋势分析结构体
*****************************************************************************************/ *****************************************************************************************/
TrendResult analyze_trend(int data[], int length) { TrendResult analyze_trend(int data[], int length) {
TrendResult result = {0}; TrendResult result = {0};
#if 1 #if 1
// 0. 检查有效数据长度 // 0. 检查有效数据长度
if (length < 2) { if (length < 2) {
DBG_LOG("Data deficient\r\n"); DBG_LOG("Data deficient\r\n");
return result; return result;
} }
// 1. 计算线性回归斜率 // 1. 计算线性回归斜率
double sum_x = 0, sum_y = 0, sum_xy = 0, sum_x2 = 0; double sum_x = 0, sum_y = 0, sum_xy = 0, sum_x2 = 0;
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
double x = i; // 时间序列 (0,1,2,...) double x = i; // 时间序列 (0,1,2,...)
double y = data[i]; double y = data[i];
sum_x += x; sum_x += x;
sum_y += y; sum_y += y;
@@ -98,15 +98,15 @@ TrendResult analyze_trend(int data[], int length) {
double numerator = length * sum_xy - sum_x * sum_y; double numerator = length * sum_xy - sum_x * sum_y;
double denominator = length * sum_x2 - sum_x * sum_x; double denominator = length * sum_x2 - sum_x * sum_x;
// 处理分母为零的情况 // 处理分母为零的情况
if (fabs(denominator) > 1e-10) { if (fabs(denominator) > 1e-10) {
result.slope = numerator / denominator; result.slope = numerator / denominator;
} }
#endif #endif
#if 0 #if 0
// 2. 计算振荡特征(差分符号变化次数) // 2. 计算振荡特征(差分符号变化次数)
int sign_changes = 0; int sign_changes = 0;
int prev_sign = 0; // 0=未初始化, 1=正, -1=负 int prev_sign = 0; // 0=未初始化, 1=正, -1=负
for (int i = 1; i < length; i++) { for (int i = 1; i < length; i++) {
int diff = data[i] - data[i-1]; int diff = data[i] - data[i-1];
@@ -122,66 +122,66 @@ TrendResult analyze_trend(int data[], int length) {
result.sign_changes = sign_changes; result.sign_changes = sign_changes;
#endif #endif
#if 0 #if 0
// 3. 动态计算阈值(基于数据长度) // 3. 动态计算阈值(基于数据长度)
int oscillation_threshold = (int)(0.4 * (length - 1)); // 40%的变化率 int oscillation_threshold = (int)(0.4 * (length - 1)); // 40%的变化率
double slope_threshold = 0.05 * (length / 20.0); // 长度标准化 double slope_threshold = 0.05 * (length / 20.0); // 长度标准化
#endif #endif
#if 0 #if 0
// 4. 趋势判断 // 4. 趋势判断
if (sign_changes >= oscillation_threshold) { if (sign_changes >= oscillation_threshold) {
//DBG_LOG("Oscillating trend\r\n");//振荡趋势 //DBG_LOG("Oscillating trend\r\n");//振荡趋势
result.trend_type = 0; result.trend_type = 0;
} else if (fabs(result.slope) < slope_threshold) { } else if (fabs(result.slope) < slope_threshold) {
//DBG_LOG("Smooth trend\r\n");//平稳趋势 //DBG_LOG("Smooth trend\r\n");//平稳趋势
result.trend_type = 1; result.trend_type = 1;
} else if (result.slope > 0) { } else if (result.slope > 0) {
//DBG_LOG("Up trend\r\n");//上升趋势 //DBG_LOG("Up trend\r\n");//上升趋势
result.trend_type = 2; result.trend_type = 2;
} else { } else {
//DBG_LOG("Down trend\r\n");//下降趋势 //DBG_LOG("Down trend\r\n");//下降趋势
result.trend_type = 3; result.trend_type = 3;
} }
#endif #endif
#if 0 #if 0
// 5. 陡峭判断 // 5. 陡峭判断
double abs_slope = fabs(result.slope); double abs_slope = fabs(result.slope);
if (abs_slope > 0.8) { if (abs_slope > 0.8) {
//DBG_LOG("Steeply");//陡峭 //DBG_LOG("Steeply");//陡峭
result.sign_changes = 0; result.sign_changes = 0;
} else if (abs_slope > 0.3) { } else if (abs_slope > 0.3) {
//DBG_LOG("Obvious");//明显 //DBG_LOG("Obvious");//明显
result.sign_changes = 1; result.sign_changes = 1;
} else if (abs_slope > 0.1) { } else if (abs_slope > 0.1) {
//DBG_LOG("Mild");//温和 //DBG_LOG("Mild");//温和
result.sign_changes = 2; result.sign_changes = 2;
} else { } else {
//DBG_LOG("gentle");//平缓 //DBG_LOG("gentle");//平缓
result.sign_changes = 3; result.sign_changes = 3;
} }
#endif #endif
return result; return result;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: calculateAverage * 函数名称: calculateAverage
* 功能描述: 计算平均值 * 功能描述: 计算平均值
* 参 数: arr, 数据 * 参 数: arr, 数据
size, 数据长度 size, 数据长度
* 返 回 值: 结果返回 long long 防溢出 * 返 回 值: 结果返回 long long 防溢出
*****************************************************************************************/ *****************************************************************************************/
float calculateAverage(int *arr, int size) float calculateAverage(int *arr, int size)
{ {
int sum = 0; int sum = 0;
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
sum += arr[i]; // 累加数组中的每个元素 sum += arr[i]; // 累加数组中的每个元素
} }
return (float)sum / size; // 返回平均值 return (float)sum / size; // 返回平均值
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: slope * 函数名称: slope
* 功能描述: 计算斜率 * 功能描述: 计算斜率
* 参 数: x_data, x轴数据 * 参 数: x_data, x轴数据
y_data, y轴数据 y_data, y轴数据
* 返 回 值: 结果返回 long long 防溢出 * 返 回 值: 结果返回 long long 防溢出
*****************************************************************************************/ *****************************************************************************************/
double slope(int32_t *x_data, int32_t *y_data, int n) double slope(int32_t *x_data, int32_t *y_data, int n)
{ {
@@ -196,30 +196,30 @@ double slope(int32_t *x_data, int32_t *y_data, int n)
return sum_xy / sum_xx; return sum_xy / sum_xx;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: power * 函数名称: power
* 功能描述: 快速幂算法 * 功能描述: 快速幂算法
* 参 数: base, 滤波数据 * 参 数: base, 滤波数据
exponent, 滤波数据长度 exponent, 滤波数据长度
* 返 回 值: 结果返回 long long 防溢出 * 返 回 值: 结果返回 long long 防溢出
*****************************************************************************************/ *****************************************************************************************/
long long power(int base, unsigned int exponent) { long long power(int base, unsigned int exponent) {
long long result = 1; long long result = 1;
while (exponent > 0) { while (exponent > 0) {
if (exponent % 2 == 1) { if (exponent % 2 == 1) {
result *= base; // 指数为奇数时累乘 result *= base; // 指数为奇数时累乘
} }
base *= base; // 底数平方 base *= base; // 底数平方
exponent /= 2; // 指数折半 exponent /= 2; // 指数折半
} }
return result; return result;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: IntFilter_16t * 函数名称: IntFilter_16t
* 功能描述: 16位数据中值滤波函数 * 功能描述: 16位数据中值滤波函数
* 参 数: Data, 滤波数据 * 参 数: Data, 滤波数据
Cnt, 滤波数据长度 Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数 FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的16位数据 * 返 回 值: 滤波后的16位数据
*****************************************************************************************/ *****************************************************************************************/
int IntFilter_16t(int16_t *Data, uint8_t Cnt, uint8_t FilterCnt) int IntFilter_16t(int16_t *Data, uint8_t Cnt, uint8_t FilterCnt)
{ {
@@ -245,12 +245,12 @@ int IntFilter_16t(int16_t *Data, uint8_t Cnt, uint8_t FilterCnt)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: IntFilter_32t * 函数名称: IntFilter_32t
* 功能描述: 32位数据中值滤波函数 * 功能描述: 32位数据中值滤波函数
* 参 数: Data, 滤波数据 * 参 数: Data, 滤波数据
Cnt, 滤波数据长度 Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数 FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据 * 返 回 值: 滤波后的32位数据
*****************************************************************************************/ *****************************************************************************************/
int IntFilter_32t(int32_t *Data, uint8_t Cnt, uint8_t FilterCnt) int IntFilter_32t(int32_t *Data, uint8_t Cnt, uint8_t FilterCnt)
{ {
@@ -275,12 +275,12 @@ int IntFilter_32t(int32_t *Data, uint8_t Cnt, uint8_t FilterCnt)
return (sum / (Cnt - FilterCnt)); return (sum / (Cnt - FilterCnt));
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: IntFilter_u32t * 函数名称: IntFilter_u32t
* 功能描述: 32位无符号位数据中值滤波函数 * 功能描述: 32位无符号位数据中值滤波函数
* 参 数: Data, 滤波数据 * 参 数: Data, 滤波数据
Cnt, 滤波数据长度 Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数 FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据 * 返 回 值: 滤波后的32位数据
*****************************************************************************************/ *****************************************************************************************/
uint32_t IntFilter_u32t(uint32_t *Data, uint8_t Cnt, uint8_t FilterCnt) uint32_t IntFilter_u32t(uint32_t *Data, uint8_t Cnt, uint8_t FilterCnt)
{ {
@@ -305,12 +305,12 @@ uint32_t IntFilter_u32t(uint32_t *Data, uint8_t Cnt, uint8_t FilterCnt)
return (sum / (Cnt - FilterCnt)); return (sum / (Cnt - FilterCnt));
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: IntFilter_Float * 函数名称: IntFilter_Float
* 功能描述: 32位浮点数数据中值滤波函数 * 功能描述: 32位浮点数数据中值滤波函数
* 参 数: Data, 滤波数据 * 参 数: Data, 滤波数据
Cnt, 滤波数据长度 Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数 FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据 * 返 回 值: 滤波后的32位数据
*****************************************************************************************/ *****************************************************************************************/
float IntFilter_Float(float *Data, uint8_t Cnt, uint8_t FilterCnt) float IntFilter_Float(float *Data, uint8_t Cnt, uint8_t FilterCnt)
{ {
@@ -335,11 +335,11 @@ float IntFilter_Float(float *Data, uint8_t Cnt, uint8_t FilterCnt)
return (sum / (Cnt - FilterCnt)); return (sum / (Cnt - FilterCnt));
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: AverageFilter_u32t * 函数名称: AverageFilter_u32t
* 功能描述: 32位数据均值滤波函数,去除了最大值和最小值 * 功能描述: 32位数据均值滤波函数,去除了最大值和最小值
* 参 数: Data, 滤波数据 * 参 数: Data, 滤波数据
Cnt, 滤波数据长度 Cnt, 滤波数据长度
* 返 回 值: 滤波后的32位数据 * 返 回 值: 滤波后的32位数据
*****************************************************************************************/ *****************************************************************************************/
uint32_t AverageFilter_u32t(uint32_t *Data, uint8_t Cnt) uint32_t AverageFilter_u32t(uint32_t *Data, uint8_t Cnt)
{ {
@@ -360,7 +360,7 @@ uint32_t AverageFilter_u32t(uint32_t *Data, uint8_t Cnt)
return sum / 2; return sum / 2;
} }
for (uint8_t i = 0; i < Cnt; i++)//找出最大值 for (uint8_t i = 0; i < Cnt; i++)//找出最大值
{ {
if (Data[i] > max) if (Data[i] > max)
{ {
@@ -368,7 +368,7 @@ uint32_t AverageFilter_u32t(uint32_t *Data, uint8_t Cnt)
} }
} }
for (uint8_t i = 0; i < Cnt; i++)//找出最小值 for (uint8_t i = 0; i < Cnt; i++)//找出最小值
{ {
if (Data[i] < min) if (Data[i] < min)
{ {
@@ -376,7 +376,7 @@ uint32_t AverageFilter_u32t(uint32_t *Data, uint8_t Cnt)
} }
} }
for(int i = 0; i < Cnt; i++){//求和 for(int i = 0; i < Cnt; i++){//求和
sum += Data[i]; sum += Data[i];
} }
@@ -384,11 +384,11 @@ uint32_t AverageFilter_u32t(uint32_t *Data, uint8_t Cnt)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: AverageFilter_32t * 函数名称: AverageFilter_32t
* 功能描述: 32位数据均值滤波函数,去除了最大值和最小值 * 功能描述: 32位数据均值滤波函数,去除了最大值和最小值
* 参 数: Data, 滤波数据 * 参 数: Data, 滤波数据
Cnt, 滤波数据长度 Cnt, 滤波数据长度
* 返 回 值: 滤波后的32位数据 * 返 回 值: 滤波后的32位数据
*****************************************************************************************/ *****************************************************************************************/
int AverageFilter_32t(int32_t *Data, uint8_t Cnt) int AverageFilter_32t(int32_t *Data, uint8_t Cnt)
{ {
@@ -408,7 +408,7 @@ int AverageFilter_32t(int32_t *Data, uint8_t Cnt)
return sum / 2; return sum / 2;
} }
for (uint8_t i = 0; i < Cnt; i++)//找出最大值 for (uint8_t i = 0; i < Cnt; i++)//找出最大值
{ {
if (Data[i] > max) if (Data[i] > max)
{ {
@@ -416,7 +416,7 @@ int AverageFilter_32t(int32_t *Data, uint8_t Cnt)
} }
} }
for (uint8_t i = 0; i < Cnt; i++)//找出最小值 for (uint8_t i = 0; i < Cnt; i++)//找出最小值
{ {
if (Data[i] < min) if (Data[i] < min)
{ {
@@ -424,24 +424,24 @@ int AverageFilter_32t(int32_t *Data, uint8_t Cnt)
} }
} }
for(int i = 0; i < Cnt; i++){//求和 for(int i = 0; i < Cnt; i++){//求和
sum += Data[i]; sum += Data[i];
} }
return (sum - max - min) / (Cnt - 2); return (sum - max - min) / (Cnt - 2);
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: Fitting_Polynomial * 函数名称: Fitting_Polynomial
* 功能描述: 根据数组AD[], Actual[]列出的一组数据,用最小二乘法求它的拟合曲线,默认3阶 * 功能描述: 根据数组AD[], Actual[]列出的一组数据,用最小二乘法求它的拟合曲线,默认3阶
近似解析表达式为y = a3*x^3 + a2*x^2 + a1*x + a0; 近似解析表达式为y = a3*x^3 + a2*x^2 + a1*x + a0;
* 参 数: AD, AD芯片采样值 * 参 数: AD, AD芯片采样值
Actual, 实际标校值 Actual, 实际标校值
Cnt, 拟合数据个数 Cnt, 拟合数据个数
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void Fitting_Polynomial(double *AD, double *Actual, uint8_t Cnt) void Fitting_Polynomial(double *AD, double *Actual, uint8_t Cnt)
{ {
static const uint8_t rank_ = 3;//拟合阶数3 static const uint8_t rank_ = 3;//拟合阶数3
double atemp[2 * (rank_ + 1)], b[rank_ + 1], a[rank_ + 1][rank_ + 1]; double atemp[2 * (rank_ + 1)], b[rank_ + 1], a[rank_ + 1][rank_ + 1];
int i, j, k; int i, j, k;
@@ -460,22 +460,22 @@ void Fitting_Polynomial(double *AD, double *Actual, uint8_t Cnt)
atemp[0] = Cnt; atemp[0] = Cnt;
for(i = 0; i < rank_ + 1; i++){ //构建线性方程组系数矩阵,b[]不变 for(i = 0; i < rank_ + 1; i++){ //构建线性方程组系数矩阵,b[]不变
k = i; k = i;
for(j = 0; j < rank_ + 1; j++) a[i][j] = atemp[k++]; for(j = 0; j < rank_ + 1; j++) a[i][j] = atemp[k++];
} }
//以下为高斯列主元消去法解线性方程组 //以下为高斯列主元消去法解线性方程组
for(k = 0; k < rank_ + 1 - 1; k++){ //n - 1列 for(k = 0; k < rank_ + 1 - 1; k++){ //n - 1列
int column = k; int column = k;
double mainelement = a[k][k]; double mainelement = a[k][k];
for(i = k; i < rank_ + 1; i++) //找主元素 for(i = k; i < rank_ + 1; i++) //找主元素
if(fabs(a[i][k]) > mainelement){ if(fabs(a[i][k]) > mainelement){
mainelement = fabs(a[i][k]); mainelement = fabs(a[i][k]);
column = i; column = i;
} }
for(j = k; j < rank_ + 1; j++){ //交换两行 for(j = k; j < rank_ + 1; j++){ //交换两行
double atemp = a[k][j]; double atemp = a[k][j];
a[k][j] = a[column][j]; a[k][j] = a[column][j];
a[column][j] = atemp; a[column][j] = atemp;
@@ -484,19 +484,19 @@ void Fitting_Polynomial(double *AD, double *Actual, uint8_t Cnt)
b[k] = b[column]; b[k] = b[column];
b[column] = btemp; b[column] = btemp;
for(i = k + 1; i < rank_ + 1; i++){ //消元过程 for(i = k + 1; i < rank_ + 1; i++){ //消元过程
double Mik = a[i][k] / a[k][k]; double Mik = a[i][k] / a[k][k];
for(j = k; j < rank_ + 1; j++) a[i][j] -= Mik * a[k][j]; for(j = k; j < rank_ + 1; j++) a[i][j] -= Mik * a[k][j];
b[i] -= Mik * b[k]; b[i] -= Mik * b[k];
} }
} }
b[rank_ + 1 - 1] /= a[rank_ + 1 - 1][rank_ + 1 - 1]; //回代过程 b[rank_ + 1 - 1] /= a[rank_ + 1 - 1][rank_ + 1 - 1]; //回代过程
for(i = rank_ + 1 - 2; i >= 0; i--){ for(i = rank_ + 1 - 2; i >= 0; i--){
double sum = 0; double sum = 0;
for(j = i + 1; j < rank_ + 1; j++) sum += a[i][j] * b[j]; for(j = i + 1; j < rank_ + 1; j++) sum += a[i][j] * b[j];
b[i] = (b[i] - sum) / a[i][i]; b[i] = (b[i] - sum) / a[i][i];
}//高斯列主元消去法结束 }//高斯列主元消去法结束
DBG_LOG("P(x) = %.16fx^3%+.16fx^2%+.16fx%+.16f\r\n", b[3], b[2], b[1], b[0]); DBG_LOG("P(x) = %.16fx^3%+.16fx^2%+.16fx%+.16f\r\n", b[3], b[2], b[1], b[0]);
@@ -507,46 +507,46 @@ void Fitting_Polynomial(double *AD, double *Actual, uint8_t Cnt)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: get_K * 函数名称: get_K
* 功能描述: 斜率计算 * 功能描述: 斜率计算
* 参 数: count,数据个数 数组行(列)的个数 数组的行列数目相等 * 参 数: count,数据个数 数组行(列)的个数 数组的行列数目相等
dataCol_X[count],数据的列数据 dataCol_X[count],数据的列数据
dataRow_Y[count],数据的行数据 dataRow_Y[count],数据的行数据
* 返 回 值: k 斜率 * 返 回 值: k 斜率
*****************************************************************************************/ *****************************************************************************************/
float get_K(uint8_t count , int32_t *dataCol_X, int32_t *dataRow_Y) float get_K(uint8_t count , int32_t *dataCol_X, int32_t *dataRow_Y)
{ {
float k = 0;//斜率 float k = 0;//斜率
float aveCol_X = 0;//列的平均值x float aveCol_X = 0;//列的平均值x
float aveRow_Y = 0;//行的平均值y float aveRow_Y = 0;//行的平均值y
int32_t sum_XY = 0;//行列的总和xy int32_t sum_XY = 0;//行列的总和xy
int32_t sumRow_Y = 0;//行的总和y int32_t sumRow_Y = 0;//行的总和y
int32_t sumCol_X = 0;//列的总和x int32_t sumCol_X = 0;//列的总和x
int32_t sumCol_X2 = 0;//列的总和x^2 int32_t sumCol_X2 = 0;//列的总和x^2
for(uint16_t i = 0 ; i < count ; i++) for(uint16_t i = 0 ; i < count ; i++)
{ {
sumCol_X += dataCol_X[i];//求列x的总和 sumCol_X += dataCol_X[i];//求列x的总和
sumRow_Y += dataRow_Y[i];//求行y的总和 sumRow_Y += dataRow_Y[i];//求行y的总和
sumCol_X2 += dataCol_X[i] * dataCol_X[i];//求x^2的总和 sumCol_X2 += dataCol_X[i] * dataCol_X[i];//求x^2的总和
sum_XY += (dataCol_X[i] * dataRow_Y[i]);//求xy的总和 sum_XY += (dataCol_X[i] * dataRow_Y[i]);//求xy的总和
} }
aveCol_X = 1.0 * sumCol_X / count;//求平均值 aveCol_X = 1.0 * sumCol_X / count;//求平均值
aveRow_Y = 1.0 * sumRow_Y / count; aveRow_Y = 1.0 * sumRow_Y / count;
k = (sum_XY - aveCol_X * aveRow_Y * count) / //根据公式求斜率 k = (sum_XY - aveCol_X * aveRow_Y * count) / //根据公式求斜率
(sumCol_X2 - aveCol_X * aveCol_X * count); (sumCol_X2 - aveCol_X * aveCol_X * count);
return k; return k;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: TrendAnalyse * 函数名称: TrendAnalyse
* 功能描述: 判断数组中的值的总体趋势 * 功能描述: 判断数组中的值的总体趋势
* 参 数: Data, * 参 数: Data,
Cnt, Cnt,
VPT, VPT,
* 返 回 值: true或false * 返 回 值: true或false
*****************************************************************************************/ *****************************************************************************************/
int8_t TrendAnalyse(int32_t *Data, uint8_t Cnt, int32_t VPT) int8_t TrendAnalyse(int32_t *Data, uint8_t Cnt, int32_t VPT)
{ {
@@ -571,26 +571,26 @@ int8_t TrendAnalyse(int32_t *Data, uint8_t Cnt, int32_t VPT)
} }
} }
if(zero > (Cnt-(Cnt / 5))) if(zero > (Cnt-(Cnt / 5)))
Trend = 0;//振荡趋势 Trend = 0;//振荡趋势
else if(plus > (Cnt-(Cnt/ 5))) else if(plus > (Cnt-(Cnt/ 5)))
Trend = 1;//上升趋势 Trend = 1;//上升趋势
else if(minus > (Cnt-(Cnt/ 5))) else if(minus > (Cnt-(Cnt/ 5)))
Trend = -1;//下降趋势 Trend = -1;//下降趋势
return Trend;//总趋势 return Trend;//总趋势
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: Waveform_Up * 函数名称: Waveform_Up
* 功能描述: 找出一段波形的波峰值 * 功能描述: 找出一段波形的波峰值
dCnt, 波形数据长度 dCnt, 波形数据长度
pCnt, 要查找波峰数 pCnt, 要查找波峰数
vlue, 返回的波峰值 vlue, 返回的波峰值
* 返 回 值: true或false * 返 回 值: true或false
*****************************************************************************************/ *****************************************************************************************/
void Waveform_Up(int32_t *Data, uint8_t dCnt, uint8_t pCnt, int32_t *vlue) void Waveform_Up(int32_t *Data, uint8_t dCnt, uint8_t pCnt, int32_t *vlue)
{ {
uint8_t peak[pCnt]; uint8_t peak[pCnt];
for(uint8_t i = 0, j = 0; i < dCnt; i++)//找出峰值地址 for(uint8_t i = 0, j = 0; i < dCnt; i++)//找出峰值地址
{ {
if(Data[i] < Data[i + 1] && Data[i + 1] > Data[i + 2]) if(Data[i] < Data[i + 1] && Data[i + 1] > Data[i + 2])
{ {
@@ -605,17 +605,17 @@ void Waveform_Up(int32_t *Data, uint8_t dCnt, uint8_t pCnt, int32_t *vlue)
} }
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: Waveform_Down * 函数名称: Waveform_Down
* 功能描述: 找出一段波形的波谷值 * 功能描述: 找出一段波形的波谷值
dCnt, 波形数据长度 dCnt, 波形数据长度
pCnt, 要查找波谷数 pCnt, 要查找波谷数
vlue, 返回的波谷值 vlue, 返回的波谷值
* 返 回 值: true或false * 返 回 值: true或false
*****************************************************************************************/ *****************************************************************************************/
void Waveform_Down(int32_t *Data, uint8_t dCnt, uint8_t pCnt, int32_t *vlue) void Waveform_Down(int32_t *Data, uint8_t dCnt, uint8_t pCnt, int32_t *vlue)
{ {
uint8_t peak[pCnt]; uint8_t peak[pCnt];
for(uint8_t i = 0, j = 0; i < dCnt; i++)//找出峰值地址 for(uint8_t i = 0, j = 0; i < dCnt; i++)//找出峰值地址
{ {
if(Data[i] > Data[i + 1] && Data[i + 1] < Data[i + 2]) if(Data[i] > Data[i + 1] && Data[i + 1] < Data[i + 2])
{ {
@@ -630,12 +630,12 @@ void Waveform_Down(int32_t *Data, uint8_t dCnt, uint8_t pCnt, int32_t *vlue)
} }
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: count_most_greater * 函数名称: count_most_greater
* 功能描述: 判断数组中的值是否大部分大于 target * 功能描述: 判断数组中的值是否大部分大于 target
* 参 数: arr, * 参 数: arr,
size, size,
target, target,
* 返 回 值: true或false * 返 回 值: true或false
*****************************************************************************************/ *****************************************************************************************/
bool count_most_greater(int32_t *arr, uint8_t size, int32_t target) bool count_most_greater(int32_t *arr, uint8_t size, int32_t target)
{ {
@@ -649,12 +649,12 @@ bool count_most_greater(int32_t *arr, uint8_t size, int32_t target)
return true; return true;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: count_greater * 函数名称: count_greater
* 功能描述: 判断数组中的值是否全部大于 target * 功能描述: 判断数组中的值是否全部大于 target
* 参 数: arr, * 参 数: arr,
size, size,
target, target,
* 返 回 值: true或false * 返 回 值: true或false
*****************************************************************************************/ *****************************************************************************************/
bool count_greater(int32_t *arr, uint8_t size, int32_t target) bool count_greater(int32_t *arr, uint8_t size, int32_t target)
{ {
@@ -665,12 +665,12 @@ bool count_greater(int32_t *arr, uint8_t size, int32_t target)
return true; return true;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: count_smaller * 函数名称: count_smaller
* 功能描述: 判断数组中的值是否全部小于 target * 功能描述: 判断数组中的值是否全部小于 target
* 参 数: arr, * 参 数: arr,
size, size,
target, target,
* 返 回 值: true或false * 返 回 值: true或false
*****************************************************************************************/ *****************************************************************************************/
bool count_smaller(int32_t *arr, uint8_t size, int32_t target) bool count_smaller(int32_t *arr, uint8_t size, int32_t target)
{ {
@@ -682,12 +682,12 @@ bool count_smaller(int32_t *arr, uint8_t size, int32_t target)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: CRC_Modbus * 函数名称: CRC_Modbus
* 功能描述: CRC16计算函数 * 功能描述: CRC16计算函数
* 参 数: wBase, 多项式 * 参 数: wBase, 多项式
Para,校验数据入口 Para,校验数据入口
Data, 校验数据长度入口 Data, 校验数据长度入口
* 返 回 值: crc16校验值 * 返 回 值: crc16校验值
*****************************************************************************************/ *****************************************************************************************/
uint16_t CRC_Modbus(uint16_t wBase, uint8_t *para, uint16_t length) uint16_t CRC_Modbus(uint16_t wBase, uint8_t *para, uint16_t length)
{ {
@@ -710,18 +710,18 @@ uint16_t CRC_Modbus(uint16_t wBase, uint8_t *para, uint16_t length)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: CRC_Sum * 函数名称: CRC_Sum
* 功能描述: 从第二个字节开始,求和取反 * 功能描述: 从第二个字节开始,求和取反
* 参 数: _pbuff,校验数据入口 * 参 数: _pbuff,校验数据入口
_cmdLen,校验数据长度入口 _cmdLen,校验数据长度入口
* 返 回 值: cmd_sum,校验值(一个字节) * 返 回 值: cmd_sum,校验值(一个字节)
*****************************************************************************************/ *****************************************************************************************/
uint8_t CRC_Sum(uint8_t *_pbuff, uint16_t _cmdLen) uint8_t CRC_Sum(uint8_t *_pbuff, uint16_t _cmdLen)
{ {
uint8_t cmd_sum=0; uint8_t cmd_sum=0;
uint16_t i; uint16_t i;
for(i=1;i<_cmdLen;i++)//从1开始,跳过第一个字节 for(i=1;i<_cmdLen;i++)//从1开始,跳过第一个字节
{ {
cmd_sum += _pbuff[i]; cmd_sum += _pbuff[i];
} }
@@ -730,12 +730,12 @@ uint8_t CRC_Sum(uint8_t *_pbuff, uint16_t _cmdLen)
return cmd_sum; return cmd_sum;
} }
/** /**
* @brief 检查缓冲区是否全部等于指定字节值 * @brief 检查缓冲区是否全部等于指定字节值
* @param data : 待检查的数据指针 * @param data : 待检查的数据指针
* @param len : 数据长度(字节数) * @param len : 数据长度(字节数)
* @param val : 期望的字节值 (0x00 ~ 0xFF) * @param val : 期望的字节值 (0x00 ~ 0xFF)
* @return true : 全部等于 val * @return true : 全部等于 val
* false: 存在不等于 val 的字节 * false: 存在不等于 val 的字节
*/ */
bool is_all_byte(const uint8_t *data, size_t len, uint8_t val) bool is_all_byte(const uint8_t *data, size_t len, uint8_t val)
{ {
@@ -747,12 +747,12 @@ bool is_all_byte(const uint8_t *data, size_t len, uint8_t val)
return true; return true;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: HexToAscii * 函数名称: HexToAscii
* 功能描述: 16进制转ASCII码 * 功能描述: 16进制转ASCII码
* 参 数: HexData16进制数组 * 参 数: HexData16进制数组
ASCDataASCII码 ASCDataASCII码
sLen,数据长度 sLen,数据长度
* 返 回 值: true或false * 返 回 值: true或false
*****************************************************************************************/ *****************************************************************************************/
void HexToAscii(uint8_t *HexData, char *ASCData, uint8_t sLen) void HexToAscii(uint8_t *HexData, char *ASCData, uint8_t sLen)
{ {
+276 -207
View File
File diff suppressed because it is too large Load Diff
+9 -9
View File
@@ -1,13 +1,13 @@
#include "Update.h" #include "Update.h"
#include "UartDebug.h" #include "UartDebug.h"
#include "main.h" #include "main.h"
#include "bsp.h" #include "bsp.h"
/***************************************************************************************** /*****************************************************************************************
* 函数名称: Update * 函数名称: Update
* 功能描述: 固件升级,此函数在解析到升级指令是调用 * 功能描述: 固件升级,此函数在解析到升级指令是调用
* 参 数: PayLoad 协议负载,需去除帧头等信息,只传负载数据 * 参 数: PayLoad 协议负载,需去除帧头等信息,只传负载数据
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void Update(uint8_t *PayLoad) void Update(uint8_t *PayLoad)
{ {
@@ -32,10 +32,10 @@ void Update(uint8_t *PayLoad)
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: UpdateInit * 函数名称: UpdateInit
* 功能描述: 升级参数初始化,需要在程序启动,外设初试完后调用 * 功能描述: 升级参数初始化,需要在程序启动,外设初试完后调用
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void UpdateInit(void) void UpdateInit(void)
{ {
+218 -216
View File
@@ -32,51 +32,51 @@ extern void LORA_RxCallBack(uint8_t *rBuff, uint8_t rlen);
static __IO uint32_t SysTickCnt = 0; static __IO uint32_t SysTickCnt = 0;
static volatile uint32_t u32AdcRestult; static volatile uint32_t u32AdcRestult;
static void SystemClkDivInit(void)//系统时钟分频设置 static void SystemClkDivInit(void)//系统时钟分频设置
{ {
//时钟分频设置 //时钟分频设置
Sysctrl_SetHCLKDiv(SysctrlHclkDiv1); Sysctrl_SetHCLKDiv(SysctrlHclkDiv1);
Sysctrl_SetPCLKDiv(SysctrlPclkDiv1); Sysctrl_SetPCLKDiv(SysctrlPclkDiv1);
} }
static void SystemClkInit(en_sysctrl_rch_freq_t enRchFreq)//时钟初始化 static void SystemClkInit(en_sysctrl_rch_freq_t enRchFreq)//时钟初始化
{ {
///< RCH时钟不同频率的切换,需要先将时钟切换到RCL ///< RCH时钟不同频率的切换,需要先将时钟切换到RCL
Sysctrl_SetRCLTrim(SysctrlRclFreq38400); Sysctrl_SetRCLTrim(SysctrlRclFreq38400);
Sysctrl_SetRCLStableTime(SysctrlRclStableCycle64); Sysctrl_SetRCLStableTime(SysctrlRclStableCycle64);
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE); Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
/*内部高速时钟初始化 24MHZ*/ /*内部高速时钟初始化 24MHZ*/
/*Sysctrl_SetRCHTrim(enRchFreq); /*Sysctrl_SetRCHTrim(enRchFreq);
Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE); Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
//< HCLK不超过24M:此处设置FLASH读等待周期为0 cycle //< HCLK不超过24M:此处设置FLASH读等待周期为0 cycle
Flash_WaitCycle(FlashWaitCycle0); Flash_WaitCycle(FlashWaitCycle0);
Sysctrl_SysClkSwitch(SysctrlClkRCH);//系统时钟源选择 Sysctrl_SysClkSwitch(SysctrlClkRCH);//系统时钟源选择
*/ */
/*内部高速时钟初始化 48MHZ*/ /*内部高速时钟初始化 48MHZ*/
stc_sysctrl_pll_cfg_t stcPLLCfg; stc_sysctrl_pll_cfg_t stcPLLCfg;
///< 加载目标频率的RCH的TRIM值 ///< 加载目标频率的RCH的TRIM值
Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz); Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);
///< 使能RCH ///< 使能RCH
Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE); Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
stcPLLCfg.enInFreq = SysctrlPllInFreq4_6MHz; //RCH 4MHz stcPLLCfg.enInFreq = SysctrlPllInFreq4_6MHz; //RCH 4MHz
stcPLLCfg.enOutFreq = SysctrlPllOutFreq36_48MHz; //PLL 输出 stcPLLCfg.enOutFreq = SysctrlPllOutFreq36_48MHz; //PLL 输出
stcPLLCfg.enPllClkSrc = SysctrlPllRch; //输入时钟源选择RCH stcPLLCfg.enPllClkSrc = SysctrlPllRch; //输入时钟源选择RCH
stcPLLCfg.enPllMul = SysctrlPllMul12; //4MHz x 12 = 48MHz stcPLLCfg.enPllMul = SysctrlPllMul12; //4MHz x 12 = 48MHz
Sysctrl_SetPLLFreq(&stcPLLCfg); Sysctrl_SetPLLFreq(&stcPLLCfg);
///< 当使用的时钟源HCLK大于24M:设置FLASH 读等待周期为1 cycle(默认值也为1 cycle) ///< 当使用的时钟源HCLK大于24M:设置FLASH 读等待周期为1 cycle(默认值也为1 cycle)
Flash_WaitCycle(FlashWaitCycle1); Flash_WaitCycle(FlashWaitCycle1);
///< 使能PLL ///< 使能PLL
Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE); Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE);
///< 时钟切换到PLL ///< 时钟切换到PLL
Sysctrl_SysClkSwitch(SysctrlClkPLL); Sysctrl_SysClkSwitch(SysctrlClkPLL);
/*外部低速晶振初始化 32.768KHz*/ /*外部低速晶振初始化 32.768KHz*/
/* Sysctrl_XTLDriverCfg(SysctrlXtlAmp3, SysctrlXtalDriver3); /* Sysctrl_XTLDriverCfg(SysctrlXtlAmp3, SysctrlXtalDriver3);
Sysctrl_SetXTLStableTime(SysctrlXtlStableCycle16384); Sysctrl_SetXTLStableTime(SysctrlXtlStableCycle16384);
Sysctrl_ClkSourceEnable(SysctrlClkXTL, TRUE); Sysctrl_ClkSourceEnable(SysctrlClkXTL, TRUE);
@@ -84,9 +84,9 @@ static void SystemClkInit(en_sysctrl_rch_freq_t enRchFreq)//ʱ
} }
static void SystemRCLInit(void) static void SystemRCLInit(void)
{ {
Sysctrl_SetRCLTrim(SysctrlRclFreq38400); ///< 配置RCL时钟为38400kHz Sysctrl_SetRCLTrim(SysctrlRclFreq38400); ///< 配置RCL时钟为38400kHz
Sysctrl_SetRCLStableTime(SysctrlRclStableCycle256); Sysctrl_SetRCLStableTime(SysctrlRclStableCycle256);
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE); ///< 使能RCL时钟 Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE); ///< 使能RCL时钟
} }
void Uart0Init(uint32_t Baud) void Uart0Init(uint32_t Baud)
@@ -111,21 +111,21 @@ void Uart0Init(uint32_t Baud)
DDL_ZERO_STRUCT(stcCfg); DDL_ZERO_STRUCT(stcCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);
///<UART 初始化 ///<UART 初始化
stcCfg.enStopBit = UartMsk1bit; ///<1停止位 stcCfg.enStopBit = UartMsk1bit; ///<1停止位
stcCfg.enMmdorCk = UartMskEven; ///<偶校验 // stcCfg.enMmdorCk = UartMskEven; ///<偶校验
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<PCLK获取 stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<PCLK获取
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<采样分频 stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<采样分频
stcCfg.stcBaud.u32Baud = Baud; ///<波特率 stcCfg.stcBaud.u32Baud = Baud; ///<波特率
stcCfg.enRunMode = UartMskMode1; ///<工作模式 stcCfg.enRunMode = UartMskMode1; ///<工作模式
Uart_Init(M0P_UART0, &stcCfg); Uart_Init(M0P_UART0, &stcCfg);
///<UART 中断使能 ///<UART 中断使能
Uart_ClrStatus(M0P_UART0, UartRC); ///<清接收中断请求 Uart_ClrStatus(M0P_UART0, UartRC); ///<清接收中断请求
Uart_ClrStatus(M0P_UART0, UartTC); ///<清发送中断请求 Uart_ClrStatus(M0P_UART0, UartTC); ///<清发送中断请求
//Uart_EnableIrq(M0P_UART1,UartTxIrq); ///<使能发送中断 //Uart_EnableIrq(M0P_UART1,UartTxIrq); ///<使能发送中断
Uart_EnableIrq(M0P_UART0, UartRxIrq); ///<使能接收中断 Uart_EnableIrq(M0P_UART0, UartRxIrq); ///<使能接收中断
EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE); ///<系统中断使能 EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE); ///<系统中断使能
} }
static void Uart1Init(void) static void Uart1Init(void)
@@ -150,21 +150,21 @@ static void Uart1Init(void)
DDL_ZERO_STRUCT(stcCfg); DDL_ZERO_STRUCT(stcCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);
///<UART 初始化 ///<UART 初始化
stcCfg.enStopBit = UartMsk1bit; ///<1停止位 stcCfg.enStopBit = UartMsk1bit; ///<1停止位
//stcCfg.enMmdorCk = UartMskEven; ///<偶校验 //stcCfg.enMmdorCk = UartMskEven; ///<偶校验
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<PCLK获取 stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<PCLK获取
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<采样分频 stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<采样分频
stcCfg.stcBaud.u32Baud = 115200; ///<波特率 stcCfg.stcBaud.u32Baud = 115200; ///<波特率
stcCfg.enRunMode = UartMskMode1; ///<工作模式 stcCfg.enRunMode = UartMskMode1; ///<工作模式
Uart_Init(M0P_UART1, &stcCfg); Uart_Init(M0P_UART1, &stcCfg);
///<UART 中断使能 ///<UART 中断使能
Uart_ClrStatus(M0P_UART1, UartRC); ///<清接收中断请求 Uart_ClrStatus(M0P_UART1, UartRC); ///<清接收中断请求
Uart_ClrStatus(M0P_UART1, UartTC); ///<清发送中断请求 Uart_ClrStatus(M0P_UART1, UartTC); ///<清发送中断请求
//Uart_EnableIrq(M0P_UART1,UartTxIrq); ///<使能发送中断 //Uart_EnableIrq(M0P_UART1,UartTxIrq); ///<使能发送中断
Uart_EnableIrq(M0P_UART1, UartRxIrq); ///<使能接收中断 Uart_EnableIrq(M0P_UART1, UartRxIrq); ///<使能接收中断
EnableNvic(UART1_3_IRQn, IrqLevel3, TRUE); ///<系统中断使能 EnableNvic(UART1_3_IRQn, IrqLevel3, TRUE); ///<系统中断使能
} }
void LpUart0Init(uint32_t Baud) void LpUart0Init(uint32_t Baud)
{ {
@@ -177,42 +177,42 @@ void LpUart0Init(uint32_t Baud)
///<TX ///<TX
stcGpioCfg.enDir = GpioDirOut; stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(LPUart0_TxPortx,LPUART0_TxPinx,&stcGpioCfg); Gpio_Init(LPUart0_TxPortx,LPUART0_TxPinx,&stcGpioCfg);
Gpio_SetAfMode(LPUart0_TxPortx,LPUART0_TxPinx,GpioAf4); //配置PB10为LPUART0_TX Gpio_SetAfMode(LPUart0_TxPortx,LPUART0_TxPinx,GpioAf4); //配置PB10为LPUART0_TX
//<RX //<RX
stcGpioCfg.enDir = GpioDirIn; stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(LPUart0_RxPortx,LPUART0_RxPinx,&stcGpioCfg); Gpio_Init(LPUart0_RxPortx,LPUART0_RxPinx,&stcGpioCfg);
Gpio_SetAfMode(LPUart0_RxPortx,LPUART0_RxPinx,GpioAf3); //配置PB11为LPUART0_RX Gpio_SetAfMode(LPUart0_RxPortx,LPUART0_RxPinx,GpioAf3); //配置PB11为LPUART0_RX
DDL_ZERO_STRUCT(stcCfg); DDL_ZERO_STRUCT(stcCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart0,TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart0,TRUE);
///<LPUART 初始化 ///<LPUART 初始化
stcCfg.enStopBit = LPUart1bit; ///<1停止位 stcCfg.enStopBit = LPUart1bit; ///<1停止位
//stcCfg.enMmdorCk = LPUartEven; ///<偶校验 //stcCfg.enMmdorCk = LPUartEven; ///<偶校验
stcCfg.stcBaud.enSclkSel = LPUartMskRcl; ///<传输时钟源 stcCfg.stcBaud.enSclkSel = LPUartMskRcl; ///<传输时钟源
stcCfg.stcBaud.u32Sclk = 38400; ///<PCLK获取 stcCfg.stcBaud.u32Sclk = 38400; ///<PCLK获取
stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div; ///<采样分频 stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div; ///<采样分频
stcCfg.stcBaud.u32Baud = Baud; ///<波特率 stcCfg.stcBaud.u32Baud = Baud; ///<波特率
stcCfg.enRunMode = LPUartMskMode1; ///<工作模式 stcCfg.enRunMode = LPUartMskMode1; ///<工作模式
LPUart_Init(M0P_LPUART0, &stcCfg); LPUart_Init(M0P_LPUART0, &stcCfg);
///<LPUART 中断使能 ///<LPUART 中断使能
LPUart_ClrStatus(M0P_LPUART0,LPUartRC); ///<清接收中断请求 LPUart_ClrStatus(M0P_LPUART0,LPUartRC); ///<清接收中断请求
LPUart_ClrStatus(M0P_LPUART0,LPUartTC); ///<清发送中断请求 LPUart_ClrStatus(M0P_LPUART0,LPUartTC); ///<清发送中断请求
//LPUart_EnableIrq(M0P_LPUART0,LPUartTxIrq); ///<使能发送中断 //LPUart_EnableIrq(M0P_LPUART0,LPUartTxIrq); ///<使能发送中断
LPUart_EnableIrq(M0P_LPUART0,LPUartRxIrq); ///<使能接收中断 LPUart_EnableIrq(M0P_LPUART0,LPUartRxIrq); ///<使能接收中断
EnableNvic(LPUART0_IRQn,IrqLevel3,TRUE); ///<系统中断使能 EnableNvic(LPUART0_IRQn,IrqLevel3,TRUE); ///<系统中断使能
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: AdcInit * 函数名称: AdcInit
* 功能描述: ADC初始化 * 功能描述: ADC初始化
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static void AdcInit(void) static void AdcInit(void)
{ {
///< 开启ADC/BGR GPIO外设时钟 ///< 开启ADC/BGR GPIO外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
Gpio_SetAnalogMode(VBAT_PORTx, VBAT_PINx); //PA04 (AIN4) Gpio_SetAnalogMode(VBAT_PORTx, VBAT_PINx); //PA04 (AIN4)
@@ -220,29 +220,29 @@ static void AdcInit(void)
DDL_ZERO_STRUCT(stcAdcCfg); DDL_ZERO_STRUCT(stcAdcCfg);
///< 开启ADC/BGR外设时钟 ///< 开启ADC/BGR外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
Bgr_BgrEnable(); ///< 开启BGR Bgr_BgrEnable(); ///< 开启BGR
///< ADC 初始化配置 ///< ADC 初始化配置
stcAdcCfg.enAdcMode = AdcSglMode; ///<采样模式-单次 stcAdcCfg.enAdcMode = AdcSglMode; ///<采样模式-单次
stcAdcCfg.enAdcClkDiv = AdcMskClkDiv8; ///<采样分频-1 stcAdcCfg.enAdcClkDiv = AdcMskClkDiv8; ///<采样分频-1
stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk; ///<采样周期数-12 stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk; ///<采样周期数-12
stcAdcCfg.enAdcRefVolSel = AdcMskRefVolSelAVDD; ///<参考电压选择-AVDD stcAdcCfg.enAdcRefVolSel = AdcMskRefVolSelAVDD; ///<参考电压选择-AVDD
stcAdcCfg.enAdcOpBuf = AdcMskBufEnable; ///<OP BUF配置-关 stcAdcCfg.enAdcOpBuf = AdcMskBufEnable; ///<OP BUF配置-关
stcAdcCfg.enInRef = AdcMskInRefDisable; ///<内部参考电压使能-关 stcAdcCfg.enInRef = AdcMskInRefDisable; ///<内部参考电压使能-关
stcAdcCfg.enAdcAlign = AdcAlignRight; ///<转换结果对齐方式-右 stcAdcCfg.enAdcAlign = AdcAlignRight; ///<转换结果对齐方式-右
Adc_Init(&stcAdcCfg); Adc_Init(&stcAdcCfg);
Adc_CfgSglChannel(VBAT_ADC_PORTx); // 配置单次采样通道 Adc_CfgSglChannel(VBAT_ADC_PORTx); // 配置单次采样通道
Adc_SGL_Always_Start(); // 启动单次一直采样 Adc_SGL_Always_Start(); // 启动单次一直采样
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: Battery_Level_Percent_Table * 函数名称: Battery_Level_Percent_Table
* 功能描述: 电池电量百分比转换 * 功能描述: 电池电量百分比转换
* 参 数: voltage,采集到的电压 * 参 数: voltage,采集到的电压
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
static float Battery_Level_Percent_Table[37] = {9000, 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900, static float Battery_Level_Percent_Table[37] = {9000, 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900,
10000, 10100, 10200, 10300, 10400, 10500, 10600, 10700, 10800, 10900, 10000, 10100, 10200, 10300, 10400, 10500, 10600, 10700, 10800, 10900,
@@ -263,32 +263,32 @@ static int Percentage(float voltage)
return 100; return 100;
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: ADC_IRQHandler * 函数名称: ADC_IRQHandler
* 功能描述: ADC采集中断,放在主循环内一直循环采集 * 功能描述: ADC采集中断,放在主循环内一直循环采集
* 参 数: 无 * 参 数: 无
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
float VBAT_12V;//< ADC采集到的电压 float VBAT_12V;//< ADC采集到的电压
uint8_t VBAT_Percentage;//电池电压百分比 uint8_t VBAT_Percentage;//电池电压百分比
void ADCLoopHandler(void) void ADCLoopHandler(void)
{ {
if(Adc_GetIrqStatus(AdcMskIrqSgl))//ADC中断状态获取 if(Adc_GetIrqStatus(AdcMskIrqSgl))//ADC中断状态获取
{ {
VBAT_12V = (Adc_GetSglResult() * VBAT_CAL);//< 获取实际电压 VBAT_12V = (Adc_GetSglResult() * VBAT_CAL);//< 获取实际电压
VBAT_Percentage = Percentage(VBAT_12V);//获取百分比 VBAT_Percentage = Percentage(VBAT_12V);//获取百分比
//DBG_LOG("VBAT_Percentage:%d\n",VBAT_Percentage); //DBG_LOG("VBAT_Percentage:%d\n",VBAT_Percentage);
Adc_ClrIrqStatus(AdcMskIrqSgl);//清除ADC中断状态 Adc_ClrIrqStatus(AdcMskIrqSgl);//清除ADC中断状态
} }
} }
void RTCInit(uint8_t sec) void RTCInit(uint8_t sec)
{ {
stc_rtc_initstruct_t RtcInitStruct; stc_rtc_initstruct_t RtcInitStruct;
Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc,TRUE); //RTC模块时钟打开 Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc,TRUE); //RTC模块时钟打开
RtcInitStruct.rtcAmpm = RtcPm; //24小时制 RtcInitStruct.rtcAmpm = RtcPm; //24小时制
RtcInitStruct.rtcClksrc = RtcClkRcl; //外部低速时钟 RtcInitStruct.rtcClksrc = RtcClkRcl; //外部低速时钟
RtcInitStruct.rtcPrdsel.rtcPrdsel = RtcPrdx; //周期中断类型PRDX RtcInitStruct.rtcPrdsel.rtcPrdsel = RtcPrdx; //周期中断类型PRDX
RtcInitStruct.rtcPrdsel.rtcPrdx = sec * 2 - 1; //周期中断时间间隔 30秒 RtcInitStruct.rtcPrdsel.rtcPrdx = sec * 2 - 1; //周期中断时间间隔 30秒
Rtc_ReadDateTime(&RtcInitStruct.rtcTime); Rtc_ReadDateTime(&RtcInitStruct.rtcTime);
if(RtcInitStruct.rtcTime.u8Year < 0x23 || RtcInitStruct.rtcTime.u8Year > 0x99 || RtcInitStruct.rtcTime.u8Month > 0x12) { if(RtcInitStruct.rtcTime.u8Year < 0x23 || RtcInitStruct.rtcTime.u8Year > 0x99 || RtcInitStruct.rtcTime.u8Month > 0x12) {
@@ -301,18 +301,18 @@ void RTCInit(uint8_t sec)
RtcInitStruct.rtcTime.u8Year = 0x23; RtcInitStruct.rtcTime.u8Year = 0x23;
} }
RtcInitStruct.rtcCompen = RtcCompenEnable; RtcInitStruct.rtcCompen = RtcCompenEnable;
RtcInitStruct.rtcCompValue = 0; //补偿值 根据实际情况进行补偿 RtcInitStruct.rtcCompValue = 0; //补偿值 根据实际情况进行补偿
Rtc_Init(&RtcInitStruct); Rtc_Init(&RtcInitStruct);
Rtc_AlmIeCmd(TRUE); //使能闹钟中断 Rtc_AlmIeCmd(TRUE); //使能闹钟中断
EnableNvic(RTC_IRQn, IrqLevel3, TRUE); //使能RTC中断向量 EnableNvic(RTC_IRQn, IrqLevel3, TRUE); //使能RTC中断向量
Rtc_Cmd(TRUE); //使能RTC开始计数 Rtc_Cmd(TRUE); //使能RTC开始计数
Rtc_StartWait(); //启动RTC计数,如果要立即切换到低功耗,需要执行此函数 Rtc_StartWait(); //启动RTC计数,如果要立即切换到低功耗,需要执行此函数
} }
/****************************************************************************** /******************************************************************************
* 函数名称: LPTimer0Init * 函数名称: LPTimer0Init
* 功能描述: 低功耗定时器0初始化 * 功能描述: 低功耗定时器0初始化
* 参 数: sTime 定时中断秒时间 * 参 数: sTime 定时中断秒时间
* 返 回 值: 无 * 返 回 值: 无
******************************************************************************/ ******************************************************************************/
void LPTimer0Init(uint16_t _100ms) void LPTimer0Init(uint16_t _100ms)
{ {
@@ -321,7 +321,7 @@ void LPTimer0Init(uint16_t _100ms)
stc_lptim_cfg_t stcLptCfg; stc_lptim_cfg_t stcLptCfg;
DDL_ZERO_STRUCT(stcLptCfg); DDL_ZERO_STRUCT(stcLptCfg);
///< 使能LPTIM0 外设时钟 ///< 使能LPTIM0 外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralLpTim0, TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralLpTim0, TRUE);
stcLptCfg.enPrs = LptimPrsDiv256; stcLptCfg.enPrs = LptimPrsDiv256;
@@ -329,13 +329,13 @@ void LPTimer0Init(uint16_t _100ms)
stcLptCfg.enGatep = LptimGatePLow; stcLptCfg.enGatep = LptimGatePLow;
stcLptCfg.enTcksel = LptimRcl; stcLptCfg.enTcksel = LptimRcl;
stcLptCfg.enTogen = LptimTogEnLow; stcLptCfg.enTogen = LptimTogEnLow;
stcLptCfg.enCt = LptimTimerFun; //警示器功能 stcLptCfg.enCt = LptimTimerFun; //警示器功能
stcLptCfg.enMd = LptimMode1; //工作模式为模式1:无自动重装载16位计数器/定时器 stcLptCfg.enMd = LptimMode1; //工作模式为模式1:无自动重装载16位计数器/定时器
stcLptCfg.u16Arr = 0x10000 - (_100ms * 13); //预装载寄存器值 stcLptCfg.u16Arr = 0x10000 - (_100ms * 13); //预装载寄存器值
Lptim_Init(M0P_LPTIMER0, &stcLptCfg); Lptim_Init(M0P_LPTIMER0, &stcLptCfg);
Lptim_ClrItStatus(M0P_LPTIMER0); //清除中断标志位 Lptim_ClrItStatus(M0P_LPTIMER0); //清除中断标志位
Lptim_ConfIt(M0P_LPTIMER0, TRUE); //允许LPTIMER中断 Lptim_ConfIt(M0P_LPTIMER0, TRUE); //允许LPTIMER中断
EnableNvic(LPTIM_0_1_IRQn, IrqLevel3, TRUE); EnableNvic(LPTIM_0_1_IRQn, IrqLevel3, TRUE);
Lptim_Cmd(M0P_LPTIMER0, TRUE); Lptim_Cmd(M0P_LPTIMER0, TRUE);
@@ -356,7 +356,7 @@ static void GPIOInit(void)
DDL_ZERO_STRUCT(GpioInitStruct); DDL_ZERO_STRUCT(GpioInitStruct);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
//未使用或引出的脚设为输入上拉 //未使用或引出的脚设为输入上拉
GpioInitStruct.enDir = GpioDirIn; GpioInitStruct.enDir = GpioDirIn;
GpioInitStruct.enPu = GpioPuEnable; GpioInitStruct.enPu = GpioPuEnable;
@@ -376,30 +376,32 @@ static void GPIOInit(void)
Gpio_Init(GpioPortF, GpioPin6, &GpioInitStruct); Gpio_Init(GpioPortF, GpioPin6, &GpioInitStruct);
//end //end
/********************************** GPIO输出 ****************************************/ /********************************** GPIO输出 ****************************************/
GpioInitStruct.enDir = GpioDirOut; ///< 端口方向配置->输出 GpioInitStruct.enDir = GpioDirOut; ///< 端口方向配置->输出
GpioInitStruct.enDrv = GpioDrvH; ///< 端口驱动能力配置->高驱动能力 GpioInitStruct.enDrv = GpioDrvH; ///< 端口驱动能力配置->高驱动能力
GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无 GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无
GpioInitStruct.enPd = GpioPdDisable; GpioInitStruct.enPd = GpioPdDisable;
GpioInitStruct.enOD = GpioOdDisable; ///< 端口开漏输出配置->开漏输出关闭 GpioInitStruct.enOD = GpioOdDisable; ///< 端口开漏输出配置->开漏输出关闭
GpioInitStruct.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB GpioInitStruct.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
GpioInitStruct.bOutputVal = false; ///< 端口默认输出配置->低电平 GpioInitStruct.bOutputVal = false; ///< 端口默认输出配置->低电平
//< RS485控制引脚 //< RS485控制引脚
Gpio_Init(RS485_CTRL_PORTx,RS485_CTRL_PINx,&GpioInitStruct); Gpio_Init(RS485_CTRL_PORTx,RS485_CTRL_PINx,&GpioInitStruct);
//< 激光控制引脚 //< 激光控制引脚
Gpio_Init(LASER1_ON_OFF_PORTx,LASER1_ON_OFF_PINx,&GpioInitStruct); Gpio_Init(LASER1_ON_OFF_PORTx,LASER1_ON_OFF_PINx,&GpioInitStruct);
Gpio_Init(LASER2_ON_OFF_PORTx,LASER2_ON_OFF_PINx,&GpioInitStruct); Gpio_Init(LASER2_ON_OFF_PORTx,LASER2_ON_OFF_PINx,&GpioInitStruct);
Gpio_Init(LASER3_ON_OFF_PORTx,LASER3_ON_OFF_PINx,&GpioInitStruct); Gpio_Init(LASER3_ON_OFF_PORTx,LASER3_ON_OFF_PINx,&GpioInitStruct);
//< ADC???????
Gpio_Init(AD_ON_OFF_PORTx,AD_ON_OFF_PINx,&GpioInitStruct);
GpioInitStruct.bOutputVal = true; ///< 端口默认输出配置->高电平 GpioInitStruct.bOutputVal = true; ///< 端口默认输出配置->高电平
//< LORA --> RST //< LORA --> RST
Gpio_Init(LORA_RST_PORTx,LORA_RST_PINx,&GpioInitStruct); Gpio_Init(LORA_RST_PORTx,LORA_RST_PINx,&GpioInitStruct);
//< LED_State //< LED_State
Gpio_Init(LED_STATE_PORTx,LED_STATE_PINx,&GpioInitStruct); Gpio_Init(LED_STATE_PORTx,LED_STATE_PINx,&GpioInitStruct);
/********************************** GPIO输入 ****************************************/ /********************************** GPIO输入 ****************************************/
GpioInitStruct.enDir = GpioDirIn; ///< 端口方向配置->输入 GpioInitStruct.enDir = GpioDirIn; ///< 端口方向配置->输入
GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无 GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无
GpioInitStruct.enPd = GpioPdDisable; GpioInitStruct.enPd = GpioPdDisable;
GpioInitStruct.enOD = GpioOdDisable; GpioInitStruct.enOD = GpioOdDisable;
@@ -415,33 +417,33 @@ static void GPIOInit(void)
Gpio_Init(MMC5983MA_INT_PORTx,MMC5983MA_INT_PINx,&GpioInitStruct); Gpio_Init(MMC5983MA_INT_PORTx,MMC5983MA_INT_PINx,&GpioInitStruct);
GlobalIntEnable(); GlobalIntEnable();
} }
void GlobalIntEnable(void)//全局中断使能 void GlobalIntEnable(void)//全局中断使能
{ {
EnableNvic(PORTB_IRQn, IrqLevel3, TRUE); EnableNvic(PORTB_IRQn, IrqLevel3, TRUE);
EnableNvic(PORTC_E_IRQn, IrqLevel3, TRUE); EnableNvic(PORTC_E_IRQn, IrqLevel3, TRUE);
} }
void GlobalIntDisable(void)//全局中断失能 void GlobalIntDisable(void)//全局中断失能
{ {
EnableNvic(PORTB_IRQn, IrqLevel3, FALSE); EnableNvic(PORTB_IRQn, IrqLevel3, FALSE);
EnableNvic(PORTC_E_IRQn, IrqLevel3, FALSE); EnableNvic(PORTC_E_IRQn, IrqLevel3, FALSE);
} }
void LORAIntEnable(void)//LORA中断使能 void LORAIntEnable(void)//LORA中断使能
{ {
Gpio_EnableIrq(LORA_DIO0_PORTx, LORA_DIO0_PINx, GpioIrqRising);//LORA_DIO0 Gpio_EnableIrq(LORA_DIO0_PORTx, LORA_DIO0_PINx, GpioIrqRising);//LORA_DIO0
Gpio_EnableIrq(LORA_DIO1_PORTx, LORA_DIO1_PINx, GpioIrqRising);//LORA_DIO1 Gpio_EnableIrq(LORA_DIO1_PORTx, LORA_DIO1_PINx, GpioIrqRising);//LORA_DIO1
} }
void LORAIntDisable(void)//LORA中断失能 void LORAIntDisable(void)//LORA中断失能
{ {
Gpio_DisableIrq(LORA_DIO0_PORTx, LORA_DIO0_PINx, GpioIrqRising); Gpio_DisableIrq(LORA_DIO0_PORTx, LORA_DIO0_PINx, GpioIrqRising);
Gpio_DisableIrq(LORA_DIO1_PORTx, LORA_DIO1_PINx, GpioIrqRising); Gpio_DisableIrq(LORA_DIO1_PORTx, LORA_DIO1_PINx, GpioIrqRising);
} }
void ACCandMMCIntEnable(void)//加速度和地磁中断使能 void ACCandMMCIntEnable(void)//加速度和地磁中断使能
{ {
Gpio_EnableIrq(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx, GpioIrqRising);//ACC_Int1 Gpio_EnableIrq(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx, GpioIrqRising);//ACC_Int1
Gpio_EnableIrq(LSM6DSLTR_INT2_PORTx, LSM6DSLTR_INT2_PINx, GpioIrqRising);//ACC_Int2 Gpio_EnableIrq(LSM6DSLTR_INT2_PORTx, LSM6DSLTR_INT2_PINx, GpioIrqRising);//ACC_Int2
Gpio_EnableIrq(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx, GpioIrqRising);//MMC_Int Gpio_EnableIrq(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx, GpioIrqRising);//MMC_Int
} }
void ACCandMMCIntDisable(void)//加速度和地磁中断失能 void ACCandMMCIntDisable(void)//加速度和地磁中断失能
{ {
Gpio_DisableIrq(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx, GpioIrqRising);//ACC_Int1 Gpio_DisableIrq(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx, GpioIrqRising);//ACC_Int1
Gpio_DisableIrq(LSM6DSLTR_INT2_PORTx, LSM6DSLTR_INT2_PINx, GpioIrqRising);//ACC_Int2 Gpio_DisableIrq(LSM6DSLTR_INT2_PORTx, LSM6DSLTR_INT2_PINx, GpioIrqRising);//ACC_Int2
@@ -456,31 +458,31 @@ static void SPI0Init(void)
DDL_ZERO_STRUCT(GpioInitStruct); DDL_ZERO_STRUCT(GpioInitStruct);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
/************************** SPI0配置:主机-->LORA *******************************/ /************************** SPI0配置:主机-->LORA *******************************/
GpioInitStruct.enDir = GpioDirOut; GpioInitStruct.enDir = GpioDirOut;
Gpio_Init(SPI0_NSS_PORTx,SPI0_NSS_PINx,&GpioInitStruct); Gpio_Init(SPI0_NSS_PORTx,SPI0_NSS_PINx,&GpioInitStruct);
Gpio_SetAfMode(SPI0_NSS_PORTx,SPI0_NSS_PINx,SPI0_NSS_AF); //配置SPI0_NSS Gpio_SetAfMode(SPI0_NSS_PORTx,SPI0_NSS_PINx,SPI0_NSS_AF); //配置SPI0_NSS
Gpio_Init(SPI0_SCK_PORTx,SPI0_SCK_PINx,&GpioInitStruct); Gpio_Init(SPI0_SCK_PORTx,SPI0_SCK_PINx,&GpioInitStruct);
Gpio_SetAfMode(SPI0_SCK_PORTx,SPI0_SCK_PINx,SPI0_SCK_AF); //配置SPI0_SCK Gpio_SetAfMode(SPI0_SCK_PORTx,SPI0_SCK_PINx,SPI0_SCK_AF); //配置SPI0_SCK
Gpio_Init(SPI0_MOSI_PORTx,SPI0_MOSI_PINx,&GpioInitStruct); Gpio_Init(SPI0_MOSI_PORTx,SPI0_MOSI_PINx,&GpioInitStruct);
Gpio_SetAfMode(SPI0_MOSI_PORTx,SPI0_MOSI_PINx,SPI0_MOSI_AF); //配置SPI0_MOSI Gpio_SetAfMode(SPI0_MOSI_PORTx,SPI0_MOSI_PINx,SPI0_MOSI_AF); //配置SPI0_MOSI
GpioInitStruct.enDir = GpioDirIn; ///< 端口方向配置->输入 GpioInitStruct.enDir = GpioDirIn; ///< 端口方向配置->输入
Gpio_Init(SPI0_MISO_PORTx,SPI0_MISO_PINx,&GpioInitStruct); Gpio_Init(SPI0_MISO_PORTx,SPI0_MISO_PINx,&GpioInitStruct);
Gpio_SetAfMode(SPI0_MISO_PORTx, SPI0_MISO_PINx,SPI0_MISO_AF); //配置SPI0_MISO Gpio_SetAfMode(SPI0_MISO_PORTx, SPI0_MISO_PINx,SPI0_MISO_AF); //配置SPI0_MISO
Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,TRUE); ///< 打开SPI0外设时钟 Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,TRUE); ///< 打开SPI0外设时钟
Reset_RstPeripheral0(ResetMskSpi0); ///<复位模块 Reset_RstPeripheral0(ResetMskSpi0); ///<复位模块
//SPI0模块配置:主机 //SPI0模块配置:主机
SpiInitStruct.enSpiMode = SpiMskMaster; //配置位主机模式 SpiInitStruct.enSpiMode = SpiMskMaster; //配置位主机模式
SpiInitStruct.enPclkDiv = SpiClkMskDiv4; //波特率:PCLK/4 SpiInitStruct.enPclkDiv = SpiClkMskDiv4; //波特率:PCLK/4
SpiInitStruct.enCPHA = SpiMskCphasecond; //第二边沿采样 SpiInitStruct.enCPHA = SpiMskCphasecond; //第二边沿采样
SpiInitStruct.enCPOL = SpiMskcpolhigh; //极性为高 SpiInitStruct.enCPOL = SpiMskcpolhigh; //极性为高
Spi_Init(M0P_SPI0, &SpiInitStruct); Spi_Init(M0P_SPI0, &SpiInitStruct);
} }
@@ -492,31 +494,31 @@ static void SPI1Init(void)
DDL_ZERO_STRUCT(GpioInitStruct); DDL_ZERO_STRUCT(GpioInitStruct);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
/************************** SPI1配置:主机-->LORA *******************************/ /************************** SPI1配置:主机-->LORA *******************************/
GpioInitStruct.enDir = GpioDirOut; GpioInitStruct.enDir = GpioDirOut;
Gpio_Init(SPI1_NSS_PORTx,SPI1_NSS_PINx,&GpioInitStruct); Gpio_Init(SPI1_NSS_PORTx,SPI1_NSS_PINx,&GpioInitStruct);
Gpio_SetAfMode(SPI1_NSS_PORTx,SPI1_NSS_PINx,SPI1_NSS_AF); //配置SPI1_NSS Gpio_SetAfMode(SPI1_NSS_PORTx,SPI1_NSS_PINx,SPI1_NSS_AF); //配置SPI1_NSS
Gpio_Init(SPI1_SCK_PORTx,SPI1_SCK_PINx,&GpioInitStruct); Gpio_Init(SPI1_SCK_PORTx,SPI1_SCK_PINx,&GpioInitStruct);
Gpio_SetAfMode(SPI1_SCK_PORTx,SPI1_SCK_PINx,SPI1_SCK_AF); //配置SPI1_SCK Gpio_SetAfMode(SPI1_SCK_PORTx,SPI1_SCK_PINx,SPI1_SCK_AF); //配置SPI1_SCK
Gpio_Init(SPI1_MOSI_PORTx,SPI1_MOSI_PINx,&GpioInitStruct); Gpio_Init(SPI1_MOSI_PORTx,SPI1_MOSI_PINx,&GpioInitStruct);
Gpio_SetAfMode(SPI1_MOSI_PORTx,SPI1_MOSI_PINx,SPI1_MOSI_AF); //配置SPI1_MOSI Gpio_SetAfMode(SPI1_MOSI_PORTx,SPI1_MOSI_PINx,SPI1_MOSI_AF); //配置SPI1_MOSI
GpioInitStruct.enDir = GpioDirIn; ///< 端口方向配置->输入 GpioInitStruct.enDir = GpioDirIn; ///< 端口方向配置->输入
Gpio_Init(SPI1_MISO_PORTx,SPI1_MISO_PINx,&GpioInitStruct); Gpio_Init(SPI1_MISO_PORTx,SPI1_MISO_PINx,&GpioInitStruct);
Gpio_SetAfMode(SPI1_MISO_PORTx, SPI1_MISO_PINx,SPI1_MISO_AF); //配置SPI1_MISO Gpio_SetAfMode(SPI1_MISO_PORTx, SPI1_MISO_PINx,SPI1_MISO_AF); //配置SPI1_MISO
Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi1,TRUE); ///< 打开SPI0外设时钟 Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi1,TRUE); ///< 打开SPI0外设时钟
Reset_RstPeripheral0(ResetMskSpi1); ///<复位模块 Reset_RstPeripheral0(ResetMskSpi1); ///<复位模块
//SPI1模块配置:主机 //SPI1模块配置:主机
SpiInitStruct.enSpiMode = SpiMskMaster; //配置位主机模式 SpiInitStruct.enSpiMode = SpiMskMaster; //配置位主机模式
SpiInitStruct.enPclkDiv = SpiClkMskDiv2; //波特率:PCLK/2 SpiInitStruct.enPclkDiv = SpiClkMskDiv2; //波特率:PCLK/2
SpiInitStruct.enCPHA = SpiMskCphasecond; //第二边沿采样 SpiInitStruct.enCPHA = SpiMskCphasecond; //第二边沿采样
SpiInitStruct.enCPOL = SpiMskcpolhigh; //极性为高 SpiInitStruct.enCPOL = SpiMskcpolhigh; //极性为高
Spi_Init(M0P_SPI1, &SpiInitStruct); Spi_Init(M0P_SPI1, &SpiInitStruct);
} }
@@ -537,28 +539,28 @@ static void I2C0Init(void)
DDL_ZERO_STRUCT(stcI2cCfg); DDL_ZERO_STRUCT(stcI2cCfg);
DDL_ZERO_STRUCT(stcGpioCfg); DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //开启GPIO时钟门控 Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //开启GPIO时钟门控
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出 stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出
stcGpioCfg.enOD = GpioOdEnable; ///< 开漏输出 stcGpioCfg.enOD = GpioOdEnable; ///< 开漏输出
stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能 stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能
stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止 stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止
stcGpioCfg.bOutputVal = TRUE; stcGpioCfg.bOutputVal = TRUE;
Gpio_Init(I2C0_SCL_PORTx, I2C0_SCL_PINx, &stcGpioCfg); ///< 端口初始化 Gpio_Init(I2C0_SCL_PORTx, I2C0_SCL_PINx, &stcGpioCfg); ///< 端口初始化
Gpio_SetAfMode(I2C0_SCL_PORTx, I2C0_SCL_PINx, I2C0_SCL_AF); Gpio_SetAfMode(I2C0_SCL_PORTx, I2C0_SCL_PINx, I2C0_SCL_AF);
Gpio_Init(I2C0_SDA_PORTx, I2C0_SDA_PINx, &stcGpioCfg); Gpio_Init(I2C0_SDA_PORTx, I2C0_SDA_PINx, &stcGpioCfg);
Gpio_SetAfMode(I2C0_SDA_PORTx, I2C0_SDA_PINx, I2C0_SDA_AF); Gpio_SetAfMode(I2C0_SDA_PORTx, I2C0_SDA_PINx, I2C0_SDA_AF);
Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c0,TRUE); ///< 开启I2C0时钟门控 Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c0,TRUE); ///< 开启I2C0时钟门控
stcI2cCfg.u32Pclk = Sysctrl_GetPClkFreq(); ///< 获取PCLK时钟 stcI2cCfg.u32Pclk = Sysctrl_GetPClkFreq(); ///< 获取PCLK时钟
stcI2cCfg.u32Baud = 400000; ///< 1MHz stcI2cCfg.u32Baud = 400000; ///< 1MHz
stcI2cCfg.enMode = I2cMasterMode; ///< 主机模式 stcI2cCfg.enMode = I2cMasterMode; ///< 主机模式
stcI2cCfg.u8SlaveAddr = 0xD5; ///< 从地址,主模式无效 stcI2cCfg.u8SlaveAddr = 0xD5; ///< 从地址,主模式无效
stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭 stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭
I2C_Init(M0P_I2C0, &stcI2cCfg); ///< 模块初始化 I2C_Init(M0P_I2C0, &stcI2cCfg); ///< 模块初始化
} }
static void I2C1Init(void) static void I2C1Init(void)
@@ -569,37 +571,37 @@ static void I2C1Init(void)
DDL_ZERO_STRUCT(stcI2cCfg); DDL_ZERO_STRUCT(stcI2cCfg);
DDL_ZERO_STRUCT(stcGpioCfg); DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //开启GPIO时钟门控 Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //开启GPIO时钟门控
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出 stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出
stcGpioCfg.enOD = GpioOdEnable; ///< 开漏输出 stcGpioCfg.enOD = GpioOdEnable; ///< 开漏输出
stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能 stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能
stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止 stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止
stcGpioCfg.bOutputVal = TRUE; stcGpioCfg.bOutputVal = TRUE;
Gpio_Init(I2C1_SCL_PORTx, I2C1_SCL_PINx, &stcGpioCfg); ///< 端口初始化 Gpio_Init(I2C1_SCL_PORTx, I2C1_SCL_PINx, &stcGpioCfg); ///< 端口初始化
Gpio_SetAfMode(I2C1_SCL_PORTx, I2C1_SCL_PINx, I2C1_SCL_AF); Gpio_SetAfMode(I2C1_SCL_PORTx, I2C1_SCL_PINx, I2C1_SCL_AF);
Gpio_Init(I2C1_SDA_PORTx, I2C1_SDA_PINx, &stcGpioCfg); Gpio_Init(I2C1_SDA_PORTx, I2C1_SDA_PINx, &stcGpioCfg);
Gpio_SetAfMode(I2C1_SDA_PORTx, I2C1_SDA_PINx, I2C1_SDA_AF); Gpio_SetAfMode(I2C1_SDA_PORTx, I2C1_SDA_PINx, I2C1_SDA_AF);
Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c1,TRUE); ///< 开启I2C1时钟门控 Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c1,TRUE); ///< 开启I2C1时钟门控
stcI2cCfg.u32Pclk = Sysctrl_GetPClkFreq(); ///< 获取PCLK时钟 stcI2cCfg.u32Pclk = Sysctrl_GetPClkFreq(); ///< 获取PCLK时钟
stcI2cCfg.u32Baud = 400000; ///< 1MHz stcI2cCfg.u32Baud = 400000; ///< 1MHz
stcI2cCfg.enMode = I2cMasterMode; ///< 主机模式 stcI2cCfg.enMode = I2cMasterMode; ///< 主机模式
stcI2cCfg.u8SlaveAddr = 0xD5; ///< 从地址,主模式无效 stcI2cCfg.u8SlaveAddr = 0xD5; ///< 从地址,主模式无效
stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭 stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭
I2C_Init(M0P_I2C1, &stcI2cCfg); ///< 模块初始化 I2C_Init(M0P_I2C1, &stcI2cCfg); ///< 模块初始化
} }
static void WdtInit(void) static void WdtInit(void)
{ {
#if (USE_WDT == 1) #if (USE_WDT == 1)
///< 开启WDT外设时钟 ///< 开启WDT外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralWdt,TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralWdt,TRUE);
///< WDT 初始化 ///< WDT 初始化
Wdt_Init(WdtResetEn, WdtT52s4); Wdt_Init(WdtResetEn, WdtT52s4);
Wdt_Start(); Wdt_Start();
#endif #endif
@@ -703,21 +705,21 @@ void PrintfMess(void)
} }
void DBGUartSendByte(uint8_t sData) void DBGUartSendByte(uint8_t sData)
{ {
#if USE_BOOTLOADER if(gDebugChannel == DBG_CH_RS485_1) {
LPUart_SendData(M0P_LPUART0, sData); LPUart_SendData(M0P_LPUART0, sData);
#else } else {
Uart_SendDataPoll(M0P_UART0, sData); Uart_SendDataPoll(M0P_UART0, sData);
#endif }
} }
void DBGUartSend(uint8_t *sData, int sLen) void DBGUartSend(uint8_t *sData, int sLen)
{ {
#if USE_BOOTLOADER if(gDebugChannel == DBG_CH_RS485_1) {
LPUart0SendArray(sData, sLen); LPUart0SendArray(sData, sLen);
#else } else {
for(int i = 0; i < sLen; i++) { for(int i = 0; i < sLen; i++) {
Uart_SendDataPoll(M0P_UART0, sData[i]); Uart_SendDataPoll(M0P_UART0, sData[i]);
} }
#endif }
} }
void LPUart0SendArray(uint8_t *sData, uint8_t sLen) void LPUart0SendArray(uint8_t *sData, uint8_t sLen)
{ {
@@ -732,7 +734,7 @@ uint32_t GetSysTick(void)
{ {
return SysTickCnt; return SysTickCnt;
} }
void delay_us(uint32_t uS)//24MHz一个nop延时0.5us12MHz延时1us void delay_us(uint32_t uS)//24MHz一个nop延时0.5us12MHz延时1us
{ {
uS *= 2; uS *= 2;
while(uS--) while(uS--)
@@ -777,24 +779,24 @@ void PortB_IRQHandler(void)
void PortC_IRQHandler(void) void PortC_IRQHandler(void)
{ {
//加速度INT1 //加速度INT1
if(TRUE == Gpio_GetIrqStatus(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx)) { if(TRUE == Gpio_GetIrqStatus(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx)) {
Gpio_ClearIrq(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx); Gpio_ClearIrq(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx);
Lsm6dsInt1CallBack(); Lsm6dsInt1CallBack();
} }
//地磁INT //地磁INT
if(TRUE == Gpio_GetIrqStatus(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx)) { if(TRUE == Gpio_GetIrqStatus(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx)) {
Gpio_ClearIrq(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx); Gpio_ClearIrq(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx);
MMC5983IntCallBack(); MMC5983IntCallBack();
} }
} }
///<LPUART0 中断服务函数 ///<LPUART0 中断服务函数
void LpUart0_IRQHandler(void) void LpUart0_IRQHandler(void)
{ {
if(LPUart_GetStatus(M0P_LPUART0, LPUartRC)) { ///接收数据 if(LPUart_GetStatus(M0P_LPUART0, LPUartRC)) { ///接收数据
LPUart_ClrStatus(M0P_LPUART0, LPUartRC); ///<清接收中断请求 LPUart_ClrStatus(M0P_LPUART0, LPUartRC); ///<清接收中断请求
uint8_t u8RxData = LPUart_ReceiveData(M0P_LPUART0); ///读取数据 uint8_t u8RxData = LPUart_ReceiveData(M0P_LPUART0); ///读取数据
LPUartRx_CallBack(u8RxData); LPUartRx_CallBack(u8RxData);
DebugUartIRQ(u8RxData); DebugUartIRQ(u8RxData);
} }
@@ -802,17 +804,17 @@ void LpUart0_IRQHandler(void)
void Uart0_IRQHandler(void) void Uart0_IRQHandler(void)
{ {
if(Uart_GetStatus(M0P_UART0, UartRC)) { ///接收数据 if(Uart_GetStatus(M0P_UART0, UartRC)) { ///接收数据
Uart_ClrStatus(M0P_UART0, UartRC); ///<清接收中断请求 Uart_ClrStatus(M0P_UART0, UartRC); ///<清接收中断请求
uint8_t u8RxData = Uart_ReceiveData(M0P_UART0); ///读取数据 uint8_t u8RxData = Uart_ReceiveData(M0P_UART0); ///读取数据
//DebugUartIRQ(u8RxData); DebugUartIRQ(u8RxData);
} }
} }
void Rtc_IRQHandler(void) void Rtc_IRQHandler(void)
{ {
if(Rtc_GetPridItStatus() == TRUE) { if(Rtc_GetPridItStatus() == TRUE) {
Rtc_ClearPrdfItStatus(); //清除中断标志位 Rtc_ClearPrdfItStatus(); //清除中断标志位
RtcIRQHander(); RtcIRQHander();
} }
} }
@@ -821,19 +823,19 @@ void LpTim0_IRQHandler(void)
{ {
if(Lptim_GetItStatus(M0P_LPTIMER0) == TRUE) if(Lptim_GetItStatus(M0P_LPTIMER0) == TRUE)
{ {
Lptim_ClrItStatus(M0P_LPTIMER0);//清除LPTimer0的中断标志位 Lptim_ClrItStatus(M0P_LPTIMER0);//清除LPTimer0的中断标志位
LPTimer0IRQHander(); LPTimer0IRQHander();
} }
} }
///<深度休眠模式外部端口配置(STK) ///<深度休眠模式外部端口配置(STK)
static void DeepSleepGPIOCfg(void) static void DeepSleepGPIOCfg(void)
{ {
stc_gpio_cfg_t GpioInitStruct; stc_gpio_cfg_t GpioInitStruct;
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
//低功耗状态下未使用的脚配置 //低功耗状态下未使用的脚配置
//输入上拉 //输入上拉
GpioInitStruct.enDir = GpioDirIn; GpioInitStruct.enDir = GpioDirIn;
GpioInitStruct.enPu = GpioPuEnable; GpioInitStruct.enPu = GpioPuEnable;
@@ -841,7 +843,7 @@ static void DeepSleepGPIOCfg(void)
Gpio_Init(SPI0_SCK_PORTx,SPI0_SCK_PINx,&GpioInitStruct); Gpio_Init(SPI0_SCK_PORTx,SPI0_SCK_PINx,&GpioInitStruct);
Gpio_Init(SPI0_MISO_PORTx,SPI0_MISO_PINx,&GpioInitStruct); Gpio_Init(SPI0_MISO_PORTx,SPI0_MISO_PINx,&GpioInitStruct);
//输入下拉 //输入下拉
GpioInitStruct.enDir = GpioDirIn; GpioInitStruct.enDir = GpioDirIn;
GpioInitStruct.enPd = GpioPdEnable; GpioInitStruct.enPd = GpioPdEnable;
@@ -853,26 +855,26 @@ void EnterDeepSleep(void)
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
//< LORA //< LORA
Sx1276LoRaSleep();//Lora睡眠 Sx1276LoRaSleep();//Lora睡眠
LORAIntDisable();//关闭LORA中断 LORAIntDisable();//关闭LORA中断
ACCandMMCIntDisable();//关闭加速度和地磁中断 ACCandMMCIntDisable();//关闭加速度和地磁中断
#if (USE_VBAT_AD == 1)//< AD #if (USE_VBAT_AD == 1)//< AD
AD_OFF(); AD_OFF();
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE); Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
Sysctrl_ClkSourceEnable(SysctrlClkPLL,FALSE); Sysctrl_ClkSourceEnable(SysctrlClkPLL,FALSE);
Bgr_BgrDisable(); ///< 关闭BGR Bgr_BgrDisable(); ///< 关闭BGR
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, FALSE); Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, FALSE);
Adc_SGL_Stop();//关闭单次采样 Adc_SGL_Stop();//关闭单次采样
#endif #endif
#if (USE_SPI0 == 1) #if (USE_SPI0 == 1)
Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,FALSE);//关闭SPI0外设时钟 Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,FALSE);//关闭SPI0外设时钟
#endif #endif
#if (USE_UART0 == 1) #if (USE_UART0 == 1)
EnableNvic(UART0_2_IRQn, IrqLevel3, false); EnableNvic(UART0_2_IRQn, IrqLevel3, false);
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,FALSE); //关闭UART0时钟 Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,FALSE); //关闭UART0时钟
#endif #endif
DeepSleepGPIOCfg(); DeepSleepGPIOCfg();
@@ -899,9 +901,9 @@ void WakeUpInit(void)
WdtInit(); WdtInit();
#endif #endif
LORAIntEnable();//开启LORA中断 LORAIntEnable();//开启LORA中断
Sx1276LoRaWakeup();//LORA唤醒 Sx1276LoRaWakeup();//LORA唤醒
ACCandMMCIntEnable();//开启加速度和地磁中断 ACCandMMCIntEnable();//开启加速度和地磁中断
SysTick_Config(SystemCoreClock/1000); SysTick_Config(SystemCoreClock/1000);
} }
+93 -61
View File
@@ -20,17 +20,17 @@ extern uint32_t CommWay;
extern uint32_t DeviceSign; extern uint32_t DeviceSign;
extern uint32_t AddNumber; extern uint32_t AddNumber;
extern uint8_t LocalMAC[6]; //本机MAC地址 extern uint8_t LocalMAC[6]; //本机MAC地址
extern uint8_t GatewayMAC[6]; //网关MAC地址,注册时全为0 extern uint8_t GatewayMAC[6]; //网关MAC地址,注册时全为0
extern uint8_t LocalDataPack[sizeof(SGCP.DevData.LaserTracing)]; //本机数据包 //本机数据包 extern uint8_t LocalDataPack[sizeof(SGCP.DevData.LaserTracing)]; //本机数据包 //本机数据包
bool MainDispEn = true; bool MainDispEn = true;
bool DataDispEn = true; bool DataDispEn = true;
/***************************************************************************************** /*****************************************************************************************
* 函数名称: MainDBGOnOff * 函数名称: MainDBGOnOff
* 功能描述: 主调试信息开关函数 * 功能描述: 主调试信息开关函数
* 参 数: OnOff,开关 * 参 数: OnOff,开关
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void MainDBGOnOff(bool OnOff) void MainDBGOnOff(bool OnOff)
{ {
@@ -41,10 +41,10 @@ void MainDBGOnOff(bool OnOff)
DBG_LOG("\r\nMain Display Disable!\r\n\r\n"); DBG_LOG("\r\nMain Display Disable!\r\n\r\n");
} }
/***************************************************************************************** /*****************************************************************************************
* 函数名称: DataDBGOnOff * 函数名称: DataDBGOnOff
* 功能描述: 数据信息开关函数 * 功能描述: 数据信息开关函数
* 参 数: OnOff,开关 * 参 数: OnOff,开关
* 返 回 值: 无 * 返 回 值: 无
*****************************************************************************************/ *****************************************************************************************/
void DataDBGOnOff(bool OnOff) void DataDBGOnOff(bool OnOff)
{ {
@@ -82,17 +82,17 @@ static void AppInit(void)
LocalMAC[i] = *((volatile const uint8_t *)(0x00002800 + i)); LocalMAC[i] = *((volatile const uint8_t *)(0x00002800 + i));
} }
memcpy(&App.Para.BLPara.DevMac, &LocalMAC[0], 6); memcpy(&App.Para.BLPara.DevMac, &LocalMAC[0], 6);
LocalType = (App.Para.BLPara.DevMac[0] | (App.Para.BLPara.DevMac[1] << 8)); //本机设备类型 LocalType = (App.Para.BLPara.DevMac[0] | (App.Para.BLPara.DevMac[1] << 8)); //本机设备类型
CommWay = App.Para.BLPara.DevMac[2]; //本机通讯方式 CommWay = App.Para.BLPara.DevMac[2]; //本机通讯方式
DeviceSign = App.Para.BLPara.DevMac[3] & 0x80; //本机设备标志 DeviceSign = App.Para.BLPara.DevMac[3] & 0x80; //本机设备标志
AddNumber = ((App.Para.BLPara.DevMac[3] << 16)+ (App.Para.BLPara.DevMac[4] << 8) + App.Para.BLPara.DevMac[5]) - 0x800000; //本机地址编号,数字部分对应唯一地址编号 AddNumber = ((App.Para.BLPara.DevMac[3] << 16)+ (App.Para.BLPara.DevMac[4] << 8) + App.Para.BLPara.DevMac[5]) - 0x800000; //本机地址编号,数字部分对应唯一地址编号
#else #else
LocalType = LASER_TRACING; //本机设备类型 LocalType = LASER_TRACING; //本机设备类型
CommWay = LORA; //本机通讯方式 CommWay = LORA; //本机通讯方式
DeviceSign = MASTER; //本机设备标志 DeviceSign = MASTER; //本机设备标志
AddNumber = 0x000023 + DeviceSign;//本机地址编号,数字部分对应唯一地址编号 AddNumber = 0x000023 + DeviceSign;//本机地址编号,数字部分对应唯一地址编号
App.Para.BLPara.LoraFreq = CH0; App.Para.BLPara.LoraFreq = CH0;
LocalMAC[0] = LocalType & 0xFF; //本机MAC地址 LocalMAC[0] = LocalType & 0xFF; //本机MAC地址
LocalMAC[1] = (LocalType >> 8) & 0xFF; LocalMAC[1] = (LocalType >> 8) & 0xFF;
LocalMAC[2] = CommWay; LocalMAC[2] = CommWay;
LocalMAC[3] = (AddNumber >> 16) & 0xFF; LocalMAC[3] = (AddNumber >> 16) & 0xFF;
@@ -104,7 +104,7 @@ static void AppInit(void)
if(App.Para.FactoryFlag != 0x00) if(App.Para.FactoryFlag != 0x00)
{ {
App.Para.FactoryFlag = 0x00; App.Para.FactoryFlag = 0x00;
/*校准参数初始化*/ /*校准参数初始化*/
App.Para.CaliPara.PitchZero = 0; App.Para.CaliPara.PitchZero = 0;
App.Para.CaliPara.RollZero = 0; App.Para.CaliPara.RollZero = 0;
App.Para.CaliPara.YawZero = 0; App.Para.CaliPara.YawZero = 0;
@@ -137,7 +137,7 @@ static void AppInit(void)
if(App.Para.BLPara.LoraFreq < 410000000 || App.Para.BLPara.LoraFreq > 525000000) if(App.Para.BLPara.LoraFreq < 410000000 || App.Para.BLPara.LoraFreq > 525000000)
App.Para.BLPara.LoraFreq = CH0; App.Para.BLPara.LoraFreq = CH0;
App.Para.Lora.FreqCent = App.Para.BLPara.LoraFreq; App.Para.Lora.FreqCent = App.Para.BLPara.LoraFreq;
SX1276LoRaWriteFreq(App.Para.Lora.FreqCent); //Lora频率:433100000ul + 200000*N SX1276LoRaWriteFreq(App.Para.Lora.FreqCent); //Lora频率:433100000ul + 200000*N
if(App.Para.Rs485Ch1.Addr > 16 || App.Para.Rs485Ch1.Addr < 1){ if(App.Para.Rs485Ch1.Addr > 16 || App.Para.Rs485Ch1.Addr < 1){
App.Para.Rs485Ch1.Addr = 1; App.Para.Rs485Ch1.Addr = 1;
@@ -157,12 +157,16 @@ static void AppInit(void)
if(App.Para.Layout.ERTime > 240 || App.Para.Layout.ERTime < 20) { if(App.Para.Layout.ERTime > 240 || App.Para.Layout.ERTime < 20) {
App.Para.Layout.ERTime = 40; App.Para.Layout.ERTime = 40;
} }
if(App.Para.LaserTimerMinutes < 0 || App.Para.LaserTimerMinutes > 240)
App.Para.LaserTimerMinutes = 10;
SGCP.LaserTimerMinutes = App.Para.LaserTimerMinutes;
SAVE_APP_PARA((uint32_t *)&App.Para); SAVE_APP_PARA((uint32_t *)&App.Para);
LpUart0Init(App.Para.Rs485Ch1.BaudRate);//低功耗串口初始化 LpUart0Init(App.Para.Rs485Ch1.BaudRate);//低功耗串口初始化
LORAIntEnable(); LORAIntEnable();
LoraInit(); //< LORA芯片初始化 LoraInit(); //< LORA芯片初始化
FeedDog(); FeedDog();
Lsm6dslInit(); Lsm6dslInit();
@@ -173,7 +177,7 @@ static void AppInit(void)
LPTimer0_OFF(); LPTimer0_OFF();
uint32_t seed = 0;//< 随机数初始化 uint32_t seed = 0;//< 随机数初始化
seed = seed + LocalMAC[2]; seed = seed + LocalMAC[2];
seed = (seed << 8) + LocalMAC[3]; seed = (seed << 8) + LocalMAC[3];
seed = (seed << 8) + LocalMAC[4]; seed = (seed << 8) + LocalMAC[4];
@@ -194,11 +198,8 @@ static void AppInit(void)
App.LoginFlag = false; App.LoginFlag = false;
App.Login_RTC = false; App.Login_RTC = false;
App.Login_LPTimer0 = true; App.Login_LPTimer0 = true;
//LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms //LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
LPTimer0_ON(50);//5秒后注册 LPTimer0_ON(50);//5秒后注册
MAIN_DBG_LOG("Login LPTimer0 Open\r\n");
App.Upload45S10SCount = 0;
App.UploadFlag = false; App.UploadFlag = false;
App.Upload_LPTimer0 = false; App.Upload_LPTimer0 = false;
@@ -282,7 +283,7 @@ static void ReadDataLoopHandler(void)
RollDiff = App.ConvertedData.Roll - App.Para.CaliPara.RollZero; RollDiff = App.ConvertedData.Roll - App.Para.CaliPara.RollZero;
if((PitchDiff > ERINTERVAL_VPT) || (RollDiff > ERINTERVAL_VPT)) if((PitchDiff > ERINTERVAL_VPT) || (RollDiff > ERINTERVAL_VPT))
{ {
//触发紧急上报 //触发紧急上报
App.ERFlag = true; App.ERFlag = true;
DATA_DBG_LOG("PitchDiff=%04d, PitchDiff=%04d\r\n", PitchDiff,RollDiff); DATA_DBG_LOG("PitchDiff=%04d, PitchDiff=%04d\r\n", PitchDiff,RollDiff);
DATA_DBG_LOG("Start emergency reporting!\r\n"); DATA_DBG_LOG("Start emergency reporting!\r\n");
@@ -300,7 +301,7 @@ static void ReadDataLoopHandler(void)
SGCP.DevData.LaserTracing.MasterDev.BatLevel = 0x00; SGCP.DevData.LaserTracing.MasterDev.BatLevel = 0x00;
#endif #endif
#if (SGCP_SELECT == 1 || SGCP_SELECT == 2) #if (SGCP_SELECT == 1 || SGCP_SELECT == 2)
SX1276LoCalcRssiSnr(&SGCP.DevData.LaserTracing.MasterDev.RSSI, &SGCP.DevData.LaserTracing.MasterDev.Nsr);//获取信号强度 SX1276LoCalcRssiSnr(&SGCP.DevData.LaserTracing.MasterDev.RSSI, &SGCP.DevData.LaserTracing.MasterDev.Nsr);//获取信号强度
#else #else
SGCP.DevData.LaserTracing.MasterDev.RSSI = 0x00; SGCP.DevData.LaserTracing.MasterDev.RSSI = 0x00;
SGCP.DevData.LaserTracing.MasterDev.Nsr = 0x00; SGCP.DevData.LaserTracing.MasterDev.Nsr = 0x00;
@@ -308,7 +309,7 @@ static void ReadDataLoopHandler(void)
memcpy(LocalDataPack, &SGCP.DevData.LaserTracing, sizeof(LocalDataPack)); memcpy(LocalDataPack, &SGCP.DevData.LaserTracing, sizeof(LocalDataPack));
DATA_DBG_LOG("<------------ Sensor Data Upda End ------------> \r\n"); DATA_DBG_LOG("<------------ Sensor Data Upda End ------------> \r\n");
//App.RDStatus = READDATA_STATUS_UPDAING;//持续工作 //App.RDStatus = READDATA_STATUS_UPDAING;//持续工作
App.RDStatus = READDATA_STATUS_IDLE; App.RDStatus = READDATA_STATUS_IDLE;
App.UpdateOk = true; App.UpdateOk = true;
break;} break;}
@@ -333,7 +334,7 @@ static void AppLoopHandler(void)
case APP_STATUS_ON:{ case APP_STATUS_ON:{
if(App.TD1mSDelayCnt <= 0){ if(App.TD1mSDelayCnt <= 0){
App.TD1mSDelayCnt = 300;//唤醒后待机时间 App.TD1mSDelayCnt = 300;//唤醒后待机时间
App.Status = APP_STATUS_ACTION; App.Status = APP_STATUS_ACTION;
} }
break;} break;}
@@ -348,15 +349,15 @@ static void AppLoopHandler(void)
if(SGCP.InStatus != IN_STATUS_IDLE){ if(SGCP.InStatus != IN_STATUS_IDLE){
break; break;
} }
else if(SGCP.LoginOk == false && App.LoginFlag == true && SGCP.GWStatus == GW_STATUS_IDLE)//设备注册 else if(SGCP.LoginOk == false && App.LoginFlag == true && SGCP.GWStatus == GW_STATUS_IDLE)//设备注册
{ {
PrintfMess(); PrintfMess();
App.LoginFlag = false; App.LoginFlag = false;
LPTimer0_OFF();//关闭低功耗定时器 LPTimer0_OFF();//关闭低功耗定时器
SGCP.GWStatus = GW_STATUS_LOGIN;//注册 SGCP.GWStatus = GW_STATUS_LOGIN;//注册
App.Status = APP_STATUS_WAIT_LOGIN; App.Status = APP_STATUS_WAIT_LOGIN;
} }
else if(SGCP.TimingAcquisition == true && App.RDStatus == READDATA_STATUS_IDLE)//设备数据获取 else if(SGCP.TimingAcquisition == true && App.RDStatus == READDATA_STATUS_IDLE)//设备数据获取
{ {
PrintfMess(); PrintfMess();
SGCP.TimingAcquisition = false; SGCP.TimingAcquisition = false;
@@ -368,23 +369,28 @@ static void AppLoopHandler(void)
{ {
PrintfMess(); PrintfMess();
App.UploadFlag = false; App.UploadFlag = false;
LPTimer0_OFF();//关闭低功耗定时器 LPTimer0_OFF();//关闭低功耗定时器
SGCP.GWStatus = GW_STATUS_UPLOAD_SENSOR;//上传 SGCP.GWStatus = GW_STATUS_UPLOAD_SENSOR;//上传
App.Status = APP_STATUS_WAIT_UPLOAD; App.Status = APP_STATUS_WAIT_UPLOAD;
} }
else if(SGCP.LaserOnOff == true && SGCP.LaserTimerMinutes > 0 && SGCP.LaserTimerCount == 0 && SGCP.GWStatus == GW_STATUS_IDLE)
{
SGCP.LaserOnOff = false;
SGCP.GWStatus = GW_STATUS_LASER_STARES;
}
else if(App.RDStatus == READDATA_STATUS_IDLE else if(App.RDStatus == READDATA_STATUS_IDLE
&& SGCP.GWStatus == GW_STATUS_IDLE && SGCP.GWStatus == GW_STATUS_IDLE
&& SGCP.InStatus == IN_STATUS_IDLE && SGCP.InStatus == IN_STATUS_IDLE
&& SGCP.TimingAcquisition == false && SGCP.TimingAcquisition == false
&& App.TD1mSDelayCnt == 0 && App.TD1mSDelayCnt == 0
&& App.ReadData1mSDelayCnt == 0 && App.ReadData1mSDelayCnt == 0
&& SGCP.LaserOnOff == false) && SGCP.LaserOnOff == false
&& App.AttTestMode == false)
{ {
//App.Status = APP_STATUS_ACTION;//持续工作 //App.Status = APP_STATUS_ACTION;
App.Status = APP_STATUS_OFF; App.Status = APP_STATUS_OFF;
} }
break;} break;}
case APP_STATUS_WAIT_LOGIN:{ case APP_STATUS_WAIT_LOGIN:{
if(SGCP.LoginMess == true) if(SGCP.LoginMess == true)
{ {
@@ -398,14 +404,14 @@ static void AppLoopHandler(void)
MAIN_DBG_LOG("Login RTC Open\r\n"); MAIN_DBG_LOG("Login RTC Open\r\n");
App.Login2Min30SCount = 0; App.Login2Min30SCount = 0;
App.Login30MinCount = 0; App.Login30MinCount = 0;
App.Login_RTC = true;//启动30分注册定时器 App.Login_RTC = true;//启动30分注册定时器
} }
else else
{ {
PrintfMess(); PrintfMess();
App.Login_LPTimer0 = true; App.Login_LPTimer0 = true;
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
//LPTimer0_ON(100);//定时10s //LPTimer0_ON(100);//定时10s
MAIN_DBG_LOG("Number of registration failures:%d\r\n",App.Login2Min30SCount); MAIN_DBG_LOG("Number of registration failures:%d\r\n",App.Login2Min30SCount);
MAIN_DBG_LOG("Login LPTimer0 Open\r\n"); MAIN_DBG_LOG("Login LPTimer0 Open\r\n");
} }
@@ -443,8 +449,8 @@ static void AppLoopHandler(void)
{ {
PrintfMess(); PrintfMess();
App.Upload_LPTimer0 = true; App.Upload_LPTimer0 = true;
LPTimer0_ON((App.Nonce % 100) + 450);//随机延时100~10000ms+45秒后重新发送 LPTimer0_ON((App.Nonce % 100) + 450);//随机延时100~10000ms+45秒后重新发送
//LPTimer0_ON(100);//定时10s //LPTimer0_ON(100);//定时10s
MAIN_DBG_LOG("Number of failed uploads:%d\r\n",App.Upload45S10SCount); MAIN_DBG_LOG("Number of failed uploads:%d\r\n",App.Upload45S10SCount);
MAIN_DBG_LOG("Upload LPTimer0 Open\r\n"); MAIN_DBG_LOG("Upload LPTimer0 Open\r\n");
} }
@@ -468,6 +474,8 @@ static void App1mSRoutine(void)
if(App.ReadData1mSDelayCnt > 0) if(App.ReadData1mSDelayCnt > 0)
App.ReadData1mSDelayCnt--; App.ReadData1mSDelayCnt--;
App.FeedDogDlyCnt++; App.FeedDogDlyCnt++;
if(App.AttTestMode == true && App.AttTestCnt > 0)
App.AttTestCnt--;
} }
void FeedDogHandler(void) void FeedDogHandler(void)
@@ -480,7 +488,7 @@ void FeedDogHandler(void)
void SystemResetHandler(void) void SystemResetHandler(void)
{ {
//系统定时重启 //系统定时重启
if(App.SysResetTimeCnt > SYSTEM_TIMING_LOGIN) { if(App.SysResetTimeCnt > SYSTEM_TIMING_LOGIN) {
delay_ms(5); delay_ms(5);
SystemReset(); SystemReset();
@@ -500,7 +508,7 @@ void SystemResetHandler(void)
int32_t main(void) int32_t main(void)
{ {
BspInit(); BspInit();
delay_ms(3000);//上电延时,等待从设备启动 delay_ms(3000);//上电延时,等待从设备启动
AppInit(); AppInit();
DBG_LOG("\r\n\r\n"); DBG_LOG("\r\n\r\n");
@@ -530,10 +538,29 @@ int32_t main(void)
GwRevLoopHandler(); GwRevLoopHandler();
InRevLoopHandler(); InRevLoopHandler();
AppLoopHandler(); AppLoopHandler();
#if(USE_DEBUG == 1)
if(App.AttTestMode == true)
{
if(App.AttTestCnt == 0)
{
App.AttTestCnt = 200;
SGCP.TimingAcquisition = true;
}
if(App.UpdateOk == true)
{
App.UpdateOk = false;
DBG_LOG("Pitch:%.1f Roll:%.1f Yaw:%.1f\r\n",
App.ConvertedData.Pitch / 10.0,
App.ConvertedData.Roll / 10.0,
App.ConvertedData.Yaw / 10.0);
}
}
#endif
} }
} }
/******************************************************************************* /*******************************************************************************
* 中断回调函数 * 中断回调函数
******************************************************************************/ ******************************************************************************/
void SysTick_CallBack(void) void SysTick_CallBack(void)
{ {
@@ -546,20 +573,20 @@ void SysTick_CallBack(void)
void RtcIRQHander(void) void RtcIRQHander(void)
{ {
//SGCP.TimingAcquisition = true; //30S更新一次数据 //SGCP.TimingAcquisition = true; //30S更新一次数据
if(SGCP.LoginOk == true) if(SGCP.LoginOk == true)
{ {
App.RepeLoginCount++; App.RepeLoginCount++;
if(App.RepeLoginCount >= SYSTEM_TIMING_LOGIN){ if(App.RepeLoginCount >= SYSTEM_TIMING_LOGIN){
MAIN_DBG_LOG("24h Repetition Login\r\n"); MAIN_DBG_LOG("24h Repetition Login\r\n");
App.RepeLoginCount = 0; App.RepeLoginCount = 0;
SGCP.LoginOk = false;//24h重复注册 SGCP.LoginOk = false;//24h重复注册
App.Login2Min30SCount = 0; App.Login2Min30SCount = 0;
App.Login30MinCount = 0; App.Login30MinCount = 0;
App.Login_RTC = false;//关闭30分注册定时器 App.Login_RTC = false;//关闭30分注册定时器
App.Login_LPTimer0 = true; App.Login_LPTimer0 = true;
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
MAIN_DBG_LOG("Login LPTimer0 Open\r\n"); MAIN_DBG_LOG("Login LPTimer0 Open\r\n");
} }
@@ -567,7 +594,7 @@ void RtcIRQHander(void)
if(App.Coll_N >= App.Para.Layout.CollectTime) if(App.Coll_N >= App.Para.Layout.CollectTime)
{ {
App.Coll_N = 0; App.Coll_N = 0;
SGCP.TimingAcquisition = true; //定时更新数据 SGCP.TimingAcquisition = true; //定时更新数据
} }
if(App.ERFlag == true) if(App.ERFlag == true)
@@ -583,7 +610,7 @@ void RtcIRQHander(void)
{ {
App.ERTime_N = 0; App.ERTime_N = 0;
App.ERFlag = false; App.ERFlag = false;
SGCP.MasterCaliOk = true;//紧急上报时间结束,重新校准参数 SGCP.MasterCaliOk = true;//紧急上报时间结束,重新校准参数
} }
} }
else{ else{
@@ -599,19 +626,24 @@ void RtcIRQHander(void)
if(App.Login_RTC == true) if(App.Login_RTC == true)
{ {
App.Login30MinCount++; App.Login30MinCount++;
if(App.Login30MinCount >= ERR_TIMING_LOGIN)//30分钟重置注册错误信息 if(App.Login30MinCount >= ERR_TIMING_LOGIN)//30分钟重置注册错误信息
{ {
PrintfMess(); PrintfMess();
App.Login30MinCount = 0; App.Login30MinCount = 0;
App.Login_RTC = false;//关闭30分注册定时器 App.Login_RTC = false;//关闭30分注册定时器
MAIN_DBG_LOG("Login RTC Close\r\n"); MAIN_DBG_LOG("Login RTC Close\r\n");
App.Login_LPTimer0 = true; App.Login_LPTimer0 = true;
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
//LPTimer0_ON(100);//定时10s //LPTimer0_ON(100);//定时10s
MAIN_DBG_LOG("Login LPTimer0 Open\r\n"); MAIN_DBG_LOG("Login LPTimer0 Open\r\n");
} }
} }
if(SGCP.LaserOnOff == true && SGCP.LaserTimerCount > 0)
{
SGCP.LaserTimerCount--;
}
} }
void LPTimer0IRQHander(void) void LPTimer0IRQHander(void)
{ {