2025-09-12下班备份

This commit is contained in:
2025-09-12 18:42:34 +08:00
parent 65050998b4
commit 4a33e4970a
20 changed files with 4496 additions and 500 deletions
@@ -0,0 +1,751 @@
#include "bsp.h"
#include "Algorithm.h"
#include "Debug.h"
/*****************************************************************************************
* 函数名称: check_peaks_valleys_ratio
* 功能描述: 检查数据的峰值是否大于0,谷值是否小于0(忽略0值)
* 参 数: data, 数据
length, 数据长度
* 返 回 值: 结果返回峰值谷值检查结果结构体
*****************************************************************************************/
PeakValleyCheck check_peaks_valleys(int data[], int length) {
PeakValleyCheck result = {true, true, 0, 0};
// 如果数据长度小于3,无法形成有效的峰值/谷值
if (length < 3) {
return result;
}
int i = 0;
// 跳过开头的0值
while (i < length && data[i] == 0) {
i++;
}
// 遍历数据点
while (i < length) {
// 1. 寻找下一个非零点作为起点
int start = i;
while (i < length && data[i] == 0) {
i++;
}
if (i >= length) break;
// 2. 寻找当前非零段的结束点
int end = i;
while (end < length && data[end] != 0) {
end++;
}
end--; // 指向最后一个非零点
// 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) {
result.peaks_positive = false;
}
}
// 检查是否为谷值(小于左右相邻的非零点)
if (data[j] < data[j-1] && data[j] < data[j+1]) {
result.valley_count++;
if (data[j] >= 0) {
result.valleys_negative = false;
}
}
}
// 移动到下一段
i = end + 1;
}
return result;
}
/*****************************************************************************************
* 函数名称: analyze_trend
* 功能描述: 趋势分析函数
* 参 数: data, 数据
length, 数据长度
* 返 回 值: 结果返回趋势分析结构体
*****************************************************************************************/
TrendResult analyze_trend(int data[], int length) {
TrendResult result = {0};
#if 1
// 0. 检查有效数据长度
if (length < 2) {
DBG_LOG("Data deficient\r\n");
return result;
}
// 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 y = data[i];
sum_x += x;
sum_y += y;
sum_xy += x * y;
sum_x2 += x * x;
}
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. 计算振荡特征(差分符号变化次数)
int sign_changes = 0;
int prev_sign = 0; // 0=未初始化, 1=正, -1=负
for (int i = 1; i < length; i++) {
int diff = data[i] - data[i-1];
int curr_sign = (diff > 0) ? 1 : (diff < 0) ? -1 : 0;
if (curr_sign != 0) {
if (prev_sign != 0 && curr_sign != prev_sign) {
sign_changes++;
}
prev_sign = curr_sign;
}
}
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); // 长度标准化
#endif
#if 0
// 4. 趋势判断
if (sign_changes >= oscillation_threshold) {
//DBG_LOG("Oscillating trend\r\n");//振荡趋势
result.trend_type = 0;
} else if (fabs(result.slope) < slope_threshold) {
//DBG_LOG("Smooth trend\r\n");//平稳趋势
result.trend_type = 1;
} else if (result.slope > 0) {
//DBG_LOG("Up trend\r\n");//上升趋势
result.trend_type = 2;
} else {
//DBG_LOG("Down trend\r\n");//下降趋势
result.trend_type = 3;
}
#endif
#if 0
// 5. 陡峭判断
double abs_slope = fabs(result.slope);
if (abs_slope > 0.8) {
//DBG_LOG("Steeply");//陡峭
result.sign_changes = 0;
} else if (abs_slope > 0.3) {
//DBG_LOG("Obvious");//明显
result.sign_changes = 1;
} else if (abs_slope > 0.1) {
//DBG_LOG("Mild");//温和
result.sign_changes = 2;
} else {
//DBG_LOG("gentle");//平缓
result.sign_changes = 3;
}
#endif
return result;
}
/*****************************************************************************************
* 函数名称: calculateAverage
* 功能描述: 计算平均值
* 参 数: arr, 数据
size, 数据长度
* 返 回 值: 结果返回 long long 防溢出
*****************************************************************************************/
float calculateAverage(int *arr, int size)
{
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i]; // 累加数组中的每个元素
}
return (float)sum / size; // 返回平均值
}
/*****************************************************************************************
* 函数名称: slope
* 功能描述: 计算斜率
* 参 数: x_data, x轴数据
y_data, y轴数据
* 返 回 值: 结果返回 long long 防溢出
*****************************************************************************************/
double slope(int32_t *x_data, int32_t *y_data, int n)
{
double sum_x = 0, sum_y = 0, sum_xx = 0, sum_xy = 0;
for (int i = 0; i < n; i++) {
sum_x += x_data[i];
sum_y += y_data[i];
sum_xx += pow(x_data[i] - calculateAverage(x_data, n), 2);
sum_xy += (x_data[i] - calculateAverage(x_data, n)) * (y_data[i] - calculateAverage(y_data, n));
}
return sum_xy / sum_xx;
}
/*****************************************************************************************
* 函数名称: 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; // 指数为奇数时累乘
}
base *= base; // 底数平方
exponent /= 2; // 指数折半
}
return result;
}
/*****************************************************************************************
* 函数名称: IntFilter_16t
* 功能描述: 16位数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的16位数据
*****************************************************************************************/
int IntFilter_16t(int16_t *Data, uint8_t Cnt, uint8_t FilterCnt)
{
int32_t sum = 0;
int32_t temp;
if(Cnt < 2)
return *Data;
for(int j=0; j<Cnt-1; j++) {
for(int i=0; i<Cnt-j-1; i++) {
if(Data[i] > Data[i+1]) {
temp = Data[i];
Data[i] = Data[i+1];
Data[i+1] = temp;
}
}
}
for(int count = FilterCnt / 2; count < Cnt - FilterCnt / 2; count++)
sum += Data[count];
return (sum / (Cnt - FilterCnt));
}
/*****************************************************************************************
* 函数名称: IntFilter_32t
* 功能描述: 32位数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据
*****************************************************************************************/
int IntFilter_32t(int32_t *Data, uint8_t Cnt, uint8_t FilterCnt)
{
int32_t sum = 0;
int32_t temp;
if(Cnt < 2)
return *Data;
for(int j=0; j<Cnt-1; j++) {
for(int i=0; i<Cnt-j-1; i++) {
if(Data[i] > Data[i+1]) {
temp = Data[i];
Data[i] = Data[i+1];
Data[i+1] = temp;
}
}
}
for(int count = FilterCnt / 2; count < Cnt - FilterCnt / 2; count++)
sum += Data[count];
return (sum / (Cnt - FilterCnt));
}
/*****************************************************************************************
* 函数名称: IntFilter_u32t
* 功能描述: 32位无符号位数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据
*****************************************************************************************/
uint32_t IntFilter_u32t(uint32_t *Data, uint8_t Cnt, uint8_t FilterCnt)
{
uint32_t sum = 0;
uint32_t temp;
if(Cnt < 2)
return *Data;
for(int j=0; j<Cnt-1; j++) {
for(int i=0; i<Cnt-j-1; i++) {
if(Data[i] > Data[i+1]) {
temp = Data[i];
Data[i] = Data[i+1];
Data[i+1] = temp;
}
}
}
for(int count = FilterCnt / 2; count < Cnt - FilterCnt / 2; count++)
sum += Data[count];
return (sum / (Cnt - FilterCnt));
}
/*****************************************************************************************
* 函数名称: IntFilter_Float
* 功能描述: 32位浮点数数据中值滤波函数
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
FilterCnt, 滤除的数据长度,必须为2的倍数
* 返 回 值: 滤波后的32位数据
*****************************************************************************************/
float IntFilter_Float(float *Data, uint8_t Cnt, uint8_t FilterCnt)
{
float sum = 0;
float temp;
if(Cnt < 2)
return *Data;
for(int j=0; j<Cnt-1; j++) {
for(int i=0; i<Cnt-j-1; i++) {
if(Data[i] > Data[i+1]) {
temp = Data[i];
Data[i] = Data[i+1];
Data[i+1] = temp;
}
}
}
for(int count = FilterCnt / 2; count < Cnt - FilterCnt / 2; count++)
sum += Data[count];
return (sum / (Cnt - FilterCnt));
}
/*****************************************************************************************
* 函数名称: AverageFilter_u32t
* 功能描述: 32位数据均值滤波函数,去除了最大值和最小值
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
* 返 回 值: 滤波后的32位数据
*****************************************************************************************/
uint32_t AverageFilter_u32t(uint32_t *Data, uint8_t Cnt)
{
uint32_t sum = 0;
uint32_t temp;
uint32_t max = Data[0];
uint32_t min = Data[0];
if(Cnt == 0)
return 0;
if(Cnt == 1)
return Data[0];
if(Cnt == 2)
{
sum = Data[0] + Data[1];
return sum / 2;
}
for (uint8_t i = 0; i < Cnt; i++)//找出最大值
{
if (Data[i] > max)
{
max = Data[i];
}
}
for (uint8_t i = 0; i < Cnt; i++)//找出最小值
{
if (Data[i] < min)
{
min = Data[i];
}
}
for(int i = 0; i < Cnt; i++){//求和
sum += Data[i];
}
return (sum - max - min) / (Cnt - 2);
}
/*****************************************************************************************
* 函数名称: AverageFilter_32t
* 功能描述: 32位数据均值滤波函数,去除了最大值和最小值
* 参 数: Data, 滤波数据
Cnt, 滤波数据长度
* 返 回 值: 滤波后的32位数据
*****************************************************************************************/
int AverageFilter_32t(int32_t *Data, uint8_t Cnt)
{
int32_t sum = 0;
int32_t max = Data[0];
int32_t min = Data[0];
if(Cnt == 0)
return 0;
if(Cnt == 1)
return Data[0];
if(Cnt == 2)
{
sum = Data[0] + Data[1];
return sum / 2;
}
for (uint8_t i = 0; i < Cnt; i++)//找出最大值
{
if (Data[i] > max)
{
max = Data[i];
}
}
for (uint8_t i = 0; i < Cnt; i++)//找出最小值
{
if (Data[i] < min)
{
min = Data[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, 拟合数据个数
* 返 回 值: 无
*****************************************************************************************/
void Fitting_Polynomial(double *AD, double *Actual, uint8_t Cnt)
{
static const uint8_t rank_ = 3;//拟合阶数3
double atemp[2 * (rank_ + 1)], b[rank_ + 1], a[rank_ + 1][rank_ + 1];
int i, j, k;
for(i = 0; i < Cnt; i++){
atemp[1] += AD[i];
atemp[2] += pow(AD[i], 2);
atemp[3] += pow(AD[i], 3);
atemp[4] += pow(AD[i], 4);
atemp[5] += pow(AD[i], 5);
atemp[6] += pow(AD[i], 6);
b[0] += Actual[i];
b[1] += AD[i] * Actual[i];
b[2] += pow(AD[i], 2) * Actual[i];
b[3] += pow(AD[i], 3) * Actual[i];
}
atemp[0] = Cnt;
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列
int column = k;
double mainelement = a[k][k];
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++){ //交换两行
double atemp = a[k][j];
a[k][j] = a[column][j];
a[column][j] = atemp;
}
double btemp = b[k];
b[k] = b[column];
b[column] = btemp;
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]; //回代过程
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]);
// App.Para.Cali.FitCoef[0] = b[0];
// App.Para.Cali.FitCoef[1] = b[1];
// App.Para.Cali.FitCoef[2] = b[2];
// App.Para.Cali.FitCoef[3] = b[3];
}
/*****************************************************************************************
* 函数名称: 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
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的总和
}
aveCol_X = 1.0 * sumCol_X / count;//求平均值
aveRow_Y = 1.0 * sumRow_Y / count;
k = (sum_XY - aveCol_X * aveRow_Y * count) / //根据公式求斜率
(sumCol_X2 - aveCol_X * aveCol_X * count);
return k;
}
/*****************************************************************************************
* 函数名称: TrendAnalyse
* 功能描述: 判断数组中的值的总体趋势
* 参 数: Data,
Cnt,
VPT,
* 返 回 值: true或false
*****************************************************************************************/
int8_t TrendAnalyse(int32_t *Data, uint8_t Cnt, int32_t VPT)
{
int8_t zero = 0,plus = 0, minus = 0, Trend = 0xEE;
if(Cnt < 2)
return Trend;
for(uint8_t i = 1; i < Cnt; i++)
{
if((Data[i] - Data[i - 1]) <= VPT && ((Data[i] - Data[i - 1]) >= (-VPT)))
{
zero++;
}
else if((Data[i] - Data[i - 1]) > VPT)
{
plus++;
}
else if((Data[i] - Data[i - 1]) < VPT)
{
minus++;
}
}
if(zero > (Cnt-(Cnt / 5)))
Trend = 0;//振荡趋势
else if(plus > (Cnt-(Cnt/ 5)))
Trend = 1;//上升趋势
else if(minus > (Cnt-(Cnt/ 5)))
Trend = -1;//下降趋势
return Trend;//总趋势
}
/*****************************************************************************************
* 函数名称: 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++)//找出峰值地址
{
if(Data[i] < Data[i + 1] && Data[i + 1] > Data[i + 2])
{
peak[j++] = i;
}
if(j == pCnt)
break;
}
for(uint8_t i = 0; i < pCnt; i++)
{
vlue[i] = Data[peak[i]];
}
}
/*****************************************************************************************
* 函数名称: 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++)//找出峰值地址
{
if(Data[i] > Data[i + 1] && Data[i + 1] < Data[i + 2])
{
peak[j++] = i;
}
if(j == pCnt)
break;
}
for(uint8_t i = 0; i < pCnt; i++)
{
vlue[i] = Data[peak[i]];
}
}
/*****************************************************************************************
* 函数名称: count_most_greater
* 功能描述: 判断数组中的值是否大部分大于 target
* 参 数: arr,
size,
target,
* 返 回 值: true或false
*****************************************************************************************/
bool count_most_greater(int32_t *arr, uint8_t size, int32_t target)
{
uint8_t cnt = 0;
for (int i = 0; i < size; i++) {
if (arr[i] < target)
cnt++;
if(cnt > (size - (size / 5)))
return false;
}
return true;
}
/*****************************************************************************************
* 函数名称: count_greater
* 功能描述: 判断数组中的值是否全部大于 target
* 参 数: arr,
size,
target,
* 返 回 值: true或false
*****************************************************************************************/
bool count_greater(int32_t *arr, uint8_t size, int32_t target)
{
for (int i = 0; i < size; i++) {
if (arr[i] < target)
return false;
}
return true;
}
/*****************************************************************************************
* 函数名称: count_smaller
* 功能描述: 判断数组中的值是否全部小于 target
* 参 数: arr,
size,
target,
* 返 回 值: true或false
*****************************************************************************************/
bool count_smaller(int32_t *arr, uint8_t size, int32_t target)
{
for (int i = 0; i < size; i++) {
if (arr[i] > target)
return false;
}
return true;
}
/*****************************************************************************************
* 函数名称: CRC_Modbus
* 功能描述: CRC16计算函数
* 参 数: wBase, 多项式
Para,校验数据入口
Data, 校验数据长度入口
* 返 回 值: crc16校验值
*****************************************************************************************/
uint16_t CRC_Modbus(uint16_t wBase, uint8_t *para, uint16_t length)
{
uint16_t crc = 0xffff;
uint16_t index,i;
for(index = 0 ; index < length;index++) {
crc ^= para[index];
for(i = 0; i < 8; i++) {
if(crc & 1) {
crc >>= 1;
crc ^= wBase;
}
else
crc >>= 1;
}
}
return crc;
}
/*****************************************************************************************
* 函数名称: 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开始,跳过第一个字节
{
cmd_sum += _pbuff[i];
}
cmd_sum = (~cmd_sum);
return cmd_sum;
}
/*****************************************************************************************
* 函数名称: isAllZero
* 功能描述: 判断一个数组的值是否全部为0
* 参 数: arr,数组
size,长度
* 返 回 值: true或false
*****************************************************************************************/
bool isAllZero(uint8_t *arr, int size)
{
for (int i = 0; i < size; i++) {
if (arr[i] != 0) {
return false; // 如果数组中有一个元素不为0,则返回false
}
}
return true; // 遍历完数组后,若所有元素都为0,则返回true
}
+279
View File
@@ -0,0 +1,279 @@
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdarg.h>
#include "Debug.h"
#include "main.h"
#include "bsp.h"
#if (USE_DEBUG != 0)
#define DEBUG_CMD_CNT 8
const DBGFunType DebugFun[DEBUG_CMD_CNT];
static char buff[BUFSIZE];
volatile uint16_t iw=0; /* buffer write index*/
static uint16_t ir=0; /* buffer read index*/
static uint16_t DebugRxTimeOut1mSCnt;
static char RxBuff[128];
static uint8_t RxLen = 0;
void vcom_Print(uint8_t sLen);
void vcom_Send( char *format, ... )
{
va_list args;
va_start(args, format);
uint8_t len;
char tempBuff[DEBUG_BUFF_SIZE_MAX];
//uint32_t primask_bit;
uint8_t offset = 0;
//primask_bit = __get_PRIMASK();
//__disable_irq();
/*convert into string at buff[0] of length iw*/
len = vsprintf(&tempBuff[0], format, args);
while(offset < len) {
if((len - offset) < BUFSIZE) {
memcpy(&buff[0], &tempBuff[offset], len - offset);
vcom_Print(len - offset);
offset = len;
}
else {
memcpy(&buff[0], &tempBuff[offset], BUFSIZE);
offset += BUFSIZE;
vcom_Print(BUFSIZE);
}
}
//__set_PRIMASK(primask_bit);
//__enable_irq();
va_end(args);
}
// 定义一个函数vcom_Print,用于打印字符串
void vcom_Print(uint8_t sLen)
{
// 定义一个字符指针CurChar
char* CurChar;
// 初始化ir
ir = 0;
// 当ir小于sLen时,循环执行
while(ir < sLen)
{
// 获取字符指针CurChar
CurChar = &buff[ir++];
// 调用DebugUartSend函数,发送CurChar指向的字符,次数为1
DebugUartSend((uint8_t*)CurChar, 1);
}
}
// 定义一个函数vcom_Send2,用于发送字符串
void vcom_Send2(uint8_t *sData, uint16_t len)
{
// 遍历sData,将每个元素发送到DebugUartSend
for(int i = 0; i < len; i++) {
DebugUartSend(&sData[i], 1);
}
}
void DebugLoopHandler(void)
{
int argc = 0;
char *argv[10], *argp;
if(DebugRxTimeOut1mSCnt > 0 || RxLen == 0)
return;
//for(argv[argc] = strtok(RxBuff, " "); argv[argc] != NULL; argv[++argc] = strtok(NULL, " "));
// 解析字符串,将参数放入argv数组中
argp = strtok(RxBuff, " ");
for(int i = 0; i < 10; i++) {
if(argp != NULL) {
argv[argc++] = argp;
argp = strtok(NULL, " ");
}
else if(argc > 0){
argc--;
break;
}
}
// 获取第一个参数,并将其赋值给argp
argp = strtok(argv[argc], "'\r'");
// 如果argp不为空,则将argp的值赋值给argv[argc],并将argc加1
if(argp != NULL) {
argv[argc++] = argp;
}
// 否则,将RxLen设置为0,并返回
else {
RxLen = 0;
return;
}
// 遍历DebugFun数组,查找argv[0]是否与DBGCmd匹配,若匹配则调用DBGExec函数
for(int i = 0; i < DEBUG_CMD_CNT; i++) {
if(strcmp(argv[0], DebugFun[i].DBGCmd) == 0)
DebugFun[i].DBGExec(argc, argv);
}
memset(RxBuff, 0x00, 128);
RxLen = 0;
}
uint32_t RxTimeCurrent;
uint32_t RxTimeLast = 0;
// 函数:Dbg1msRoutine
// 功能:1ms调试时钟routine
void Dbg1msRoutine(void)
{
// 如果1ms调试时钟计数器大于0
if(DebugRxTimeOut1mSCnt > 0)
// 1ms调试时钟计数器减1
DebugRxTimeOut1mSCnt--;
}
// 定义函数DbgUsartRxIrqCallback,用于处理串口接收中断
void DbgUsartRxIrqCallback(void)
{
// 如果1分钟超时计数器为0,则清空RxLen
if(DebugRxTimeOut1mSCnt == 0)
RxLen = 0;
// 重置1分钟超时计数器
DebugRxTimeOut1mSCnt = 3;
// 读取串口接收到的数据
uint8_t Data = DbgUartRec();
// 如果RxLen小于128,则将数据添加到RxBuff中
if(RxLen < 128) {
RxBuff[RxLen++] = Data;
}
// DBG_LOG("RxBuff = %s\n", RxBuff);
// RS485_Flag=1;//接收标志为置1
}
void DebugTest(int argc, char *argv[])
{
// 如果参数个数小于2,则返回
if(argc < 2)
return;
// 如果参数为“?”,则打印帮助信息
if(strcmp(argv[1], "?") == 0)
{
DBG_LOG("Debug Cmd:\r\n\
disp task on/off -->Open the task display.\r\n");
return;
}
// 如果参数为“on”,则打印“Test ON”
if(strcmp(argv[1], "on") == 0)
{
// TestOn();
DBG_LOG("Test ON\r\n");
}
// 如果参数为“off”,则打印“Test OFF”
else if(strcmp(argv[1], "off") == 0)
{
// TestOFF();
DBG_LOG("Test OFF\r\n");
}
}
#if 0
void DebugCmdGps(int argc, char *argv[])
{
if(argc < 2)
return;
if(strcmp(argv[1], "?") == 0) {
DBG_LOG("Debug Cmd:\r\n\
gps on/off -->Turn the gps on or off.\r\n");
return;
}
if(strcmp(argv[1], "on") == 0) {
GPSStart();
}
else if(strcmp(argv[1], "off") == 0) {
GPSStop();
}
}
#endif
void DebugCmdHelp(int argc, char *argv[])
{
DBG_LOG("Debug Cmd:\r\n\
disp task on/off -->Open the task display.\r\n\
help\
");
}
//// 定义一个无参函数DebugReadData,用于读取数据
//void DebugReadData(int argc, char *argv[])
//{
// // 定义一个无符号32位整数ADReadStart,初始值为0
// uint32_t ADReadStart = 0;
// // 定义一个ADData_t类型的数组ADBuff,大小为640
// ADData_t ADBuff[640];
//
// // 当ADReadStart小于SDCARD_BLOCK_MAX时,循环执行
// while(ADReadStart < SDCARD_BLOCK_MAX) {
// // 使用SDCardReadBlocks函数读取数据,从ADReadStart开始,读取10个块,数据存储在ADBuff中
// SDCardReadBlocks(ADReadStart, 10, (uint8_t *)ADBuff);
// // 遍历ADBuff数组,将每个元素打印出来
// for(int i = 0; i < 640; i++) {
// DBG_LOG("%d\t%d\t%d\t%d\r\n", ADBuff[i].AD0, ADBuff[i].AD1, ADBuff[i].AD2, ADBuff[i].AD3);
// }
// // ADReadStart加10
// ADReadStart += 10;
// }
//}
//// 定义一个函数SetTime,参数为int argc和char *argv[]
//void SetTime(int argc, char *argv[])
//{
// // 定义一个字符数组test,并初始化为0
// char test[10] = 0;
// // 定义一个整数num,并初始化为0
// int num = 0;
// // 如果argc小于2,则返回
// if(argc < 2)
// return;
// // 如果argv[1]等于"?",则打印提示信息
// if(strcmp(argv[1], "?") == 0)
// {
// DBG_LOG("SetTime Cmd:\r\n\
// disp task on/off -->Open the task display.\r\n");
// return;
// }
// // 将argv[1]的值复制到test
// memcpy(test, (char *)argv[1], 10);
// // 将test转换为整数
// num = atoi(test);
// // 调用TimeSync函数,并将num作为参数传入
// TimeSync(num);
//}
const DBGFunType DebugFun[DEBUG_CMD_CNT] = {
"help", DebugCmdHelp,
// "TimeSync", (void*)TimeSync,
// "SetTime", SetTime,
};
#endif
@@ -1,4 +1,4 @@
#include "encryption.h"
#include "Encryption.h"
//从机加密表
const unsigned char EPT_Table[32][6] = {
+10 -10
View File
@@ -13,7 +13,7 @@
#define FLASH_WRITE_ADDR (0x0003C000u)
void SystemClockConfig(void);
static void SystemClockConfig(void);
uint16_t m_au16Adc1SaValue[4];
@@ -128,7 +128,7 @@ static void SystemClockConfig(void)
void FeedDog(void)
{
#if (WATCH_DOG == 1)
#if (USE_DEBUG == 1)
SWDT_RefreshCounter();
#endif
}
@@ -1059,7 +1059,7 @@ void BSP_Init(void)
Xtal32_ClockConfig();
GPIO_Config();
DbgUart_Config(500000);
RS485Uart_Config(9600);
RS485Uart_Config(9600);
Rtc_Config();
// SdioInit();
//Spi_Config();
@@ -1152,7 +1152,7 @@ void Error_Handler(void)
__weak void RS485UsartErrIrqCallback(void)
__WEAK void RS485UsartErrIrqCallback(void)
{
if(RS485_USART_CH->SR_f.ORE) {
RS485_USART_CH->CR1_f.CORE = 1;
@@ -1170,7 +1170,7 @@ __weak void RS485UsartErrIrqCallback(void)
__weak void RS485_RxPinIntCallBack(void)
__WEAK void RS485_RxPinIntCallBack(void)
{
}
@@ -1178,7 +1178,7 @@ __weak void RS485_RxPinIntCallBack(void)
__weak void DBGUsartErrIrqCallback(void)
__WEAK void DBGUsartErrIrqCallback(void)
{
if(DBG_USART_CH->SR_f.ORE) {
DBG_USART_CH->CR1_f.CORE = 1;
@@ -1192,12 +1192,12 @@ __weak void DBGUsartErrIrqCallback(void)
DBG_USART_CH->CR1_f.CFE = 1;
}
__weak void DbgUsartRxIrqCallback(void)
__WEAK void DbgUsartRxIrqCallback(void)
{
}
__weak void DBG_RxPinIntCallBack(void)
__WEAK void DBG_RxPinIntCallBack(void)
{
}
@@ -1207,7 +1207,7 @@ __weak void DBG_RxPinIntCallBack(void)
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
__weak void RtcPeriod_IrqCallback(void)
__WEAK void RtcPeriod_IrqCallback(void)
{
}
@@ -1220,7 +1220,7 @@ __weak void RtcPeriod_IrqCallback(void)
*****************************************************************************************/
extern void ADC_DMA_CallBack(void);
//int test = 0;
__weak void Dma1Btc0_IrqHandler(void)
__WEAK void Dma1Btc0_IrqHandler(void)
{
DMA_ClearIrqFlag(M4_DMA1, DmaCh0, BlkTrnCpltIrq);
ADC_DMA_CallBack();
+4 -4
View File
@@ -2,7 +2,7 @@
#include <math.h>
#include "main.h"
#include "encryption.h"
#include "Encryption.h"
#include "Debug.h"
@@ -56,7 +56,7 @@ int main(void)
{
BSP_Init();
DBG_LOG("**********************************************\r\n");
DBG_LOG("* Ver 1.0 2025-09-09 *\r\n");
DBG_LOG("* Ver 1.0 2024-01-15 *\r\n");
DBG_LOG("**********************************************\r\n");
while(1) {
DebugLoopHandler();
@@ -83,14 +83,14 @@ void SysTick_IrqHandler(void)
*****************************************************************************************/
void DBG_RxPinIntCallBack(void)
{
PORT_Toggle(LED_Blue_PORT, LED_Blue_PIN);
//PORT_Toggle(LED_Blue_PORT, LED_Blue_PIN);
}
void RtcPeriod_IrqCallback(void)
{
PORT_Toggle(LED_Green_PORT, LED_Green_PIN);
//PORT_Toggle(LED_Green_PORT, LED_Green_PIN);
}