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
This commit is contained in:
2026-07-20 17:04:48 +08:00
parent 70758b1c06
commit 72844ff821
20 changed files with 1388 additions and 1260 deletions
+194 -194
View File
@@ -1,50 +1,50 @@
#include "bsp.h"
#include "bsp.h"
#include "Algorithm.h"
#include "UartDebug.h"
/*****************************************************************************************
* 函数名称: check_peaks_valleys_ratio
* 功能描述: 检查数据的峰值是否大于0,谷值是否小于0(忽略0值)
* 参 数: data, 数据
length, 数据长度
* 返 回 值: 结果返回峰值谷值检查结果结构体
* 函数名称: check_peaks_valleys_ratio
* 功能描述: 检查数据的峰值是否大于0,谷值是否小于0(忽略0值)
* 参 数: data, 数据
length, 数据长度
* 返 回 值: 结果返回峰值谷值检查结果结构体
*****************************************************************************************/
PeakValleyCheck check_peaks_valleys(int data[], int length) {
PeakValleyCheck result = {true, true, 0, 0};
// 如果数据长度小于3,无法形成有效的峰值/谷值
// 如果数据长度小于3,无法形成有效的峰值/谷值
if (length < 3) {
return result;
}
int i = 0;
// 跳过开头的0值
// 跳过开头的0值
while (i < length && data[i] == 0) {
i++;
}
// 遍历数据点
// 遍历数据点
while (i < length) {
// 1. 寻找下一个非零点作为起点
// 1. 寻找下一个非零点作为起点
int start = i;
while (i < length && data[i] == 0) {
i++;
}
if (i >= length) break;
// 2. 寻找当前非零段的结束点
// 2. 寻找当前非零段的结束点
int end = i;
while (end < length && data[end] != 0) {
end++;
}
end--; // 指向最后一个非零点
end--; // 指向最后一个非零点
// 3. 在当前非零段中检测峰值和谷值
// 3. 在当前非零段中检测峰值和谷值
for (int j = i; j <= end; j++) {
// 跳过边界点
// 跳过边界点
if (j == i || j == end) continue;
// 检查是否为峰值(大于左右相邻的非零点)
// 检查是否为峰值(大于左右相邻的非零点)
if (data[j] > data[j-1] && data[j] > data[j+1]) {
result.peak_count++;
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]) {
result.valley_count++;
if (data[j] >= 0) {
@@ -61,33 +61,33 @@ PeakValleyCheck check_peaks_valleys(int data[], int length) {
}
}
// 移动到下一段
// 移动到下一段
i = end + 1;
}
return result;
}
/*****************************************************************************************
* 函数名称: analyze_trend
* 功能描述: 趋势分析函数
* 参 数: data, 数据
length, 数据长度
* 返 回 值: 结果返回趋势分析结构体
* 函数名称: analyze_trend
* 功能描述: 趋势分析函数
* 参 数: data, 数据
length, 数据长度
* 返 回 值: 结果返回趋势分析结构体
*****************************************************************************************/
TrendResult analyze_trend(int data[], int length) {
TrendResult result = {0};
#if 1
// 0. 检查有效数据长度
// 0. 检查有效数据长度
if (length < 2) {
DBG_LOG("Data deficient\r\n");
return result;
}
// 1. 计算线性回归斜率
// 1. 计算线性回归斜率
double sum_x = 0, sum_y = 0, sum_xy = 0, sum_x2 = 0;
for (int i = 0; i < length; i++) {
double x = i; // 时间序列 (0,1,2,...)
double x = i; // 时间序列 (0,1,2,...)
double y = data[i];
sum_x += x;
sum_y += y;
@@ -98,15 +98,15 @@ TrendResult analyze_trend(int data[], int length) {
double numerator = length * sum_xy - sum_x * sum_y;
double denominator = length * sum_x2 - sum_x * sum_x;
// 处理分母为零的情况
// 处理分母为零的情况
if (fabs(denominator) > 1e-10) {
result.slope = numerator / denominator;
}
#endif
#if 0
// 2. 计算振荡特征(差分符号变化次数)
// 2. 计算振荡特征(差分符号变化次数)
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++) {
int diff = data[i] - data[i-1];
@@ -122,66 +122,66 @@ TrendResult analyze_trend(int data[], int length) {
result.sign_changes = sign_changes;
#endif
#if 0
// 3. 动态计算阈值(基于数据长度)
int oscillation_threshold = (int)(0.4 * (length - 1)); // 40%的变化率
double slope_threshold = 0.05 * (length / 20.0); // 长度标准化
// 3. 动态计算阈值(基于数据长度)
int oscillation_threshold = (int)(0.4 * (length - 1)); // 40%的变化率
double slope_threshold = 0.05 * (length / 20.0); // 长度标准化
#endif
#if 0
// 4. 趋势判断
// 4. 趋势判断
if (sign_changes >= oscillation_threshold) {
//DBG_LOG("Oscillating trend\r\n");//振荡趋势
//DBG_LOG("Oscillating trend\r\n");//振荡趋势
result.trend_type = 0;
} else if (fabs(result.slope) < slope_threshold) {
//DBG_LOG("Smooth trend\r\n");//平稳趋势
//DBG_LOG("Smooth trend\r\n");//平稳趋势
result.trend_type = 1;
} else if (result.slope > 0) {
//DBG_LOG("Up trend\r\n");//上升趋势
//DBG_LOG("Up trend\r\n");//上升趋势
result.trend_type = 2;
} else {
//DBG_LOG("Down trend\r\n");//下降趋势
//DBG_LOG("Down trend\r\n");//下降趋势
result.trend_type = 3;
}
#endif
#if 0
// 5. 陡峭判断
// 5. 陡峭判断
double abs_slope = fabs(result.slope);
if (abs_slope > 0.8) {
//DBG_LOG("Steeply");//陡峭
//DBG_LOG("Steeply");//陡峭
result.sign_changes = 0;
} else if (abs_slope > 0.3) {
//DBG_LOG("Obvious");//明显
//DBG_LOG("Obvious");//明显
result.sign_changes = 1;
} else if (abs_slope > 0.1) {
//DBG_LOG("Mild");//温和
//DBG_LOG("Mild");//温和
result.sign_changes = 2;
} else {
//DBG_LOG("gentle");//平缓
//DBG_LOG("gentle");//平缓
result.sign_changes = 3;
}
#endif
return result;
}
/*****************************************************************************************
* 函数名称: calculateAverage
* 功能描述: 计算平均值
* 参 数: arr, 数据
size, 数据长度
* 返 回 值: 结果返回 long long 防溢出
* 函数名称: calculateAverage
* 功能描述: 计算平均值
* 参 数: arr, 数据
size, 数据长度
* 返 回 值: 结果返回 long long 防溢出
*****************************************************************************************/
float calculateAverage(int *arr, int size)
{
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i]; // 累加数组中的每个元素
sum += arr[i]; // 累加数组中的每个元素
}
return (float)sum / size; // 返回平均值
return (float)sum / size; // 返回平均值
}
/*****************************************************************************************
* 函数名称: slope
* 功能描述: 计算斜率
* 参 数: x_data, x轴数据
y_data, y轴数据
* 返 回 值: 结果返回 long long 防溢出
* 函数名称: slope
* 功能描述: 计算斜率
* 参 数: x_data, x轴数据
y_data, y轴数据
* 返 回 值: 结果返回 long long 防溢出
*****************************************************************************************/
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;
}
/*****************************************************************************************
* 函数名称: power
* 功能描述: 快速幂算法
* 参 数: base, 滤波数据
exponent, 滤波数据长度
* 返 回 值: 结果返回 long long 防溢出
* 函数名称: power
* 功能描述: 快速幂算法
* 参 数: base, 滤波数据
exponent, 滤波数据长度
* 返 回 值: 结果返回 long long 防溢出
*****************************************************************************************/
long long power(int base, unsigned int exponent) {
long long result = 1;
while (exponent > 0) {
if (exponent % 2 == 1) {
result *= base; // 指数为奇数时累乘
result *= base; // 指数为奇数时累乘
}
base *= base; // 底数平方
exponent /= 2; // 指数折半
base *= base; // 底数平方
exponent /= 2; // 指数折半
}
return result;
}
/*****************************************************************************************
* 函数名称: IntFilter_16t
* 功能描述: 16位数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的16位数据
* 函数名称: IntFilter_16t
* 功能描述: 16位数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的16位数据
*****************************************************************************************/
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
* 功能描述: 32位数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据
* 函数名称: IntFilter_32t
* 功能描述: 32位数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据
*****************************************************************************************/
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));
}
/*****************************************************************************************
* 函数名称: IntFilter_u32t
* 功能描述: 32位无符号位数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据
* 函数名称: IntFilter_u32t
* 功能描述: 32位无符号位数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据
*****************************************************************************************/
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));
}
/*****************************************************************************************
* 函数名称: IntFilter_Float
* 功能描述: 32位浮点数数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据
* 函数名称: IntFilter_Float
* 功能描述: 32位浮点数数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据
*****************************************************************************************/
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));
}
/*****************************************************************************************
* 函数名称: AverageFilter_u32t
* 功能描述: 32位数据均值滤波函数,去除了最大值和最小值
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
* 返 回 值: 滤波后的32位数据
* 函数名称: AverageFilter_u32t
* 功能描述: 32位数据均值滤波函数,去除了最大值和最小值
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
* 返 回 值: 滤波后的32位数据
*****************************************************************************************/
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;
}
for (uint8_t i = 0; i < Cnt; i++)//找出最大值
for (uint8_t i = 0; i < Cnt; i++)//找出最大值
{
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)
{
@@ -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];
}
@@ -384,11 +384,11 @@ uint32_t AverageFilter_u32t(uint32_t *Data, uint8_t Cnt)
}
/*****************************************************************************************
* 函数名称: AverageFilter_32t
* 功能描述: 32位数据均值滤波函数,去除了最大值和最小值
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
* 返 回 值: 滤波后的32位数据
* 函数名称: AverageFilter_32t
* 功能描述: 32位数据均值滤波函数,去除了最大值和最小值
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
* 返 回 值: 滤波后的32位数据
*****************************************************************************************/
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;
}
for (uint8_t i = 0; i < Cnt; i++)//找出最大值
for (uint8_t i = 0; i < Cnt; i++)//找出最大值
{
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)
{
@@ -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];
}
return (sum - max - min) / (Cnt - 2);
}
/*****************************************************************************************
* 函数名称: Fitting_Polynomial
* 功能描述: 根据数组AD[], Actual[]列出的一组数据,用最小二乘法求它的拟合曲线,默认3阶
近似解析表达式为y = a3*x^3 + a2*x^2 + a1*x + a0;
* 参 数: AD, AD芯片采样值
Actual, 实际标校值
Cnt, 拟合数据个数
* 返 回 值: 无
* 函数名称: Fitting_Polynomial
* 功能描述: 根据数组AD[], Actual[]列出的一组数据,用最小二乘法求它的拟合曲线,默认3阶
近似解析表达式为y = a3*x^3 + a2*x^2 + a1*x + a0;
* 参 数: AD, AD芯片采样值
Actual, 实际标校值
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];
int i, j, k;
@@ -460,22 +460,22 @@ void Fitting_Polynomial(double *AD, double *Actual, uint8_t Cnt)
atemp[0] = Cnt;
for(i = 0; i < rank_ + 1; i++){ //构建线性方程组系数矩阵,b[]不变
for(i = 0; i < rank_ + 1; i++){ //构建线性方程组系数矩阵,b[]不变
k = i;
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;
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){
mainelement = fabs(a[i][k]);
column = i;
}
for(j = k; j < rank_ + 1; j++){ //交换两行
for(j = k; j < rank_ + 1; j++){ //交换两行
double atemp = a[k][j];
a[k][j] = a[column][j];
a[column][j] = atemp;
@@ -484,19 +484,19 @@ void Fitting_Polynomial(double *AD, double *Actual, uint8_t Cnt)
b[k] = b[column];
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];
for(j = k; j < rank_ + 1; j++) a[i][j] -= Mik * a[k][j];
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--){
double sum = 0;
for(j = i + 1; j < rank_ + 1; j++) sum += a[i][j] * b[j];
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]);
@@ -507,46 +507,46 @@ void Fitting_Polynomial(double *AD, double *Actual, uint8_t Cnt)
}
/*****************************************************************************************
* 函数名称: get_K
* 功能描述: 斜率计算
* 参 数: count,数据个数 数组行(列)的个数 数组的行列数目相等
dataCol_X[count],数据的列数据
dataRow_Y[count],数据的行数据
* 返 回 值: k 斜率
* 函数名称: get_K
* 功能描述: 斜率计算
* 参 数: count,数据个数 数组行(列)的个数 数组的行列数目相等
dataCol_X[count],数据的列数据
dataRow_Y[count],数据的行数据
* 返 回 值: k 斜率
*****************************************************************************************/
float get_K(uint8_t count , int32_t *dataCol_X, int32_t *dataRow_Y)
{
float k = 0;//斜率
float aveCol_X = 0;//列的平均值x
float aveRow_Y = 0;//行的平均值y
int32_t sum_XY = 0;//行列的总和xy
int32_t sumRow_Y = 0;//行的总和y
int32_t sumCol_X = 0;//列的总和x
int32_t sumCol_X2 = 0;//列的总和x^2
float k = 0;//斜率
float aveCol_X = 0;//列的平均值x
float aveRow_Y = 0;//行的平均值y
int32_t sum_XY = 0;//行列的总和xy
int32_t sumRow_Y = 0;//行的总和y
int32_t sumCol_X = 0;//列的总和x
int32_t sumCol_X2 = 0;//列的总和x^2
for(uint16_t i = 0 ; i < count ; i++)
{
sumCol_X += dataCol_X[i];//求列x的总和
sumRow_Y += dataRow_Y[i];//求行y的总和
sumCol_X2 += dataCol_X[i] * dataCol_X[i];//求x^2的总和
sum_XY += (dataCol_X[i] * dataRow_Y[i]);//求xy的总和
sumCol_X += dataCol_X[i];//求列x的总和
sumRow_Y += dataRow_Y[i];//求行y的总和
sumCol_X2 += dataCol_X[i] * dataCol_X[i];//求x^2的总和
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;
k = (sum_XY - aveCol_X * aveRow_Y * count) / //根据公式求斜率
k = (sum_XY - aveCol_X * aveRow_Y * count) / //根据公式求斜率
(sumCol_X2 - aveCol_X * aveCol_X * count);
return k;
}
/*****************************************************************************************
* 函数名称: TrendAnalyse
* 功能描述: 判断数组中的值的总体趋势
* 参 数: Data,
* 函数名称: TrendAnalyse
* 功能描述: 判断数组中的值的总体趋势
* 参 数: Data,
Cnt,
VPT,
* 返 回 值: true或false
* 返 回 值: true或false
*****************************************************************************************/
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)))
Trend = 0;//振荡趋势
Trend = 0;//振荡趋势
else if(plus > (Cnt-(Cnt/ 5)))
Trend = 1;//上升趋势
Trend = 1;//上升趋势
else if(minus > (Cnt-(Cnt/ 5)))
Trend = -1;//下降趋势
Trend = -1;//下降趋势
return Trend;//总趋势
return Trend;//总趋势
}
/*****************************************************************************************
* 函数名称: Waveform_Up
* 功能描述: 找出一段波形的波峰值
dCnt, 波形数据长度
pCnt, 要查找波峰数
vlue, 返回的波峰值
* 返 回 值: true或false
* 函数名称: Waveform_Up
* 功能描述: 找出一段波形的波峰值
dCnt, 波形数据长度
pCnt, 要查找波峰数
vlue, 返回的波峰值
* 返 回 值: true或false
*****************************************************************************************/
void Waveform_Up(int32_t *Data, uint8_t dCnt, uint8_t pCnt, int32_t *vlue)
{
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])
{
@@ -605,17 +605,17 @@ void Waveform_Up(int32_t *Data, uint8_t dCnt, uint8_t pCnt, int32_t *vlue)
}
}
/*****************************************************************************************
* 函数名称: Waveform_Down
* 功能描述: 找出一段波形的波谷值
dCnt, 波形数据长度
pCnt, 要查找波谷数
vlue, 返回的波谷值
* 返 回 值: true或false
* 函数名称: Waveform_Down
* 功能描述: 找出一段波形的波谷值
dCnt, 波形数据长度
pCnt, 要查找波谷数
vlue, 返回的波谷值
* 返 回 值: true或false
*****************************************************************************************/
void Waveform_Down(int32_t *Data, uint8_t dCnt, uint8_t pCnt, int32_t *vlue)
{
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])
{
@@ -630,12 +630,12 @@ void Waveform_Down(int32_t *Data, uint8_t dCnt, uint8_t pCnt, int32_t *vlue)
}
}
/*****************************************************************************************
* 函数名称: count_most_greater
* 功能描述: 判断数组中的值是否大部分大于 target
* 参 数: arr,
* 函数名称: count_most_greater
* 功能描述: 判断数组中的值是否大部分大于 target
* 参 数: arr,
size,
target,
* 返 回 值: true或false
* 返 回 值: true或false
*****************************************************************************************/
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;
}
/*****************************************************************************************
* 函数名称: count_greater
* 功能描述: 判断数组中的值是否全部大于 target
* 参 数: arr,
* 函数名称: count_greater
* 功能描述: 判断数组中的值是否全部大于 target
* 参 数: arr,
size,
target,
* 返 回 值: true或false
* 返 回 值: true或false
*****************************************************************************************/
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;
}
/*****************************************************************************************
* 函数名称: count_smaller
* 功能描述: 判断数组中的值是否全部小于 target
* 参 数: arr,
* 函数名称: count_smaller
* 功能描述: 判断数组中的值是否全部小于 target
* 参 数: arr,
size,
target,
* 返 回 值: true或false
* 返 回 值: true或false
*****************************************************************************************/
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
* 功能描述: CRC16计算函数
* 参 数: wBase, 多项式
Para,校验数据入口
Data, 校验数据长度入口
* 返 回 值: crc16校验值
* 函数名称: CRC_Modbus
* 功能描述: CRC16计算函数
* 参 数: wBase, 多项式
Para,校验数据入口
Data, 校验数据长度入口
* 返 回 值: crc16校验值
*****************************************************************************************/
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
* 功能描述: 从第二个字节开始,求和取反
* 参 数: _pbuff,校验数据入口
_cmdLen,校验数据长度入口
* 返 回 值: cmd_sum,校验值(一个字节)
* 函数名称: CRC_Sum
* 功能描述: 从第二个字节开始,求和取反
* 参 数: _pbuff,校验数据入口
_cmdLen,校验数据长度入口
* 返 回 值: cmd_sum,校验值(一个字节)
*****************************************************************************************/
uint8_t CRC_Sum(uint8_t *_pbuff, uint16_t _cmdLen)
{
uint8_t cmd_sum=0;
uint16_t i;
for(i=1;i<_cmdLen;i++)//从1开始,跳过第一个字节
for(i=1;i<_cmdLen;i++)//从1开始,跳过第一个字节
{
cmd_sum += _pbuff[i];
}
@@ -730,12 +730,12 @@ uint8_t CRC_Sum(uint8_t *_pbuff, uint16_t _cmdLen)
return cmd_sum;
}
/**
* @brief 检查缓冲区是否全部等于指定字节值
* @param data : 待检查的数据指针
* @param len : 数据长度(字节数)
* @param val : 期望的字节值 (0x00 ~ 0xFF)
* @return true : 全部等于 val
* false: 存在不等于 val 的字节
* @brief 检查缓冲区是否全部等于指定字节值
* @param data : 待检查的数据指针
* @param len : 数据长度(字节数)
* @param val : 期望的字节值 (0x00 ~ 0xFF)
* @return true : 全部等于 val
* false: 存在不等于 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;
}
/*****************************************************************************************
* 函数名称: HexToAscii
* 功能描述: 16进制转ASCII码
* 参 数: HexData16进制数组
ASCDataASCII码
sLen,数据长度
* 返 回 值: true或false
* 函数名称: HexToAscii
* 功能描述: 16进制转ASCII码
* 参 数: HexData16进制数组
ASCDataASCII码
sLen,数据长度
* 返 回 值: true或false
*****************************************************************************************/
void HexToAscii(uint8_t *HexData, char *ASCData, uint8_t sLen)
{
+209 -209
View File
@@ -1,37 +1,37 @@
#include "SGCP.h"
#include "SGCP.h"
#include "main.h"
#include "UartDebug.h"
#include "Update.h"
#include "sx127x.h"
#include "Algorithm.h"
/*烧录时配置项
IROM1起始地址 0x00 0x20000
IROM1串口升级地址 0x2A00 0x1D600
串口升级打开USE_BOOTLOADER和点s文件中的LDR R2, =new_vect_table ;升级时打开
/*烧录时配置项
IROM1起始地址 0x00 0x20000
IROM1串口升级地址 0x2A00 0x1D600
串口升级打开USE_BOOTLOADER和点s文件中的LDR R2, =new_vect_table ;升级时打开
*/
uint32_t LocalType; //本机设备类型
uint32_t CommWay; //本机通讯方式
uint32_t DeviceSign; //本机设备标志
uint32_t AddNumber; //本机地址编号,数字部分对应唯一地址编号
uint32_t LocalType; //本机设备类型
uint32_t CommWay; //本机通讯方式
uint32_t DeviceSign; //本机设备标志
uint32_t AddNumber; //本机地址编号,数字部分对应唯一地址编号
//09 00 01 00 00 00
uint8_t LocalMAC[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};//本机MAC地址
uint8_t GatewayMAC[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //网关MAC地址,注册时全为0
uint8_t LocalDataPack[sizeof(SGCP.DevData.LaserTracing)]; //本机数据包
uint8_t LocalDataLen = sizeof(SGCP.DevData.LaserTracing); //本机设备数据长度
uint8_t LocalMAC[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};//本机MAC地址
uint8_t GatewayMAC[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //网关MAC地址,注册时全为0
uint8_t LocalDataPack[sizeof(SGCP.DevData.LaserTracing)]; //本机数据包
uint8_t LocalDataLen = sizeof(SGCP.DevData.LaserTracing); //本机设备数据长度
SGCP_t SGCP;
/**
*******************************************************************************
** \brief 设备数据信息获取
** \brief 设备数据信息获取
**
** \param Devtype 设备类型
** \param Devtype 设备类型
**
** \param PayLoad 数据体
** \param PayLoad 数据体
**
** \retval Len 数据长度
** \retval Len 数据长度
******************************************************************************/
static uint8_t DevGetDataMess(DEVICE_TYPE_M Devtype, uint8_t *PayLoad)
{
@@ -108,13 +108,13 @@ static uint8_t DevGetDataMess(DEVICE_TYPE_M Devtype, uint8_t *PayLoad)
}
/**
*******************************************************************************
** \brief 子设备校准指令
** \brief 子设备校准指令
**
** \param [in] Addr 子设备地址
** \param [in] Addr 子设备地址
**
** \param [in] PayLoad 数据体
** \param [in] PayLoad 数据体
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToSDCali(uint8_t Addr)
{
@@ -140,13 +140,13 @@ static void ToSDCali(uint8_t Addr)
}
/**
*******************************************************************************
** \brief 子设备读取数据指令
** \brief 子设备读取数据指令
**
** \param [in] Addr 子设备地址
** \param [in] Addr 子设备地址
**
** \param [in] PayLoad 数据体
** \param [in] PayLoad 数据体
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToSDReadData(uint8_t Addr)
{
@@ -172,13 +172,13 @@ static void ToSDReadData(uint8_t Addr)
}
/**
*******************************************************************************
** \brief 子设备查询指令
** \brief 子设备查询指令
**
** \param [in] Addr 子设备485地址
** \param [in] Addr 子设备485地址
**
** \param [in] PayLoad 数据体
** \param [in] PayLoad 数据体
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToSDInquire(uint8_t Addr)
{
@@ -204,13 +204,13 @@ static void ToSDInquire(uint8_t Addr)
}
/**
*******************************************************************************
** \brief 子设备设置采集时间间隔指令
** \brief 子设备设置采集时间间隔指令
**
** \param [in] Addr 子设备地址
** \param [in] Addr 子设备地址
**
** \param [in] CollTime 采集时间间隔
** \param [in] CollTime 采集时间间隔
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToSDSetColTime(uint8_t Addr, uint16_t CollectInterval)
{
@@ -239,13 +239,13 @@ static void ToSDSetColTime(uint8_t Addr, uint16_t CollectInterval)
}
/**
*******************************************************************************
** \brief 子设备时间同步指令
** \brief 子设备时间同步指令
**
** \param [in] Addr 子设备地址
** \param [in] Addr 子设备地址
**
** \param [in] PayLoad 数据体
** \param [in] PayLoad 数据体
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToSDSyncTime(uint8_t Addr, uint32_t TimeStamp)
{
@@ -277,13 +277,13 @@ static void ToSDSyncTime(uint8_t Addr, uint32_t TimeStamp)
/**
*******************************************************************************
** \brief 子设备校准回应
** \brief 子设备校准回应
**
** \param [in] Addr 子设备地址
** \param [in] Addr 子设备地址
**
** \param [in] Ok_Err 成功失败标志位
** \param [in] Ok_Err 成功失败标志位
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToMDCaliRes(uint8_t Addr, bool Ok_Err)
{
@@ -311,13 +311,13 @@ static void ToMDCaliRes(uint8_t Addr, bool Ok_Err)
}
/**
*******************************************************************************
** \brief 子设备读取数据指令回应
** \brief 子设备读取数据指令回应
**
** \param [in] Addr 子设备地址
** \param [in] Addr 子设备地址
**
** \param [in] PayLoad 数据体
** \param [in] PayLoad 数据体
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToMDReadDataRes(uint8_t Addr, uint8_t *PayLoad, uint8_t Len)
{
@@ -348,13 +348,13 @@ static void ToMDReadDataRes(uint8_t Addr, uint8_t *PayLoad, uint8_t Len)
}
/**
*******************************************************************************
** \brief 子设备查询指令回应
** \brief 子设备查询指令回应
**
** \param [in] Addr 子设备485地址
** \param [in] Addr 子设备485地址
**
** \param [in] PayLoad 数据体
** \param [in] PayLoad 数据体
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToMDInquireRes(uint8_t Addr)
{
@@ -385,13 +385,13 @@ static void ToMDInquireRes(uint8_t Addr)
}
/**
*******************************************************************************
** \brief 子设备设置采集时间间隔指令回应
** \brief 子设备设置采集时间间隔指令回应
**
** \param [in] Addr 子设备地址
** \param [in] Addr 子设备地址
**
** \param [in] Ok_Err 成功失败标志位
** \param [in] Ok_Err 成功失败标志位
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToMDSetColTimeRes(uint8_t Addr, bool Ok_Err)
{
@@ -419,13 +419,13 @@ static void ToMDSetColTimeRes(uint8_t Addr, bool Ok_Err)
}
/**
*******************************************************************************
** \brief 子设备时间同步指令回应
** \brief 子设备时间同步指令回应
**
** \param [in] Addr 子设备地址
** \param [in] Addr 子设备地址
**
** \param [in] Ok_Err 成功失败标志位
** \param [in] Ok_Err 成功失败标志位
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToMDSyncTimeRes(uint8_t Addr, bool Ok_Err)
{
@@ -455,11 +455,11 @@ static void ToMDSyncTimeRes(uint8_t Addr, bool Ok_Err)
/**
*******************************************************************************
** \brief 向网关申请注册
** \brief 向网关申请注册
**
** \param PayLoad 数据体
** \param PayLoad 数据体
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToGWDevLogin(void)
{
@@ -499,11 +499,11 @@ static void ToGWDevLogin(void)
}
/**
*******************************************************************************
** \brief 网关校准指令回应
** \brief 网关校准指令回应
**
** \param Ok_Err 成功失败标志位
** \param Ok_Err 成功失败标志位
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToGWCaliRes(bool Ok_Err)
{
@@ -538,11 +538,11 @@ SGCP.GWRS485Rx.sCmdMDToGW = (GWTOMD_CMD_M)GFHeader->Cmd;
/**
*******************************************************************************
** \brief 信号质量查询指令
** \brief 信号质量查询指令
**
** \param 无
** \param 无
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToGWSignalQuery(void)
{
@@ -574,11 +574,11 @@ static void ToGWSignalQuery(void)
}
/**
*******************************************************************************
** \brief 网关读取数据指令回应
** \brief 网关读取数据指令回应
**
** \param PayLoad 数据体
** \param PayLoad 数据体
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToGWReadDataRes(uint8_t *PayLoad)
{
@@ -615,11 +615,11 @@ SGCP.GWRS485Rx.sCmdMDToGW = (GWTOMD_CMD_M)GFHeader->Cmd;
/**
*******************************************************************************
** \brief 网关设置采集时间间隔指令回应
** \brief 网关设置采集时间间隔指令回应
**
** \param Ok_Err 成功失败标志位
** \param Ok_Err 成功失败标志位
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToGWSetColTimeRes(bool Ok_Err)
{
@@ -654,11 +654,11 @@ SGCP.GWRS485Rx.sCmdMDToGW = (GWTOMD_CMD_M)GFHeader->Cmd;
/**
*******************************************************************************
** \brief 网关时间同步指令回应
** \brief 网关时间同步指令回应
**
** \param Ok_Err 成功失败标志位
** \param Ok_Err 成功失败标志位
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToGWSyncTimeRes(bool Ok_Err)
{
@@ -692,11 +692,11 @@ SGCP.GWRS485Rx.sCmdMDToGW = (GWTOMD_CMD_M)GFHeader->Cmd;
}
/**
*******************************************************************************
** \brief 内部指令修改RS485地址回应
** \brief 内部指令修改RS485地址回应
**
** \param PayLoad 数据体
** \param PayLoad 数据体
**
** \retval 无
** \retval 无
******************************************************************************/
static void Alter485AddrRes(uint8_t *MAC, bool Ok_Err)
{
@@ -723,11 +723,11 @@ static void Alter485AddrRes(uint8_t *MAC, bool Ok_Err)
}
/**
*******************************************************************************
** \brief 主设备接收子设备数据处理
** \brief 主设备接收子设备数据处理
**
** \param 无
** \param 无
**
** \retval 无
** \retval 无
******************************************************************************/
static void SubsetRevHandler(void)
{
@@ -759,7 +759,7 @@ static void SubsetRevHandler(void)
break;}
case MDTOSD_CMD_INQUIRE:{
memcpy(&SGCP.DeviceMAC[SGCP.DeviceN], PayLoad, sizeof(SGCP.DeviceMAC[SGCP.DeviceN]));//子设备MAC
memcpy(&SGCP.DeviceMAC[SGCP.DeviceN], PayLoad, sizeof(SGCP.DeviceMAC[SGCP.DeviceN]));//子设备MAC
SGCP.SubsetMACOk = true;
break;}
@@ -774,11 +774,11 @@ static void SubsetRevHandler(void)
}
/**
*******************************************************************************
** \brief 子设备接收主设备数据处理
** \brief 子设备接收主设备数据处理
**
** \param 无
** \param 无
**
** \retval 无
** \retval 无
******************************************************************************/
static void MasRevHandler(void)
{
@@ -858,9 +858,9 @@ static void MasRevHandler(void)
App.Para.Layout.CollectTime = temp;
SAVE_APP_PARA((uint32_t *)&App.Para);
if(App.Para.Layout.CollectTime >= 30)
RTCInit(30);//定时采集时间重新初始化
RTCInit(30);//定时采集时间重新初始化
else
RTCInit(App.Para.Layout.CollectTime);//定时采集时间重新初始化
RTCInit(App.Para.Layout.CollectTime);//定时采集时间重新初始化
if(SGCP.MasStatus == MAS_STATUS_IDLE)
{
SGCP.MasStatus = MAS_STATUS_SET_COL_TIME;
@@ -883,7 +883,7 @@ static void MasRevHandler(void)
{
App.Para.Layout.TimeStamp = temp;
SAVE_APP_PARA((uint32_t *)&App.Para);
TimeSync(App.Para.Layout.TimeStamp); //设置时间
TimeSync(App.Para.Layout.TimeStamp); //设置时间
if(SGCP.MasStatus == MAS_STATUS_IDLE)
{
SGCP.MasStatus = MAS_STATUS_SYNC_TIME;
@@ -894,11 +894,11 @@ static void MasRevHandler(void)
}
/**
*******************************************************************************
** \brief 主设备接收网关数据处理
** \brief 主设备接收网关数据处理
**
** \param 无
** \param 无
**
** \retval 无
** \retval 无
******************************************************************************/
static void GWRevHandler(void)
{
@@ -969,12 +969,12 @@ static void GWRevHandler(void)
{
App.Para.Layout.TimeStamp = LPay->TimeStamp;
int8_t TimeDiff;//时间差
int8_t TimeDiff;//时间差
int RTCTimes = TimeTs();
TimeDiff = App.Para.Layout.TimeStamp - RTCTimes;
if(TimeDiff > 1 || TimeDiff < -1)
{
TimeSync(App.Para.Layout.TimeStamp); //向通讯单元RTC时间寄存器写入时间网关下发的时间
TimeSync(App.Para.Layout.TimeStamp); //向通讯单元RTC时间寄存器写入时间网关下发的时间
}
SGCP.UploadOk = true;
SGCP.NextGWStatus = GW_STATUS_IDLE;
@@ -993,12 +993,12 @@ static void GWRevHandler(void)
LPay->ERInterval,
LPay->ERTime);
int8_t TimeDiff;//时间差
int8_t TimeDiff;//时间差
int RTCTimes = TimeTs();
TimeDiff = App.Para.Layout.TimeStamp - RTCTimes;
if(TimeDiff > 1 || TimeDiff < -1)
{
TimeSync(App.Para.Layout.TimeStamp); //向通讯单元RTC时间寄存器写入时间网关下发的时间
TimeSync(App.Para.Layout.TimeStamp); //向通讯单元RTC时间寄存器写入时间网关下发的时间
}
SGCP.UploadOk = true;
SGCP.NextGWStatus = GW_STATUS_UPLOAD_SENSOR;
@@ -1071,7 +1071,7 @@ static void GWRevHandler(void)
}
App.Para.Layout.TimeStamp = temp;
SAVE_APP_PARA((uint32_t *)&App.Para);
TimeSync(App.Para.Layout.TimeStamp); //设置时间
TimeSync(App.Para.Layout.TimeStamp); //设置时间
}
}
break;}
@@ -1116,11 +1116,11 @@ static void GWRevHandler(void)
}
/**
*******************************************************************************
** \brief 内部指令指令数据接收处理
** \brief 内部指令指令数据接收处理
**
** \param 无
** \param 无
**
** \retval 无
** \retval 无
******************************************************************************/
static void InRevHandler(void)
{
@@ -1172,14 +1172,14 @@ static void InRevHandler(void)
break;}
}
}
#if (SGCP_SELECT == 0)//本机为单个主设备接多个子设备
#if (SGCP_SELECT == 0)//本机为单个主设备接多个子设备
/**
*******************************************************************************
** \brief 接收子设备数据状态机
** \brief 接收子设备数据状态机
**
** \param 无
** \param 无
**
** \retval 无
** \retval 无
******************************************************************************/
void SubRevLoopHandler(void)
{
@@ -1293,8 +1293,8 @@ void SubRevLoopHandler(void)
SGCP.Subset_IRQ_Status = false;
memset(&SGCP.Dev485Addrs, NULL, sizeof(SGCP.Dev485Addrs));
memset(&SGCP.DeviceMAC, NULL, sizeof(SGCP.DeviceMAC));
SGCP.Dev485Addrs[SGCP.DeviceN] = SGCP.Dev485Addr;//主设备485
memcpy(SGCP.DeviceMAC[SGCP.DeviceN], LocalMAC, sizeof(LocalMAC));//主设备MAC
SGCP.Dev485Addrs[SGCP.DeviceN] = SGCP.Dev485Addr;//主设备485
memcpy(SGCP.DeviceMAC[SGCP.DeviceN], LocalMAC, sizeof(LocalMAC));//主设备MAC
DBG_LOG("Master Device MAC:%02X %02X %02X %02X %02X %02X\r\n",
SGCP.DeviceMAC[SGCP.DeviceN][0],SGCP.DeviceMAC[SGCP.DeviceN][1],SGCP.DeviceMAC[SGCP.DeviceN][2],
SGCP.DeviceMAC[SGCP.DeviceN][3],SGCP.DeviceMAC[SGCP.DeviceN][4],SGCP.DeviceMAC[SGCP.DeviceN][5]);
@@ -1363,11 +1363,11 @@ void SubRevLoopHandler(void)
/**
*******************************************************************************
** \brief 接收网关数据状态机
** \brief 接收网关数据状态机
**
** \param 无
** \param 无
**
** \retval 无
** \retval 无
******************************************************************************/
void GwRevLoopHandler(void)
{
@@ -1441,14 +1441,14 @@ void GwRevLoopHandler(void)
ToGWCaliRes(SGCP.MasterCaliOk);
DBG_LOG("Alone Cali Ok!\r\n");
}
SGCP.TimingAcquisition = true;//采集新的传感器数据
SGCP.TimingAcquisition = true;//采集新的传感器数据
break;}
case GW_STATUS_READ_SENSOR:{
PrintfMess();
ToGWReadDataRes(SGCP.DeviceData);
DBG_LOG("Upload data Ok!\r\n");
SGCP.TimingAcquisition = true;//采集新的传感器数据
SGCP.TimingAcquisition = true;//采集新的传感器数据
SGCP.GWStatus = GW_STATUS_WAIT_SUBIDLE;
SGCP.NextSubStatus = SUB_STATUS_READMASTER_DATA;
SGCP.GW1mSDelayCnt = 5000;
@@ -1493,30 +1493,30 @@ void GwRevLoopHandler(void)
/* 中断回调函数 */
/* 中断回调函数 */
/*****************************************************************************************
* 函数名称: LORA_RxCallBack
* 功能描述: Lora数据接收函数
* 参 数: *rBuff,接收到的字符串
rlen,接收到的字符串长度
* 返 回 值: 无
* 函数名称: LORA_RxCallBack
* 功能描述: Lora数据接收函数
* 参 数: *rBuff,接收到的字符串
rlen,接收到的字符串长度
* 返 回 值: 无
*****************************************************************************************/
void LORA_RxCallBack(uint8_t *rBuff, uint8_t rlen)
{
// if (rlen > 0 && rBuff[0] == 0x7C && memcmp(&rBuff[7],&Comm_DevAddr[0],6) == 0) // 如果接收到了数据,并且设备地址相同则处理接收到的数据
// if (rlen > 0 && rBuff[0] == 0x7C && memcmp(&rBuff[7],&Comm_DevAddr[0],6) == 0) // 如果接收到了数据,并且设备地址相同则处理接收到的数据
// {
// //< 处理接收到的数据
// //< 处理接收到的数据
// memcpy(App.UpperBuff, rBuff, rlen);
// App.UpperBuffLen = rlen;
// App.Upper_IRQ_Status = true;//上位机串口中断
// App.Upper_IRQ_Status = true;//上位机串口中断
// }
}
/*****************************************************************************************
* 函数名称: LPUartRx_CallBack
* 功能描述: 低功耗串口数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
* 函数名称: LPUartRx_CallBack
* 功能描述: 低功耗串口数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
*****************************************************************************************/
void LPUartRx_CallBack(uint8_t rData)
{
@@ -1543,7 +1543,7 @@ void LPUartRx_CallBack(uint8_t rData)
if(SGCP.GWRS485Rx.RxLen == 15) {
SGCP.GWRS485Rx.rPayLen |= (rData << 8);
}
if(SGCP.GWRS485Rx.rPayLen > 10) { //大于最大负载长度,认为错误
if(SGCP.GWRS485Rx.rPayLen > 10) { //大于最大负载长度,认为错误
SGCP.GWRS485Rx.HeaderFrame = false;
return;
}
@@ -1556,7 +1556,7 @@ void LPUartRx_CallBack(uint8_t rData)
memcpy(SGCP.GatewayBuff, SGCP.GWRS485Rx.RxBuff, SGCP.GWRS485Rx.RxLen);
SGCP.GatewayBuffLen = SGCP.GWRS485Rx.RxLen;
if(SGCP.GWRS485Rx.RxBuff[0] == 0x7B) GWRevHandler();//网关数据接收处理
if(SGCP.GWRS485Rx.RxBuff[0] == 0x7B) GWRevHandler();//网关数据接收处理
}
}
if(SGCP.GWRS485Rx.RxBuff[0] == 0x7D)
@@ -1572,17 +1572,17 @@ void LPUartRx_CallBack(uint8_t rData)
memcpy(SGCP.InsideBuff, SGCP.GWRS485Rx.RxBuff, SGCP.GWRS485Rx.RxLen);
SGCP.InsideBuffLen = SGCP.GWRS485Rx.RxLen;
if(SGCP.InsideBuff[0] == 0x7D) InRevHandler();//内部指令
if(SGCP.InsideBuff[0] == 0x7D) InRevHandler();//内部指令
}
}
}
}
/*****************************************************************************************
* 函数名称: Uart1Rx_CallBack
* 功能描述: 串口1数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
* 函数名称: Uart1Rx_CallBack
* 功能描述: 串口1数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
*****************************************************************************************/
void Uart1Rx_CallBack(uint8_t rData)
{
@@ -1600,7 +1600,7 @@ void Uart1Rx_CallBack(uint8_t rData)
}
else {
if(SGCP.SDRS485Rx.RxLen == 3) {
if(rData > 36) { //大于最大负载长度,认为错误
if(rData > 36) { //大于最大负载长度,认为错误
SGCP.SDRS485Rx.HeaderFrame = false;
return;
}
@@ -1615,21 +1615,21 @@ void Uart1Rx_CallBack(uint8_t rData)
memcpy(SGCP.SubsetBuff, SGCP.SDRS485Rx.RxBuff, SGCP.SDRS485Rx.RxLen);
SGCP.SubsetBuffLen = SGCP.SDRS485Rx.RxLen;
if(SGCP.SDRS485Rx.RxBuff[0] == 0x7C) SGCP.Subset_IRQ_Status = true;//子设备串口中断
if(SGCP.SDRS485Rx.RxBuff[0] == 0x7C) SGCP.Subset_IRQ_Status = true;//子设备串口中断
}
}
}
#endif
#if (SGCP_SELECT == 1)//本机为单个主设备
#if (SGCP_SELECT == 1)//本机为单个主设备
#if (LocalType == LASER_TRACING)
/**
*******************************************************************************
** \brief 网关激光状态回应
** \brief 网关激光状态回应
**
** \param Ok_Err 成功失败标志位
** \param Ok_Err 成功失败标志位
**
** \retval 无
** \retval 无
******************************************************************************/
static void ToGWLaserRes(bool Ok_Err)
{
@@ -1664,11 +1664,11 @@ SGCP.GWRS485Rx.sCmdMDToGW = (GWTOMD_CMD_M)GFHeader->Cmd;
#endif
/**
*******************************************************************************
** \brief 接收网关数据状态机
** \brief 接收网关数据状态机
**
** \param 无
** \param 无
**
** \retval 无
** \retval 无
******************************************************************************/
void GwRevLoopHandler(void)
{
@@ -1686,8 +1686,8 @@ void GwRevLoopHandler(void)
SGCP.Dev485Addr = 0;
memset(&SGCP.Dev485Addrs, NULL, sizeof(SGCP.Dev485Addrs));
memset(&SGCP.DeviceMAC, NULL, sizeof(SGCP.DeviceMAC));
SGCP.Dev485Addrs[SGCP.DeviceN] = SGCP.Dev485Addr;//主设备485
memcpy(SGCP.DeviceMAC[SGCP.DeviceN], LocalMAC, sizeof(LocalMAC));//主设备MAC
SGCP.Dev485Addrs[SGCP.DeviceN] = SGCP.Dev485Addr;//主设备485
memcpy(SGCP.DeviceMAC[SGCP.DeviceN], LocalMAC, sizeof(LocalMAC));//主设备MAC
DBG_LOG("Master Device MAC:%02X %02X %02X %02X %02X %02X\r\n",
SGCP.DeviceMAC[SGCP.DeviceN][0],SGCP.DeviceMAC[SGCP.DeviceN][1],SGCP.DeviceMAC[SGCP.DeviceN][2],
SGCP.DeviceMAC[SGCP.DeviceN][3],SGCP.DeviceMAC[SGCP.DeviceN][4],SGCP.DeviceMAC[SGCP.DeviceN][5]);
@@ -1714,8 +1714,8 @@ void GwRevLoopHandler(void)
if(SGCP.LoginOk == true)
{
DBG_LOG("Login Ok!\r\n");
/*注册后传感器需立即更新数据*/
SGCP.TimingAcquisition = true;//采集新的传感器数据
/*注册后传感器需立即更新数据*/
SGCP.TimingAcquisition = true;//采集新的传感器数据
}
if(SGCP.LoginOk == false)
{
@@ -1738,7 +1738,7 @@ void GwRevLoopHandler(void)
ToGWCaliRes(SGCP.MasterCaliOk);
DBG_LOG("Alone Cali Ok!\r\n");
}
SGCP.TimingAcquisition = true;//采集新的传感器数据
SGCP.TimingAcquisition = true;//采集新的传感器数据
SGCP.GWStatus = GW_STATUS_IDLE;
break;}
@@ -1753,7 +1753,7 @@ void GwRevLoopHandler(void)
SGCP.DevData.LaserTracing.MasterDev.BatLevel = 0x00;
#endif
#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
SGCP.DevData.LaserTracing.MasterDev.RSSI = 0x00;
SGCP.DevData.LaserTracing.MasterDev.Nsr = 0x00;
@@ -1774,8 +1774,8 @@ void GwRevLoopHandler(void)
}
ToGWReadDataRes(SGCP.DeviceData);
DBG_LOG("Upload data Ok!\r\n");
/*上传完数据后传感器需立即更新数据*/
SGCP.TimingAcquisition = true;//采集新的传感器数据
/*上传完数据后传感器需立即更新数据*/
SGCP.TimingAcquisition = true;//采集新的传感器数据
SGCP.GWStatus = GW_STATUS_IDLE;
break;}
@@ -1791,7 +1791,7 @@ void GwRevLoopHandler(void)
ToGWSetColTimeRes(true);
DBG_LOG("Alone CollectInterval Set as %04d\r\n",0x00, App.Para.Layout.CollectTime);
}
/*GWRevHandler函数中已经缓存了接收到的采集时间间隔*/
/*GWRevHandler函数中已经缓存了接收到的采集时间间隔*/
SGCP.GWStatus = GW_STATUS_IDLE;
break;}
@@ -1807,7 +1807,7 @@ void GwRevLoopHandler(void)
ToGWSyncTimeRes(true);
DBG_LOG("Alone time synchronization %08d\r\n",App.Para.Layout.TimeStamp);
}
/*GWRevHandler函数中已经同步了接收到的时间戳*/
/*GWRevHandler函数中已经同步了接收到的时间戳*/
SGCP.GWStatus = GW_STATUS_IDLE;
break;}
@@ -1847,8 +1847,8 @@ void GwRevLoopHandler(void)
if(SGCP.UploadOk == true)
{
DBG_LOG("\r\nUpload data ok!\r\n");
/*上传完数据后传感器需立即更新数据*/
SGCP.TimingAcquisition = true;//采集新的传感器数据
/*上传完数据后传感器需立即更新数据*/
SGCP.TimingAcquisition = true;//采集新的传感器数据
}
else if(SGCP.UploadOk == false)
{
@@ -1907,30 +1907,30 @@ void GwRevLoopHandler(void)
}
}
/* 中断回调函数 */
/* 中断回调函数 */
/*****************************************************************************************
* 函数名称: LORA_RxCallBack
* 功能描述: Lora数据接收函数
* 参 数: *rBuff,接收到的字符串
rlen,接收到的字符串长度
* 返 回 值: 无
* 函数名称: LORA_RxCallBack
* 功能描述: Lora数据接收函数
* 参 数: *rBuff,接收到的字符串
rlen,接收到的字符串长度
* 返 回 值: 无
*****************************************************************************************/
void LORA_RxCallBack(uint8_t *rBuff, uint8_t rlen)
{
if (rlen > 0 && rBuff[0] == 0x7B && memcmp(&rBuff[7],&LocalMAC[0],6) == 0) // 如果接收到了数据,并且设备地址相同则处理接收到的数据
if (rlen > 0 && rBuff[0] == 0x7B && memcmp(&rBuff[7],&LocalMAC[0],6) == 0) // 如果接收到了数据,并且设备地址相同则处理接收到的数据
{
//< 处理接收到的数据
//< 处理接收到的数据
memcpy(SGCP.GatewayBuff, rBuff, rlen);
SGCP.GatewayBuffLen = rlen;
GWRevHandler();//网关数据接收处理
GWRevHandler();//网关数据接收处理
}
}
/*****************************************************************************************
* 函数名称: LPUartRx_CallBack
* 功能描述: 低功耗串口数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
* 函数名称: LPUartRx_CallBack
* 功能描述: 低功耗串口数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
*****************************************************************************************/
void LPUartRx_CallBack(uint8_t rData)
{
@@ -1957,7 +1957,7 @@ void LPUartRx_CallBack(uint8_t rData)
if(SGCP.GWRS485Rx.RxLen == 15) {
SGCP.GWRS485Rx.rPayLen |= (rData << 8);
}
if(SGCP.GWRS485Rx.rPayLen > 10) { //大于最大负载长度,认为错误
if(SGCP.GWRS485Rx.rPayLen > 10) { //大于最大负载长度,认为错误
SGCP.GWRS485Rx.HeaderFrame = false;
return;
}
@@ -1970,7 +1970,7 @@ void LPUartRx_CallBack(uint8_t rData)
memcpy(SGCP.GatewayBuff, SGCP.GWRS485Rx.RxBuff, SGCP.GWRS485Rx.RxLen);
SGCP.GatewayBuffLen = SGCP.GWRS485Rx.RxLen;
if(SGCP.GWRS485Rx.RxBuff[0] == 0x7B) GWRevHandler();//网关数据接收处理
if(SGCP.GWRS485Rx.RxBuff[0] == 0x7B) GWRevHandler();//网关数据接收处理
}
}
if(SGCP.GWRS485Rx.RxBuff[0] == 0x7D)
@@ -1986,17 +1986,17 @@ void LPUartRx_CallBack(uint8_t rData)
memcpy(SGCP.InsideBuff, SGCP.GWRS485Rx.RxBuff, SGCP.GWRS485Rx.RxLen);
SGCP.InsideBuffLen = SGCP.GWRS485Rx.RxLen;
if(SGCP.GWRS485Rx.RxBuff[0] == 0x7D) InRevHandler();//内部指令
if(SGCP.GWRS485Rx.RxBuff[0] == 0x7D) InRevHandler();//内部指令
}
}
}
}
/*****************************************************************************************
* 函数名称: Uart1Rx_CallBack
* 功能描述: 串口1数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
* 函数名称: Uart1Rx_CallBack
* 功能描述: 串口1数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
*****************************************************************************************/
void Uart1Rx_CallBack(uint8_t rData)
{
@@ -2014,7 +2014,7 @@ void Uart1Rx_CallBack(uint8_t rData)
// }
// else {
// if(SGCP.SDRS485Rx.RxLen == 3) {
// if(rData > 36) { //大于最大负载长度,认为错误
// if(rData > 36) { //大于最大负载长度,认为错误
// SGCP.SDRS485Rx.HeaderFrame = false;
// return;
// }
@@ -2029,20 +2029,20 @@ void Uart1Rx_CallBack(uint8_t rData)
// memcpy(SGCP.SubsetBuff, SGCP.SDRS485Rx.RxBuff, SGCP.SDRS485Rx.RxLen);
// SGCP.SubsetBuffLen = SGCP.SDRS485Rx.RxLen;
// if(SGCP.SDRS485Rx.RxBuff[0] == 0x7C) SGCP.Subset_IRQ_Status = true;//子设备串口中断
// if(SGCP.SDRS485Rx.RxBuff[0] == 0x7C) SGCP.Subset_IRQ_Status = true;//子设备串口中断
// }
// }
}
#endif
#if (SGCP_SELECT == 2)//本机为单个子设备
#if (SGCP_SELECT == 2)//本机为单个子设备
/**
*******************************************************************************
** \brief 接收主设备数据状态机
** \brief 接收主设备数据状态机
**
** \param 无
** \param 无
**
** \retval 无
** \retval 无
******************************************************************************/
void MasRevLoopHandler(void)
{
@@ -2063,7 +2063,7 @@ void MasRevLoopHandler(void)
ToMDCaliRes(App.Para.Layout.RS485Addr, SGCP.SubsetCaliOk);
DBG_LOG("Alone Cail!\r\n");
}
SGCP.TimingAcquisition = true;//采集新的传感器数据
SGCP.TimingAcquisition = true;//采集新的传感器数据
SGCP.MasStatus = MAS_STATUS_IDLE;
break;}
@@ -2082,7 +2082,7 @@ void MasRevLoopHandler(void)
ToMDReadDataRes(App.Para.Layout.RS485Addr, SGCP.DeviceData, SGCP.DeviceDataLen);
DBG_LOG("Upload Sensor Data Ok!\r\n");
SGCP.TimingAcquisition = true;//采集新的传感器数据
SGCP.TimingAcquisition = true;//采集新的传感器数据
SGCP.MasStatus = MAS_STATUS_IDLE;
break;}
@@ -2125,30 +2125,30 @@ void MasRevLoopHandler(void)
break;}
}
}
/* 中断回调函数 */
/* 中断回调函数 */
/*****************************************************************************************
* 函数名称: LORA_RxCallBack
* 功能描述: Lora数据接收函数
* 参 数: *rBuff,接收到的字符串
rlen,接收到的字符串长度
* 返 回 值: 无
* 函数名称: LORA_RxCallBack
* 功能描述: Lora数据接收函数
* 参 数: *rBuff,接收到的字符串
rlen,接收到的字符串长度
* 返 回 值: 无
*****************************************************************************************/
void LORA_RxCallBack(uint8_t *rBuff, uint8_t rlen)
{
// if (rlen > 0 && rBuff[0] == 0x7C && memcmp(&rBuff[7],&Comm_DevAddr[0],6) == 0) // 如果接收到了数据,并且设备地址相同则处理接收到的数据
// if (rlen > 0 && rBuff[0] == 0x7C && memcmp(&rBuff[7],&Comm_DevAddr[0],6) == 0) // 如果接收到了数据,并且设备地址相同则处理接收到的数据
// {
// //< 处理接收到的数据
// //< 处理接收到的数据
// memcpy(App.UpperBuff, rBuff, rlen);
// App.UpperBuffLen = rlen;
// App.Upper_IRQ_Status = true;//上位机串口中断
// App.Upper_IRQ_Status = true;//上位机串口中断
// }
}
/*****************************************************************************************
* 函数名称: LPUartRx_CallBack
* 功能描述: 低功耗串口数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
* 函数名称: LPUartRx_CallBack
* 功能描述: 低功耗串口数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
*****************************************************************************************/
void LPUartRx_CallBack(uint8_t rData)
{
@@ -2170,7 +2170,7 @@ void LPUartRx_CallBack(uint8_t rData)
if(SGCP.SDRS485Rx.RxBuff[0] == 0x7C)
{
if(SGCP.SDRS485Rx.RxLen == 3) {
if(rData > 36) { //大于最大负载长度,认为错误
if(rData > 36) { //大于最大负载长度,认为错误
SGCP.SDRS485Rx.HeaderFrame = false;
return;
}
@@ -2185,7 +2185,7 @@ void LPUartRx_CallBack(uint8_t rData)
memcpy(SGCP.SubsetBuff, SGCP.SDRS485Rx.RxBuff, SGCP.SDRS485Rx.RxLen);
SGCP.SubsetBuffLen = SGCP.SDRS485Rx.RxLen;
if(SGCP.SDRS485Rx.RxBuff[0] == 0x7C) MasRevHandler();//子设备串口中断
if(SGCP.SDRS485Rx.RxBuff[0] == 0x7C) MasRevHandler();//子设备串口中断
}
}
if(SGCP.SDRS485Rx.RxBuff[0] == 0x7D)
@@ -2201,16 +2201,16 @@ void LPUartRx_CallBack(uint8_t rData)
memcpy(SGCP.InsideBuff, SGCP.SDRS485Rx.RxBuff, SGCP.SDRS485Rx.RxLen);
SGCP.InsideBuffLen = SGCP.SDRS485Rx.RxLen;
if(SGCP.SDRS485Rx.RxBuff[0] == 0x7D) InRevHandler();//内部指令
if(SGCP.SDRS485Rx.RxBuff[0] == 0x7D) InRevHandler();//内部指令
}
}
}
}
/*****************************************************************************************
* 函数名称: Uart1Rx_CallBack
* 功能描述: 串口1数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
* 函数名称: Uart1Rx_CallBack
* 功能描述: 串口1数据接收函数
* 参 数: rData,接收到的字节
* 返 回 值: 无
*****************************************************************************************/
void Uart1Rx_CallBack(uint8_t rData)
{
@@ -2228,7 +2228,7 @@ void Uart1Rx_CallBack(uint8_t rData)
// }
// else {
// if(SGCP.SDRS485Rx.RxLen == 3) {
// if(rData > 36) { //大于最大负载长度,认为错误
// if(rData > 36) { //大于最大负载长度,认为错误
// SGCP.SDRS485Rx.HeaderFrame = false;
// return;
// }
@@ -2243,7 +2243,7 @@ void Uart1Rx_CallBack(uint8_t rData)
// memcpy(SGCP.SubsetBuff, SGCP.SDRS485Rx.RxBuff, SGCP.SDRS485Rx.RxLen);
// SGCP.SubsetBuffLen = SGCP.SDRS485Rx.RxLen;
// if(SGCP.SDRS485Rx.RxBuff[0] == 0x7C) SGCP.Subset_IRQ_Status = true;//子设备串口中断
// if(SGCP.SDRS485Rx.RxBuff[0] == 0x7C) SGCP.Subset_IRQ_Status = true;//子设备串口中断
// }
// }
}
@@ -2252,11 +2252,11 @@ void Uart1Rx_CallBack(uint8_t rData)
/**
*******************************************************************************
** \brief 内部指令数据状态机
** \brief 内部指令数据状态机
**
** \param 无
** \param 无
**
** \retval 无
** \retval 无
******************************************************************************/
void InRevLoopHandler(void)
{
@@ -2273,17 +2273,17 @@ void InRevLoopHandler(void)
break;}
case IN_STATUS_UPDATE:{
Update(SGCP.InsidePay);//固件更新.
Update(SGCP.InsidePay);//固件更新.
memset(SGCP.InsidePay, NULL, sizeof(SGCP.InsidePay));
SGCP.InStatus = IN_STATUS_IDLE;
break;}
}
}
/*****************************************************************************************
* 函数名称: SGCP1mSRoutine
* 功能描述: SGCP时基循环处理函数
* 参 数: 无
* 返 回 值: 无
* 函数名称: SGCP1mSRoutine
* 功能描述: SGCP时基循环处理函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
void SGCP1mSRoutine(void)
{
+9 -9
View File
@@ -1,13 +1,13 @@
#include "Update.h"
#include "Update.h"
#include "UartDebug.h"
#include "main.h"
#include "bsp.h"
/*****************************************************************************************
* 函数名称: Update
* 功能描述: 固件升级,此函数在解析到升级指令是调用
* 参 数: PayLoad 协议负载,需去除帧头等信息,只传负载数据
* 返 回 值: 无
* 函数名称: Update
* 功能描述: 固件升级,此函数在解析到升级指令是调用
* 参 数: PayLoad 协议负载,需去除帧头等信息,只传负载数据
* 返 回 值: 无
*****************************************************************************************/
void Update(uint8_t *PayLoad)
{
@@ -32,10 +32,10 @@ void Update(uint8_t *PayLoad)
}
/*****************************************************************************************
* 函数名称: UpdateInit
* 功能描述: 升级参数初始化,需要在程序启动,外设初试完后调用
* 参 数: 无
* 返 回 值: 无
* 函数名称: UpdateInit
* 功能描述: 升级参数初始化,需要在程序启动,外设初试完后调用
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
void UpdateInit(void)
{
+209 -209
View File
@@ -32,51 +32,51 @@ extern void LORA_RxCallBack(uint8_t *rBuff, uint8_t rlen);
static __IO uint32_t SysTickCnt = 0;
static volatile uint32_t u32AdcRestult;
static void SystemClkDivInit(void)//系统时钟分频设置
static void SystemClkDivInit(void)//系统时钟分频设置
{
//时钟分频设置
//时钟分频设置
Sysctrl_SetHCLKDiv(SysctrlHclkDiv1);
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_SetRCLStableTime(SysctrlRclStableCycle64);
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
/*内部高速时钟初始化 24MHZ*/
/*内部高速时钟初始化 24MHZ*/
/*Sysctrl_SetRCHTrim(enRchFreq);
Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
//< HCLK不超过24M:此处设置FLASH读等待周期为0 cycle
//< HCLK不超过24M:此处设置FLASH读等待周期为0 cycle
Flash_WaitCycle(FlashWaitCycle0);
Sysctrl_SysClkSwitch(SysctrlClkRCH);//系统时钟源选择
Sysctrl_SysClkSwitch(SysctrlClkRCH);//系统时钟源选择
*/
/*内部高速时钟初始化 48MHZ*/
/*内部高速时钟初始化 48MHZ*/
stc_sysctrl_pll_cfg_t stcPLLCfg;
///< 加载目标频率的RCH的TRIM值
///< 加载目标频率的RCH的TRIM值
Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);
///< 使能RCH
///< 使能RCH
Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
stcPLLCfg.enInFreq = SysctrlPllInFreq4_6MHz; //RCH 4MHz
stcPLLCfg.enOutFreq = SysctrlPllOutFreq36_48MHz; //PLL 输出
stcPLLCfg.enPllClkSrc = SysctrlPllRch; //输入时钟源选择RCH
stcPLLCfg.enOutFreq = SysctrlPllOutFreq36_48MHz; //PLL 输出
stcPLLCfg.enPllClkSrc = SysctrlPllRch; //输入时钟源选择RCH
stcPLLCfg.enPllMul = SysctrlPllMul12; //4MHz x 12 = 48MHz
Sysctrl_SetPLLFreq(&stcPLLCfg);
///< 当使用的时钟源HCLK大于24M:设置FLASH 读等待周期为1 cycle(默认值也为1 cycle)
///< 当使用的时钟源HCLK大于24M:设置FLASH 读等待周期为1 cycle(默认值也为1 cycle)
Flash_WaitCycle(FlashWaitCycle1);
///< 使能PLL
///< 使能PLL
Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE);
///< 时钟切换到PLL
///< 时钟切换到PLL
Sysctrl_SysClkSwitch(SysctrlClkPLL);
/*外部低速晶振初始化 32.768KHz*/
/*外部低速晶振初始化 32.768KHz*/
/* Sysctrl_XTLDriverCfg(SysctrlXtlAmp3, SysctrlXtalDriver3);
Sysctrl_SetXTLStableTime(SysctrlXtlStableCycle16384);
Sysctrl_ClkSourceEnable(SysctrlClkXTL, TRUE);
@@ -84,9 +84,9 @@ static void SystemClkInit(en_sysctrl_rch_freq_t enRchFreq)//ʱ
}
static void SystemRCLInit(void)
{
Sysctrl_SetRCLTrim(SysctrlRclFreq38400); ///< 配置RCL时钟为38400kHz
Sysctrl_SetRCLTrim(SysctrlRclFreq38400); ///< 配置RCL时钟为38400kHz
Sysctrl_SetRCLStableTime(SysctrlRclStableCycle256);
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE); ///< 使能RCL时钟
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE); ///< 使能RCL时钟
}
void Uart0Init(uint32_t Baud)
@@ -111,21 +111,21 @@ void Uart0Init(uint32_t Baud)
DDL_ZERO_STRUCT(stcCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);
///<UART 初始化
stcCfg.enStopBit = UartMsk1bit; ///<1停止位
stcCfg.enMmdorCk = UartMskEven; ///<偶校验
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<PCLK获取
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<采样分频
stcCfg.stcBaud.u32Baud = Baud; ///<波特率
stcCfg.enRunMode = UartMskMode1; ///<工作模式
///<UART 初始化
stcCfg.enStopBit = UartMsk1bit; ///<1停止位
// stcCfg.enMmdorCk = UartMskEven; ///<偶校验
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<PCLK获取
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<采样分频
stcCfg.stcBaud.u32Baud = Baud; ///<波特率
stcCfg.enRunMode = UartMskMode1; ///<工作模式
Uart_Init(M0P_UART0, &stcCfg);
///<UART 中断使能
Uart_ClrStatus(M0P_UART0, UartRC); ///<清接收中断请求
Uart_ClrStatus(M0P_UART0, UartTC); ///<清发送中断请求
//Uart_EnableIrq(M0P_UART1,UartTxIrq); ///<使能发送中断
Uart_EnableIrq(M0P_UART0, UartRxIrq); ///<使能接收中断
EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE); ///<系统中断使能
///<UART 中断使能
Uart_ClrStatus(M0P_UART0, UartRC); ///<清接收中断请求
Uart_ClrStatus(M0P_UART0, UartTC); ///<清发送中断请求
//Uart_EnableIrq(M0P_UART1,UartTxIrq); ///<使能发送中断
Uart_EnableIrq(M0P_UART0, UartRxIrq); ///<使能接收中断
EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE); ///<系统中断使能
}
static void Uart1Init(void)
@@ -150,21 +150,21 @@ static void Uart1Init(void)
DDL_ZERO_STRUCT(stcCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);
///<UART 初始化
stcCfg.enStopBit = UartMsk1bit; ///<1停止位
//stcCfg.enMmdorCk = UartMskEven; ///<偶校验
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<PCLK获取
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<采样分频
stcCfg.stcBaud.u32Baud = 115200; ///<波特率
stcCfg.enRunMode = UartMskMode1; ///<工作模式
///<UART 初始化
stcCfg.enStopBit = UartMsk1bit; ///<1停止位
//stcCfg.enMmdorCk = UartMskEven; ///<偶校验
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<PCLK获取
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<采样分频
stcCfg.stcBaud.u32Baud = 115200; ///<波特率
stcCfg.enRunMode = UartMskMode1; ///<工作模式
Uart_Init(M0P_UART1, &stcCfg);
///<UART 中断使能
Uart_ClrStatus(M0P_UART1, UartRC); ///<清接收中断请求
Uart_ClrStatus(M0P_UART1, UartTC); ///<清发送中断请求
//Uart_EnableIrq(M0P_UART1,UartTxIrq); ///<使能发送中断
Uart_EnableIrq(M0P_UART1, UartRxIrq); ///<使能接收中断
EnableNvic(UART1_3_IRQn, IrqLevel3, TRUE); ///<系统中断使能
///<UART 中断使能
Uart_ClrStatus(M0P_UART1, UartRC); ///<清接收中断请求
Uart_ClrStatus(M0P_UART1, UartTC); ///<清发送中断请求
//Uart_EnableIrq(M0P_UART1,UartTxIrq); ///<使能发送中断
Uart_EnableIrq(M0P_UART1, UartRxIrq); ///<使能接收中断
EnableNvic(UART1_3_IRQn, IrqLevel3, TRUE); ///<系统中断使能
}
void LpUart0Init(uint32_t Baud)
{
@@ -177,42 +177,42 @@ void LpUart0Init(uint32_t Baud)
///<TX
stcGpioCfg.enDir = GpioDirOut;
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
stcGpioCfg.enDir = GpioDirIn;
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);
Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart0,TRUE);
///<LPUART 初始化
stcCfg.enStopBit = LPUart1bit; ///<1停止位
//stcCfg.enMmdorCk = LPUartEven; ///<偶校验
stcCfg.stcBaud.enSclkSel = LPUartMskRcl; ///<传输时钟源
stcCfg.stcBaud.u32Sclk = 38400; ///<PCLK获取
stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div; ///<采样分频
stcCfg.stcBaud.u32Baud = Baud; ///<波特率
stcCfg.enRunMode = LPUartMskMode1; ///<工作模式
///<LPUART 初始化
stcCfg.enStopBit = LPUart1bit; ///<1停止位
//stcCfg.enMmdorCk = LPUartEven; ///<偶校验
stcCfg.stcBaud.enSclkSel = LPUartMskRcl; ///<传输时钟源
stcCfg.stcBaud.u32Sclk = 38400; ///<PCLK获取
stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div; ///<采样分频
stcCfg.stcBaud.u32Baud = Baud; ///<波特率
stcCfg.enRunMode = LPUartMskMode1; ///<工作模式
LPUart_Init(M0P_LPUART0, &stcCfg);
///<LPUART 中断使能
LPUart_ClrStatus(M0P_LPUART0,LPUartRC); ///<清接收中断请求
LPUart_ClrStatus(M0P_LPUART0,LPUartTC); ///<清发送中断请求
//LPUart_EnableIrq(M0P_LPUART0,LPUartTxIrq); ///<使能发送中断
LPUart_EnableIrq(M0P_LPUART0,LPUartRxIrq); ///<使能接收中断
EnableNvic(LPUART0_IRQn,IrqLevel3,TRUE); ///<系统中断使能
///<LPUART 中断使能
LPUart_ClrStatus(M0P_LPUART0,LPUartRC); ///<清接收中断请求
LPUart_ClrStatus(M0P_LPUART0,LPUartTC); ///<清发送中断请求
//LPUart_EnableIrq(M0P_LPUART0,LPUartTxIrq); ///<使能发送中断
LPUart_EnableIrq(M0P_LPUART0,LPUartRxIrq); ///<使能接收中断
EnableNvic(LPUART0_IRQn,IrqLevel3,TRUE); ///<系统中断使能
}
/*****************************************************************************************
* 函数名称: AdcInit
* 功能描述: ADC初始化
* 参 数: 无
* 返 回 值: 无
* 函数名称: AdcInit
* 功能描述: ADC初始化
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
static void AdcInit(void)
{
///< 开启ADC/BGR GPIO外设时钟
///< 开启ADC/BGR GPIO外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
Gpio_SetAnalogMode(VBAT_PORTx, VBAT_PINx); //PA04 (AIN4)
@@ -220,29 +220,29 @@ static void AdcInit(void)
DDL_ZERO_STRUCT(stcAdcCfg);
///< 开启ADC/BGR外设时钟
///< 开启ADC/BGR外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
Bgr_BgrEnable(); ///< 开启BGR
Bgr_BgrEnable(); ///< 开启BGR
///< ADC 初始化配置
stcAdcCfg.enAdcMode = AdcSglMode; ///<采样模式-单次
stcAdcCfg.enAdcClkDiv = AdcMskClkDiv8; ///<采样分频-1
stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk; ///<采样周期数-12
stcAdcCfg.enAdcRefVolSel = AdcMskRefVolSelAVDD; ///<参考电压选择-AVDD
stcAdcCfg.enAdcOpBuf = AdcMskBufEnable; ///<OP BUF配置-关
stcAdcCfg.enInRef = AdcMskInRefDisable; ///<内部参考电压使能-关
stcAdcCfg.enAdcAlign = AdcAlignRight; ///<转换结果对齐方式-右
///< ADC 初始化配置
stcAdcCfg.enAdcMode = AdcSglMode; ///<采样模式-单次
stcAdcCfg.enAdcClkDiv = AdcMskClkDiv8; ///<采样分频-1
stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk; ///<采样周期数-12
stcAdcCfg.enAdcRefVolSel = AdcMskRefVolSelAVDD; ///<参考电压选择-AVDD
stcAdcCfg.enAdcOpBuf = AdcMskBufEnable; ///<OP BUF配置-关
stcAdcCfg.enInRef = AdcMskInRefDisable; ///<内部参考电压使能-关
stcAdcCfg.enAdcAlign = AdcAlignRight; ///<转换结果对齐方式-右
Adc_Init(&stcAdcCfg);
Adc_CfgSglChannel(VBAT_ADC_PORTx); // 配置单次采样通道
Adc_SGL_Always_Start(); // 启动单次一直采样
Adc_CfgSglChannel(VBAT_ADC_PORTx); // 配置单次采样通道
Adc_SGL_Always_Start(); // 启动单次一直采样
}
/*****************************************************************************************
* 函数名称: Battery_Level_Percent_Table
* 功能描述: 电池电量百分比转换
* 参 数: voltage,采集到的电压
* 返 回 值: 无
* 函数名称: Battery_Level_Percent_Table
* 功能描述: 电池电量百分比转换
* 参 数: voltage,采集到的电压
* 返 回 值: 无
*****************************************************************************************/
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,
@@ -263,32 +263,32 @@ static int Percentage(float voltage)
return 100;
}
/*****************************************************************************************
* 函数名称: ADC_IRQHandler
* 功能描述: ADC采集中断,放在主循环内一直循环采集
* 参 数: 无
* 返 回 值: 无
* 函数名称: ADC_IRQHandler
* 功能描述: ADC采集中断,放在主循环内一直循环采集
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
float VBAT_12V;//< ADC采集到的电压
uint8_t VBAT_Percentage;//电池电压百分比
float VBAT_12V;//< ADC采集到的电压
uint8_t VBAT_Percentage;//电池电压百分比
void ADCLoopHandler(void)
{
if(Adc_GetIrqStatus(AdcMskIrqSgl))//ADC中断状态获取
if(Adc_GetIrqStatus(AdcMskIrqSgl))//ADC中断状态获取
{
VBAT_12V = (Adc_GetSglResult() * VBAT_CAL);//< 获取实际电压
VBAT_Percentage = Percentage(VBAT_12V);//获取百分比
VBAT_12V = (Adc_GetSglResult() * VBAT_CAL);//< 获取实际电压
VBAT_Percentage = Percentage(VBAT_12V);//获取百分比
//DBG_LOG("VBAT_Percentage:%d\n",VBAT_Percentage);
Adc_ClrIrqStatus(AdcMskIrqSgl);//清除ADC中断状态
Adc_ClrIrqStatus(AdcMskIrqSgl);//清除ADC中断状态
}
}
void RTCInit(uint8_t sec)
{
stc_rtc_initstruct_t RtcInitStruct;
Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc,TRUE); //RTC模块时钟打开
RtcInitStruct.rtcAmpm = RtcPm; //24小时制
RtcInitStruct.rtcClksrc = RtcClkRcl; //外部低速时钟
RtcInitStruct.rtcPrdsel.rtcPrdsel = RtcPrdx; //周期中断类型PRDX
RtcInitStruct.rtcPrdsel.rtcPrdx = sec * 2 - 1; //周期中断时间间隔 30秒
Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc,TRUE); //RTC模块时钟打开
RtcInitStruct.rtcAmpm = RtcPm; //24小时制
RtcInitStruct.rtcClksrc = RtcClkRcl; //外部低速时钟
RtcInitStruct.rtcPrdsel.rtcPrdsel = RtcPrdx; //周期中断类型PRDX
RtcInitStruct.rtcPrdsel.rtcPrdx = sec * 2 - 1; //周期中断时间间隔 30秒
Rtc_ReadDateTime(&RtcInitStruct.rtcTime);
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.rtcCompen = RtcCompenEnable;
RtcInitStruct.rtcCompValue = 0; //补偿值 根据实际情况进行补偿
RtcInitStruct.rtcCompValue = 0; //补偿值 根据实际情况进行补偿
Rtc_Init(&RtcInitStruct);
Rtc_AlmIeCmd(TRUE); //使能闹钟中断
EnableNvic(RTC_IRQn, IrqLevel3, TRUE); //使能RTC中断向量
Rtc_Cmd(TRUE); //使能RTC开始计数
Rtc_StartWait(); //启动RTC计数,如果要立即切换到低功耗,需要执行此函数
Rtc_AlmIeCmd(TRUE); //使能闹钟中断
EnableNvic(RTC_IRQn, IrqLevel3, TRUE); //使能RTC中断向量
Rtc_Cmd(TRUE); //使能RTC开始计数
Rtc_StartWait(); //启动RTC计数,如果要立即切换到低功耗,需要执行此函数
}
/******************************************************************************
* 函数名称: LPTimer0Init
* 功能描述: 低功耗定时器0初始化
* 参 数: sTime 定时中断秒时间
* 返 回 值: 无
* 函数名称: LPTimer0Init
* 功能描述: 低功耗定时器0初始化
* 参 数: sTime 定时中断秒时间
* 返 回 值: 无
******************************************************************************/
void LPTimer0Init(uint16_t _100ms)
{
@@ -321,7 +321,7 @@ void LPTimer0Init(uint16_t _100ms)
stc_lptim_cfg_t stcLptCfg;
DDL_ZERO_STRUCT(stcLptCfg);
///< 使能LPTIM0 外设时钟
///< 使能LPTIM0 外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralLpTim0, TRUE);
stcLptCfg.enPrs = LptimPrsDiv256;
@@ -329,13 +329,13 @@ void LPTimer0Init(uint16_t _100ms)
stcLptCfg.enGatep = LptimGatePLow;
stcLptCfg.enTcksel = LptimRcl;
stcLptCfg.enTogen = LptimTogEnLow;
stcLptCfg.enCt = LptimTimerFun; //警示器功能
stcLptCfg.enMd = LptimMode1; //工作模式为模式1:无自动重装载16位计数器/定时器
stcLptCfg.u16Arr = 0x10000 - (_100ms * 13); //预装载寄存器值
stcLptCfg.enCt = LptimTimerFun; //警示器功能
stcLptCfg.enMd = LptimMode1; //工作模式为模式1:无自动重装载16位计数器/定时器
stcLptCfg.u16Arr = 0x10000 - (_100ms * 13); //预装载寄存器值
Lptim_Init(M0P_LPTIMER0, &stcLptCfg);
Lptim_ClrItStatus(M0P_LPTIMER0); //清除中断标志位
Lptim_ConfIt(M0P_LPTIMER0, TRUE); //允许LPTIMER中断
Lptim_ClrItStatus(M0P_LPTIMER0); //清除中断标志位
Lptim_ConfIt(M0P_LPTIMER0, TRUE); //允许LPTIMER中断
EnableNvic(LPTIM_0_1_IRQn, IrqLevel3, TRUE);
Lptim_Cmd(M0P_LPTIMER0, TRUE);
@@ -356,7 +356,7 @@ static void GPIOInit(void)
DDL_ZERO_STRUCT(GpioInitStruct);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
//未使用或引出的脚设为输入上拉
//未使用或引出的脚设为输入上拉
GpioInitStruct.enDir = GpioDirIn;
GpioInitStruct.enPu = GpioPuEnable;
@@ -376,32 +376,32 @@ static void GPIOInit(void)
Gpio_Init(GpioPortF, GpioPin6, &GpioInitStruct);
//end
/********************************** GPIO输出 ****************************************/
GpioInitStruct.enDir = GpioDirOut; ///< 端口方向配置->输出
GpioInitStruct.enDrv = GpioDrvH; ///< 端口驱动能力配置->高驱动能力
GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无
/********************************** GPIO输出 ****************************************/
GpioInitStruct.enDir = GpioDirOut; ///< 端口方向配置->输出
GpioInitStruct.enDrv = GpioDrvH; ///< 端口驱动能力配置->高驱动能力
GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无
GpioInitStruct.enPd = GpioPdDisable;
GpioInitStruct.enOD = GpioOdDisable; ///< 端口开漏输出配置->开漏输出关闭
GpioInitStruct.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
GpioInitStruct.bOutputVal = false; ///< 端口默认输出配置->低电平
//< RS485控制引脚
GpioInitStruct.enOD = GpioOdDisable; ///< 端口开漏输出配置->开漏输出关闭
GpioInitStruct.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
GpioInitStruct.bOutputVal = false; ///< 端口默认输出配置->低电平
//< RS485控制引脚
Gpio_Init(RS485_CTRL_PORTx,RS485_CTRL_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(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
Gpio_Init(LORA_RST_PORTx,LORA_RST_PINx,&GpioInitStruct);
//< LED_State
Gpio_Init(LED_STATE_PORTx,LED_STATE_PINx,&GpioInitStruct);
/********************************** GPIO输入 ****************************************/
GpioInitStruct.enDir = GpioDirIn; ///< 端口方向配置->输入
GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无
/********************************** GPIO输入 ****************************************/
GpioInitStruct.enDir = GpioDirIn; ///< 端口方向配置->输入
GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无
GpioInitStruct.enPd = GpioPdDisable;
GpioInitStruct.enOD = GpioOdDisable;
@@ -417,33 +417,33 @@ static void GPIOInit(void)
Gpio_Init(MMC5983MA_INT_PORTx,MMC5983MA_INT_PINx,&GpioInitStruct);
GlobalIntEnable();
}
void GlobalIntEnable(void)//全局中断使能
void GlobalIntEnable(void)//全局中断使能
{
EnableNvic(PORTB_IRQn, IrqLevel3, TRUE);
EnableNvic(PORTC_E_IRQn, IrqLevel3, TRUE);
}
void GlobalIntDisable(void)//全局中断失能
void GlobalIntDisable(void)//全局中断失能
{
EnableNvic(PORTB_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_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_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_INT2_PORTx, LSM6DSLTR_INT2_PINx, GpioIrqRising);//ACC_Int2
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_INT2_PORTx, LSM6DSLTR_INT2_PINx, GpioIrqRising);//ACC_Int2
@@ -458,31 +458,31 @@ static void SPI0Init(void)
DDL_ZERO_STRUCT(GpioInitStruct);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
/************************** SPI0配置:主机-->LORA *******************************/
/************************** SPI0配置:主机-->LORA *******************************/
GpioInitStruct.enDir = GpioDirOut;
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_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_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_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外设时钟
Reset_RstPeripheral0(ResetMskSpi0); ///<复位模块
Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,TRUE); ///< 打开SPI0外设时钟
Reset_RstPeripheral0(ResetMskSpi0); ///<复位模块
//SPI0模块配置:主机
SpiInitStruct.enSpiMode = SpiMskMaster; //配置位主机模式
SpiInitStruct.enPclkDiv = SpiClkMskDiv4; //波特率:PCLK/4
SpiInitStruct.enCPHA = SpiMskCphasecond; //第二边沿采样
SpiInitStruct.enCPOL = SpiMskcpolhigh; //极性为高
//SPI0模块配置:主机
SpiInitStruct.enSpiMode = SpiMskMaster; //配置位主机模式
SpiInitStruct.enPclkDiv = SpiClkMskDiv4; //波特率:PCLK/4
SpiInitStruct.enCPHA = SpiMskCphasecond; //第二边沿采样
SpiInitStruct.enCPOL = SpiMskcpolhigh; //极性为高
Spi_Init(M0P_SPI0, &SpiInitStruct);
}
@@ -494,31 +494,31 @@ static void SPI1Init(void)
DDL_ZERO_STRUCT(GpioInitStruct);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
/************************** SPI1配置:主机-->LORA *******************************/
/************************** SPI1配置:主机-->LORA *******************************/
GpioInitStruct.enDir = GpioDirOut;
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_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_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_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外设时钟
Reset_RstPeripheral0(ResetMskSpi1); ///<复位模块
Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi1,TRUE); ///< 打开SPI0外设时钟
Reset_RstPeripheral0(ResetMskSpi1); ///<复位模块
//SPI1模块配置:主机
SpiInitStruct.enSpiMode = SpiMskMaster; //配置位主机模式
SpiInitStruct.enPclkDiv = SpiClkMskDiv2; //波特率:PCLK/2
SpiInitStruct.enCPHA = SpiMskCphasecond; //第二边沿采样
SpiInitStruct.enCPOL = SpiMskcpolhigh; //极性为高
//SPI1模块配置:主机
SpiInitStruct.enSpiMode = SpiMskMaster; //配置位主机模式
SpiInitStruct.enPclkDiv = SpiClkMskDiv2; //波特率:PCLK/2
SpiInitStruct.enCPHA = SpiMskCphasecond; //第二边沿采样
SpiInitStruct.enCPOL = SpiMskcpolhigh; //极性为高
Spi_Init(M0P_SPI1, &SpiInitStruct);
}
@@ -539,28 +539,28 @@ static void I2C0Init(void)
DDL_ZERO_STRUCT(stcI2cCfg);
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //开启GPIO时钟门控
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //开启GPIO时钟门控
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出
stcGpioCfg.enOD = GpioOdEnable; ///< 开漏输出
stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能
stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出
stcGpioCfg.enOD = GpioOdEnable; ///< 开漏输出
stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能
stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止
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_Init(I2C0_SDA_PORTx, I2C0_SDA_PINx, &stcGpioCfg);
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.enMode = I2cMasterMode; ///< 主机模式
stcI2cCfg.u8SlaveAddr = 0xD5; ///< 从地址,主模式无效
stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭
I2C_Init(M0P_I2C0, &stcI2cCfg); ///< 模块初始化
stcI2cCfg.enMode = I2cMasterMode; ///< 主机模式
stcI2cCfg.u8SlaveAddr = 0xD5; ///< 从地址,主模式无效
stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭
I2C_Init(M0P_I2C0, &stcI2cCfg); ///< 模块初始化
}
static void I2C1Init(void)
@@ -571,37 +571,37 @@ static void I2C1Init(void)
DDL_ZERO_STRUCT(stcI2cCfg);
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //开启GPIO时钟门控
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //开启GPIO时钟门控
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出
stcGpioCfg.enOD = GpioOdEnable; ///< 开漏输出
stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能
stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出
stcGpioCfg.enOD = GpioOdEnable; ///< 开漏输出
stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能
stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止
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_Init(I2C1_SDA_PORTx, I2C1_SDA_PINx, &stcGpioCfg);
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.enMode = I2cMasterMode; ///< 主机模式
stcI2cCfg.u8SlaveAddr = 0xD5; ///< 从地址,主模式无效
stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭
I2C_Init(M0P_I2C1, &stcI2cCfg); ///< 模块初始化
stcI2cCfg.enMode = I2cMasterMode; ///< 主机模式
stcI2cCfg.u8SlaveAddr = 0xD5; ///< 从地址,主模式无效
stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭
I2C_Init(M0P_I2C1, &stcI2cCfg); ///< 模块初始化
}
static void WdtInit(void)
{
#if (USE_WDT == 1)
///< 开启WDT外设时钟
///< 开启WDT外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralWdt,TRUE);
///< WDT 初始化
///< WDT 初始化
Wdt_Init(WdtResetEn, WdtT52s4);
Wdt_Start();
#endif
@@ -734,7 +734,7 @@ uint32_t GetSysTick(void)
{
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;
while(uS--)
@@ -779,24 +779,24 @@ void PortB_IRQHandler(void)
void PortC_IRQHandler(void)
{
//加速度INT1
//加速度INT1
if(TRUE == Gpio_GetIrqStatus(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx)) {
Gpio_ClearIrq(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx);
Lsm6dsInt1CallBack();
}
//地磁INT
//地磁INT
if(TRUE == Gpio_GetIrqStatus(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx)) {
Gpio_ClearIrq(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx);
MMC5983IntCallBack();
}
}
///<LPUART0 中断服务函数
///<LPUART0 中断服务函数
void LpUart0_IRQHandler(void)
{
if(LPUart_GetStatus(M0P_LPUART0, LPUartRC)) { ///接收数据
LPUart_ClrStatus(M0P_LPUART0, LPUartRC); ///<清接收中断请求
uint8_t u8RxData = LPUart_ReceiveData(M0P_LPUART0); ///读取数据
if(LPUart_GetStatus(M0P_LPUART0, LPUartRC)) { ///接收数据
LPUart_ClrStatus(M0P_LPUART0, LPUartRC); ///<清接收中断请求
uint8_t u8RxData = LPUart_ReceiveData(M0P_LPUART0); ///读取数据
LPUartRx_CallBack(u8RxData);
DebugUartIRQ(u8RxData);
}
@@ -804,9 +804,9 @@ void LpUart0_IRQHandler(void)
void Uart0_IRQHandler(void)
{
if(Uart_GetStatus(M0P_UART0, UartRC)) { ///接收数据
Uart_ClrStatus(M0P_UART0, UartRC); ///<清接收中断请求
uint8_t u8RxData = Uart_ReceiveData(M0P_UART0); ///读取数据
if(Uart_GetStatus(M0P_UART0, UartRC)) { ///接收数据
Uart_ClrStatus(M0P_UART0, UartRC); ///<清接收中断请求
uint8_t u8RxData = Uart_ReceiveData(M0P_UART0); ///读取数据
DebugUartIRQ(u8RxData);
}
}
@@ -814,7 +814,7 @@ void Uart0_IRQHandler(void)
void Rtc_IRQHandler(void)
{
if(Rtc_GetPridItStatus() == TRUE) {
Rtc_ClearPrdfItStatus(); //清除中断标志位
Rtc_ClearPrdfItStatus(); //清除中断标志位
RtcIRQHander();
}
}
@@ -823,19 +823,19 @@ void LpTim0_IRQHandler(void)
{
if(Lptim_GetItStatus(M0P_LPTIMER0) == TRUE)
{
Lptim_ClrItStatus(M0P_LPTIMER0);//清除LPTimer0的中断标志位
Lptim_ClrItStatus(M0P_LPTIMER0);//清除LPTimer0的中断标志位
LPTimer0IRQHander();
}
}
///<深度休眠模式外部端口配置(STK)
///<深度休眠模式外部端口配置(STK)
static void DeepSleepGPIOCfg(void)
{
stc_gpio_cfg_t GpioInitStruct;
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
//低功耗状态下未使用的脚配置
//输入上拉
//低功耗状态下未使用的脚配置
//输入上拉
GpioInitStruct.enDir = GpioDirIn;
GpioInitStruct.enPu = GpioPuEnable;
@@ -843,7 +843,7 @@ static void DeepSleepGPIOCfg(void)
Gpio_Init(SPI0_SCK_PORTx,SPI0_SCK_PINx,&GpioInitStruct);
Gpio_Init(SPI0_MISO_PORTx,SPI0_MISO_PINx,&GpioInitStruct);
//输入下拉
//输入下拉
GpioInitStruct.enDir = GpioDirIn;
GpioInitStruct.enPd = GpioPdEnable;
@@ -855,26 +855,26 @@ void EnterDeepSleep(void)
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
//< LORA
Sx1276LoRaSleep();//Lora睡眠
LORAIntDisable();//关闭LORA中断
Sx1276LoRaSleep();//Lora睡眠
LORAIntDisable();//关闭LORA中断
ACCandMMCIntDisable();//关闭加速度和地磁中断
ACCandMMCIntDisable();//关闭加速度和地磁中断
#if (USE_VBAT_AD == 1)//< AD
AD_OFF();
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
Sysctrl_ClkSourceEnable(SysctrlClkPLL,FALSE);
Bgr_BgrDisable(); ///< 关闭BGR
Bgr_BgrDisable(); ///< 关闭BGR
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, FALSE);
Adc_SGL_Stop();//关闭单次采样
Adc_SGL_Stop();//关闭单次采样
#endif
#if (USE_SPI0 == 1)
Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,FALSE);//关闭SPI0外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,FALSE);//关闭SPI0外设时钟
#endif
#if (USE_UART0 == 1)
EnableNvic(UART0_2_IRQn, IrqLevel3, false);
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,FALSE); //关闭UART0时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,FALSE); //关闭UART0时钟
#endif
DeepSleepGPIOCfg();
@@ -901,9 +901,9 @@ void WakeUpInit(void)
WdtInit();
#endif
LORAIntEnable();//开启LORA中断
Sx1276LoRaWakeup();//LORA唤醒
ACCandMMCIntEnable();//开启加速度和地磁中断
LORAIntEnable();//开启LORA中断
Sx1276LoRaWakeup();//LORA唤醒
ACCandMMCIntEnable();//开启加速度和地磁中断
SysTick_Config(SystemCoreClock/1000);
}
+92 -61
View File
@@ -1,4 +1,4 @@
/******************************************************************************
* Include files
******************************************************************************/
@@ -20,17 +20,17 @@ extern uint32_t CommWay;
extern uint32_t DeviceSign;
extern uint32_t AddNumber;
extern uint8_t LocalMAC[6]; //本机MAC地址
extern uint8_t GatewayMAC[6]; //网关MAC地址,注册时全为0
extern uint8_t LocalDataPack[sizeof(SGCP.DevData.LaserTracing)]; //本机数据包 //本机数据包
extern uint8_t LocalMAC[6]; //本机MAC地址
extern uint8_t GatewayMAC[6]; //网关MAC地址,注册时全为0
extern uint8_t LocalDataPack[sizeof(SGCP.DevData.LaserTracing)]; //本机数据包 //本机数据包
bool MainDispEn = true;
bool DataDispEn = true;
/*****************************************************************************************
* 函数名称: MainDBGOnOff
* 功能描述: 主调试信息开关函数
* 参 数: OnOff,开关
* 返 回 值: 无
* 函数名称: MainDBGOnOff
* 功能描述: 主调试信息开关函数
* 参 数: OnOff,开关
* 返 回 值: 无
*****************************************************************************************/
void MainDBGOnOff(bool OnOff)
{
@@ -41,10 +41,10 @@ void MainDBGOnOff(bool OnOff)
DBG_LOG("\r\nMain Display Disable!\r\n\r\n");
}
/*****************************************************************************************
* 函数名称: DataDBGOnOff
* 功能描述: 数据信息开关函数
* 参 数: OnOff,开关
* 返 回 值: 无
* 函数名称: DataDBGOnOff
* 功能描述: 数据信息开关函数
* 参 数: OnOff,开关
* 返 回 值: 无
*****************************************************************************************/
void DataDBGOnOff(bool OnOff)
{
@@ -82,17 +82,17 @@ static void AppInit(void)
LocalMAC[i] = *((volatile const uint8_t *)(0x00002800 + i));
}
memcpy(&App.Para.BLPara.DevMac, &LocalMAC[0], 6);
LocalType = (App.Para.BLPara.DevMac[0] | (App.Para.BLPara.DevMac[1] << 8)); //本机设备类型
CommWay = App.Para.BLPara.DevMac[2]; //本机通讯方式
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; //本机地址编号,数字部分对应唯一地址编号
LocalType = (App.Para.BLPara.DevMac[0] | (App.Para.BLPara.DevMac[1] << 8)); //本机设备类型
CommWay = App.Para.BLPara.DevMac[2]; //本机通讯方式
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; //本机地址编号,数字部分对应唯一地址编号
#else
LocalType = LASER_TRACING; //本机设备类型
CommWay = LORA; //本机通讯方式
DeviceSign = MASTER; //本机设备标志
AddNumber = 0x000023 + DeviceSign;//本机地址编号,数字部分对应唯一地址编号
LocalType = LASER_TRACING; //本机设备类型
CommWay = LORA; //本机通讯方式
DeviceSign = MASTER; //本机设备标志
AddNumber = 0x000023 + DeviceSign;//本机地址编号,数字部分对应唯一地址编号
App.Para.BLPara.LoraFreq = CH0;
LocalMAC[0] = LocalType & 0xFF; //本机MAC地址
LocalMAC[0] = LocalType & 0xFF; //本机MAC地址
LocalMAC[1] = (LocalType >> 8) & 0xFF;
LocalMAC[2] = CommWay;
LocalMAC[3] = (AddNumber >> 16) & 0xFF;
@@ -104,7 +104,7 @@ static void AppInit(void)
if(App.Para.FactoryFlag != 0x00)
{
App.Para.FactoryFlag = 0x00;
/*校准参数初始化*/
/*校准参数初始化*/
App.Para.CaliPara.PitchZero = 0;
App.Para.CaliPara.RollZero = 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)
App.Para.BLPara.LoraFreq = CH0;
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){
App.Para.Rs485Ch1.Addr = 1;
@@ -159,10 +159,10 @@ static void AppInit(void)
}
SAVE_APP_PARA((uint32_t *)&App.Para);
LpUart0Init(App.Para.Rs485Ch1.BaudRate);//低功耗串口初始化
LpUart0Init(App.Para.Rs485Ch1.BaudRate);//低功耗串口初始化
LORAIntEnable();
LoraInit(); //< LORA芯片初始化
LoraInit(); //< LORA芯片初始化
FeedDog();
Lsm6dslInit();
@@ -173,7 +173,7 @@ static void AppInit(void)
LPTimer0_OFF();
uint32_t seed = 0;//< 随机数初始化
uint32_t seed = 0;//< 随机数初始化
seed = seed + LocalMAC[2];
seed = (seed << 8) + LocalMAC[3];
seed = (seed << 8) + LocalMAC[4];
@@ -194,10 +194,10 @@ static void AppInit(void)
App.LoginFlag = false;
App.Login_RTC = false;
App.Login_LPTimer0 = true;
//LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
LPTimer0_ON(50);//5秒后注册
MAIN_DBG_LOG("Login LPTimer0 Open\r\n");
//LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
LPTimer0_ON(50);//5秒后注册
SGCP.LaserTimerMinutes = 10; //激光定时关闭默认10分钟
SGCP.LaserTimerCount = 0;
App.Upload45S10SCount = 0;
App.UploadFlag = false;
App.Upload_LPTimer0 = false;
@@ -282,7 +282,7 @@ static void ReadDataLoopHandler(void)
RollDiff = App.ConvertedData.Roll - App.Para.CaliPara.RollZero;
if((PitchDiff > ERINTERVAL_VPT) || (RollDiff > ERINTERVAL_VPT))
{
//触发紧急上报
//触发紧急上报
App.ERFlag = true;
DATA_DBG_LOG("PitchDiff=%04d, PitchDiff=%04d\r\n", PitchDiff,RollDiff);
DATA_DBG_LOG("Start emergency reporting!\r\n");
@@ -300,7 +300,7 @@ static void ReadDataLoopHandler(void)
SGCP.DevData.LaserTracing.MasterDev.BatLevel = 0x00;
#endif
#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
SGCP.DevData.LaserTracing.MasterDev.RSSI = 0x00;
SGCP.DevData.LaserTracing.MasterDev.Nsr = 0x00;
@@ -308,7 +308,7 @@ static void ReadDataLoopHandler(void)
memcpy(LocalDataPack, &SGCP.DevData.LaserTracing, sizeof(LocalDataPack));
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.UpdateOk = true;
break;}
@@ -333,7 +333,7 @@ static void AppLoopHandler(void)
case APP_STATUS_ON:{
if(App.TD1mSDelayCnt <= 0){
App.TD1mSDelayCnt = 300;//唤醒后待机时间
App.TD1mSDelayCnt = 300;//唤醒后待机时间
App.Status = APP_STATUS_ACTION;
}
break;}
@@ -348,15 +348,15 @@ static void AppLoopHandler(void)
if(SGCP.InStatus != IN_STATUS_IDLE){
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();
App.LoginFlag = false;
LPTimer0_OFF();//关闭低功耗定时器
SGCP.GWStatus = GW_STATUS_LOGIN;//注册
LPTimer0_OFF();//关闭低功耗定时器
SGCP.GWStatus = GW_STATUS_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();
SGCP.TimingAcquisition = false;
@@ -368,23 +368,28 @@ static void AppLoopHandler(void)
{
PrintfMess();
App.UploadFlag = false;
LPTimer0_OFF();//关闭低功耗定时器
SGCP.GWStatus = GW_STATUS_UPLOAD_SENSOR;//上传
LPTimer0_OFF();//关闭低功耗定时器
SGCP.GWStatus = GW_STATUS_UPLOAD_SENSOR;//上传
App.Status = APP_STATUS_WAIT_UPLOAD;
}
else if(SGCP.LaserOnOff == true && SGCP.LaserTimerCount == 0 && SGCP.GWStatus == GW_STATUS_IDLE)
{
SGCP.LaserOnOff = false;
SGCP.GWStatus = GW_STATUS_LASER_STARES;
}
else if(App.RDStatus == READDATA_STATUS_IDLE
&& SGCP.GWStatus == GW_STATUS_IDLE
&& SGCP.InStatus == IN_STATUS_IDLE
&& SGCP.TimingAcquisition == false
&& App.TD1mSDelayCnt == 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;
}
break;}
case APP_STATUS_WAIT_LOGIN:{
if(SGCP.LoginMess == true)
{
@@ -398,14 +403,14 @@ static void AppLoopHandler(void)
MAIN_DBG_LOG("Login RTC Open\r\n");
App.Login2Min30SCount = 0;
App.Login30MinCount = 0;
App.Login_RTC = true;//启动30分注册定时器
App.Login_RTC = true;//启动30分注册定时器
}
else
{
PrintfMess();
App.Login_LPTimer0 = true;
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
//LPTimer0_ON(100);//定时10s
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
//LPTimer0_ON(100);//定时10s
MAIN_DBG_LOG("Number of registration failures:%d\r\n",App.Login2Min30SCount);
MAIN_DBG_LOG("Login LPTimer0 Open\r\n");
}
@@ -443,8 +448,8 @@ static void AppLoopHandler(void)
{
PrintfMess();
App.Upload_LPTimer0 = true;
LPTimer0_ON((App.Nonce % 100) + 450);//随机延时100~10000ms+45秒后重新发送
//LPTimer0_ON(100);//定时10s
LPTimer0_ON((App.Nonce % 100) + 450);//随机延时100~10000ms+45秒后重新发送
//LPTimer0_ON(100);//定时10s
MAIN_DBG_LOG("Number of failed uploads:%d\r\n",App.Upload45S10SCount);
MAIN_DBG_LOG("Upload LPTimer0 Open\r\n");
}
@@ -468,6 +473,8 @@ static void App1mSRoutine(void)
if(App.ReadData1mSDelayCnt > 0)
App.ReadData1mSDelayCnt--;
App.FeedDogDlyCnt++;
if(App.AttTestMode == true && App.AttTestCnt > 0)
App.AttTestCnt--;
}
void FeedDogHandler(void)
@@ -480,7 +487,7 @@ void FeedDogHandler(void)
void SystemResetHandler(void)
{
//系统定时重启
//系统定时重启
if(App.SysResetTimeCnt > SYSTEM_TIMING_LOGIN) {
delay_ms(5);
SystemReset();
@@ -500,7 +507,7 @@ void SystemResetHandler(void)
int32_t main(void)
{
BspInit();
delay_ms(3000);//上电延时,等待从设备启动
delay_ms(3000);//上电延时,等待从设备启动
AppInit();
DBG_LOG("\r\n\r\n");
@@ -530,10 +537,29 @@ int32_t main(void)
GwRevLoopHandler();
InRevLoopHandler();
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)
{
@@ -546,20 +572,20 @@ void SysTick_CallBack(void)
void RtcIRQHander(void)
{
//SGCP.TimingAcquisition = true; //30S更新一次数据
//SGCP.TimingAcquisition = true; //30S更新一次数据
if(SGCP.LoginOk == true)
{
App.RepeLoginCount++;
if(App.RepeLoginCount >= SYSTEM_TIMING_LOGIN){
MAIN_DBG_LOG("24h Repetition Login\r\n");
App.RepeLoginCount = 0;
SGCP.LoginOk = false;//24h重复注册
SGCP.LoginOk = false;//24h重复注册
App.Login2Min30SCount = 0;
App.Login30MinCount = 0;
App.Login_RTC = false;//关闭30分注册定时器
App.Login_RTC = false;//关闭30分注册定时器
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");
}
@@ -567,7 +593,7 @@ void RtcIRQHander(void)
if(App.Coll_N >= App.Para.Layout.CollectTime)
{
App.Coll_N = 0;
SGCP.TimingAcquisition = true; //定时更新数据
SGCP.TimingAcquisition = true; //定时更新数据
}
if(App.ERFlag == true)
@@ -583,7 +609,7 @@ void RtcIRQHander(void)
{
App.ERTime_N = 0;
App.ERFlag = false;
SGCP.MasterCaliOk = true;//紧急上报时间结束,重新校准参数
SGCP.MasterCaliOk = true;//紧急上报时间结束,重新校准参数
}
}
else{
@@ -599,19 +625,24 @@ void RtcIRQHander(void)
if(App.Login_RTC == true)
{
App.Login30MinCount++;
if(App.Login30MinCount >= ERR_TIMING_LOGIN)//30分钟重置注册错误信息
if(App.Login30MinCount >= ERR_TIMING_LOGIN)//30分钟重置注册错误信息
{
PrintfMess();
App.Login30MinCount = 0;
App.Login_RTC = false;//关闭30分注册定时器
App.Login_RTC = false;//关闭30分注册定时器
MAIN_DBG_LOG("Login RTC Close\r\n");
App.Login_LPTimer0 = true;
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
//LPTimer0_ON(100);//定时10s
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
//LPTimer0_ON(100);//定时10s
MAIN_DBG_LOG("Login LPTimer0 Open\r\n");
}
}
if(SGCP.LaserOnOff == true && SGCP.LaserTimerCount > 0)
{
SGCP.LaserTimerCount--;
}
}
void LPTimer0IRQHander(void)
{