The Firest Version

This commit is contained in:
Qiea
2024-11-01 22:38:48 +08:00
parent 8dc9a9f472
commit a19f47efca
416 changed files with 240428 additions and 0 deletions

412
MY/cnn.c Normal file
View File

@@ -0,0 +1,412 @@
#include "cnn.h"
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>*/
void PrintfArray(float *array, int array_num, int elements_per_line)
{
for (int i = 0; i < array_num; i++)
{
printf("%f ", array[i]); // <20><>ӡ<EFBFBD><D3A1>ǰԪ<C7B0><D4AA>
// ÿ<><C3BF>ӡ<EFBFBD><D3A1>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
if ((i + 1) % elements_per_line == 0)
{
printf("\n");
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ԫ<EFBFBD>ز<EFBFBD><D8B2><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
if (array_num % elements_per_line != 0)
{
printf("\n");
}
}
/*<2A><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>*/
void **allocate2DArray(int depth, int num, size_t elementSize)
{
void **array = (void **)mymalloc(SRAMEX, depth * sizeof(void *));
for (int d = 0; d < depth; d++)
{
array[d] = mymalloc(SRAMEX, num * elementSize); // ÿ<><C3BF>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>չƽͼ<C6BD><CDBC>
}
return array;
}
void free2DArray(float **array, int depth)
{
for (int d = 0; d < depth; d++)
{
myfree(SRAMEX, array[d]);
}
myfree(SRAMEX, array);
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>*/
void Full(float *inputArray, int input_size, float *outputArray)
{
int i, j;
for (i = 0; i < ((input_size + 2) * (input_size + 2)); i++)
{
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
outputArray[i] = 0;
}
for (i = 0; i < input_size; i++)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (j = 0; j < input_size; j++)
{
outputArray[(i + 1) * (input_size + 2) + (j + 1)] = inputArray[i * input_size + j];
}
}
}
void Pooling(float *inputArray, int input_size,
int kernel_size, unsigned int step,
float *outputArray)
{
int output_size = (input_size - kernel_size) / step + 1;
for (int i = 0; i < output_size; i++)
{
for (int j = 0; j < output_size; j++)
{
float max_value = 0;
for (int m = 0; m < kernel_size; m++)
{
for (int n = 0; n < kernel_size; n++)
{
int input_row = i * step + m;
int input_col = j * step + n;
int input_idx = input_row * input_size + input_col;
if (inputArray[input_idx] > max_value)
{
max_value = inputArray[input_idx];
}
}
}
int output_idx = i * output_size + j;
outputArray[output_idx] = max_value;
}
}
}
void Convolution(float *inputArray, int input_size,
float *kernel, int kernel_size,
float *outputArray)
{
int i, j, m, n;
int half_k = kernel_size / 2;
int output_size = input_size - 2 * half_k;
for (i = half_k; i < input_size - half_k; i++)
{
for (j = half_k; j < input_size - half_k; j++)
{
float sum = 0;
for (m = 0; m < kernel_size; m++)
{
for (n = 0; n < kernel_size; n++)
{
int input_row = i + m - half_k;
int input_col = j + n - half_k;
int input_idx = input_row * input_size + input_col;
int kernel_idx = m * kernel_size + n;
sum += inputArray[input_idx] * kernel[kernel_idx];
}
}
int output_idx = (i - half_k) * output_size + (j - half_k);
outputArray[output_idx] = sum;
}
}
}
void Combine(float **inputArray, int input_depth, int input_size, float *outputArray)
{
int i, j, k;
int input_idx;
for (i = 0; i < input_size; i++)
{
for (j = 0; j < input_size; j++)
{
float sum = 0;
input_idx = i * input_size + j;
for (k = 0; k < input_depth; k++)
{
sum += inputArray[k][input_idx];
}
outputArray[i * input_size + j] = sum;
}
}
}
void Flatten2D(float **inputArray, int input_depth, int input_size, float *outputArray)
{
int i, j, k;
for (k = 0; k < input_depth; k++)
{
for (i = 0; i < input_size; i++)
{
for (j = 0; j < input_size; j++)
{
int input_idx = i * input_size + j;
outputArray[k * input_size * input_size + input_idx] = inputArray[k][input_idx];
}
}
}
}
void AddBias(float *inputArray, int input_num, float bias, float *outputArray)
{
for (int i = 0; i < input_num; i++)
{
outputArray[i] = inputArray[i] + bias;
}
}
float ConnectedLayer(float *inputArray, int input_num,
float *input_w, float input_b)
{
int i;
float sum = 0;
for (i = 0; i < input_num; i++)
{
sum += inputArray[i] * input_w[i];
}
sum = sum + input_b;
return sum;
}
void ReLU1(float *inputArray, int num, float *outputArray)
{
for (int i = 0; i < num; i++) {
outputArray[i] = (inputArray[i] > 0) ? inputArray[i] : 0;
}
}
float ReLU2(float data)
{
if (data > 0) {
return data;
}
else {
return 0;
}
}
void generateMatrix(float *get_data, float Max_value, int totalPoints, float CNN_data[100][100])
{
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
CNN_data[i][j] = 0;
}
}
int pointsPerInterval = totalPoints / 100;
float amplitudeStep = Max_value / 100;
// long float amplitudeStep = Max_value / 100;
for (int i = 0; i < totalPoints; i++) {
float amplitudeValue = fabs(get_data[i]);//data[n][] = 0.000696*n ~ 0.000696*(n+1)
// long float amplitudeValue = fabs(get_data[i]);//data[n][] = 0.000696*n ~ 0.000696*(n+1)
if (amplitudeValue > Max_value) {
amplitudeValue = Max_value;
} else if (amplitudeValue < 0) {
amplitudeValue = 0;
}
int intervalIndex = i / pointsPerInterval;
if (intervalIndex >= 100) intervalIndex = 99;
int amplitudeIndex = (int)(amplitudeValue / amplitudeStep);
if (amplitudeIndex >= 100) amplitudeIndex = 99;
CNN_data[amplitudeIndex][intervalIndex]++;
}
}
int calculate_probabilities(float *input_array, float *output_array, int input_num)
{
float sum = 0.0;
float temp[input_num];
for (int i = 0; i < input_num; i++)
{
temp[i] = exp(input_array[i]);
sum = sum + temp[i];
}
for (int j = 0; j < input_num; j++)
{
output_array[j] = temp[j] / sum;
}
int max_index = 0;
float max_value = output_array[0];
for (int k = 1; k < input_num; k++)
{
if (output_array[k] > max_value)
{
max_value = output_array[k];
max_index = k;
}
}
return max_index + 1;
}
void cnn_run(){
printf("CNNģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
for(int i=0;i<10;i++)printf("data[%d]: %f\r\n",i,data.array[i]);
printf("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>һ<EFBFBD>\r\n");
//1
float* Full_output1 = (float*)mymalloc(SRAMEX, sizeof(float) * 102 * 102);
Full(data.array, 100, Full_output1);
float** Convolution_result1_before = (float**)allocate2DArray(32, 100 * 100, sizeof(float));
float** Convolution_result1_relu = (float**)allocate2DArray(32, 100 * 100, sizeof(float));
float** Convolution_result1 = (float**)allocate2DArray(32, 100 * 100, sizeof(float));
for (int i = 0; i < 32; i++) {
float conv1_weight_new[9] = {
conv1_weight.array[i*9+0],conv1_weight.array[i*9+1],
conv1_weight.array[i*9+2],conv1_weight.array[i*9+3],
conv1_weight.array[i*9+4],conv1_weight.array[i*9+5],
conv1_weight.array[i*9+6],conv1_weight.array[i*9+7],
conv1_weight.array[i*9+8] };
Convolution(Full_output1, 102, conv1_weight_new, 3, Convolution_result1_before[i]);
}
for (int i = 0; i < 32; i++) {
AddBias(Convolution_result1_before[i], 100 * 100, conv1_bias.array[i], Convolution_result1_relu[i]);
}
for (int i = 0; i < 32; i++) {
ReLU1(Convolution_result1_relu[i], 100 * 100, Convolution_result1[i]);
}
float ** Pooling_result1 = (float**)allocate2DArray(32, 50 * 50, sizeof(float));
for (int i = 0; i < 32; i++) {
Pooling(Convolution_result1[i], 100, 2, 2, Pooling_result1[i]);
}
printf("<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>\r\n");
//2
myfree(SRAMEX, Full_output1);
free2DArray(Convolution_result1_relu,32);
free2DArray(Convolution_result1_before,32);
free2DArray(Convolution_result1,32);
float** Full_output2 = (float**)allocate2DArray(32, 52 * 52, sizeof(float));
for (int i = 0; i < 32; i++) {
Full(Pooling_result1[i], 50, Full_output2[i]);
}
float** Convolution_result_temp_2 = (float**)allocate2DArray(32, 50 * 50, sizeof(float));
float** Convolution_result2_before = (float**)allocate2DArray(64, 50 * 50, sizeof(float));
float** Convolution_result2_relu = (float**)allocate2DArray(64, 50 * 50, sizeof(float));
float** Convolution_result2 = (float**)allocate2DArray(64, 50 * 50, sizeof(float));
for (int i = 0; i < 64; i++) {
for (int j = 0; j < 32; j++) {
float conv2_weight_new[9] = {
conv2_weight.array[i*32*9+9*j+0],conv2_weight.array[i*32*9+9*j+1],
conv2_weight.array[i*32*9+9*j+2],conv2_weight.array[i*32*9+9*j+3],
conv2_weight.array[i*32*9+9*j+4],conv2_weight.array[i*32*9+9*j+5],
conv2_weight.array[i*32*9+9*j+6],conv2_weight.array[i*32*9+9*j+7],
conv2_weight.array[i*32*9+9*j+8]
};
Convolution(Full_output2[j], 52, conv2_weight_new, 3, Convolution_result_temp_2[j]);
}
Combine(Convolution_result_temp_2, 32, 50, Convolution_result2_before[i]);
}
for (int i = 0; i < 64; i++) {
AddBias(Convolution_result2_before[i], 50 * 50, conv2_bias.array[i], Convolution_result2_relu[i]);
}
for (int i = 0; i < 64; i++) {
ReLU1(Convolution_result2_relu[i], 50 * 50, Convolution_result2[i]);
}
float** Pooling_result2 = (float**)allocate2DArray(64, 25 * 25, sizeof(float));
for (int i = 0; i < 64; i++) {
Pooling(Convolution_result2[i], 50, 2, 2, Pooling_result2[i]);
}
printf("<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>\r\n");
//3
myfree(SRAMEX, Full_output2);
free2DArray(Pooling_result1,32);
free2DArray(Convolution_result_temp_2,32);
free2DArray(Convolution_result2_relu,64);
free2DArray(Convolution_result2_before,64);
free2DArray(Convolution_result2,64);
float** Full_output3 = (float**)allocate2DArray(64, 27 * 27, sizeof(float));
for (int i = 0; i < 64; i++) {
Full(Pooling_result2[i], 25, Full_output3[i]);
}
float** Convolution_result_temp_3 = (float**)allocate2DArray(64, 25 * 25, sizeof(float));
float** Convolution_result3_before = (float**)allocate2DArray(128, 25 * 25, sizeof(float));
float** Convolution_result3_relu = (float**)allocate2DArray(128, 25 * 25, sizeof(float));
float** Convolution_result3 = (float**)allocate2DArray(128, 25 * 25, sizeof(float));
for (int i = 0; i < 128; i++) {
for (int j = 0; j < 64; j++) {
float conv3_weight_new[9] = {
conv3_weight.array[i*64*9+9*j+0],conv3_weight.array[i*64*9+9*j+1],
conv3_weight.array[i*64*9+9*j+2],conv3_weight.array[i*64*9+9*j+3],
conv3_weight.array[i*64*9+9*j+4],conv3_weight.array[i*64*9+9*j+5],
conv3_weight.array[i*64*9+9*j+6],conv3_weight.array[i*64*9+9*j+7],
conv3_weight.array[i*64*9+9*j+8]
};
Convolution(Full_output3[j], 27, conv3_weight_new, 3, Convolution_result_temp_3[j]);
}
Combine(Convolution_result_temp_3, 64, 25, Convolution_result3_before[i]);
}
for (int i = 0; i < 128; i++) {
AddBias(Convolution_result3_before[i], 25 * 25, conv3_bias.array[i], Convolution_result3_relu[i]);
}
for (int i = 0; i < 128; i++) {
ReLU1(Convolution_result3_relu[i], 25 * 25, Convolution_result3[i]);
}
float** Pooling_result3 = (float**)allocate2DArray(128, 12 * 12, sizeof(float));
for (int i = 0; i < 128; i++) {
Pooling(Convolution_result3_before[i], 25, 2, 2, Pooling_result3[i]);
}
float* xi = (float*)mymalloc(SRAMEX, sizeof(float) * 128 * 12 * 12);
Flatten2D(Pooling_result3, 128, 12, xi);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>\r\n");
//4
myfree(SRAMEX, Full_output3);
free2DArray(Pooling_result2,64);
free2DArray(Convolution_result_temp_3,64);
free2DArray(Convolution_result3_relu,128);
free2DArray(Convolution_result3_before,128);
free2DArray(Convolution_result3,128);
float yi[128] = {0};
for (int i = 0; i < 128; i++) {
float sum = 0;
float* fc1_weight_new = (float*)mymalloc(SRAMEX, sizeof(float) * 128 * 12 * 12);
memcpy(fc1_weight_new,&fc1_weight.array[i*128*12*12],128*12*12 * sizeof(float));
sum = ConnectedLayer(xi, 128 * 12 * 12, fc1_weight_new, fc1_bias.array[i]);
yi[i] = ReLU2(sum);
}
PrintfArray(yi,128,128);
//printf("\n");
printf("<EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>\r\n");
//5
free2DArray(Pooling_result3,128);
float zi[7] = { 0 };
for (int i = 0; i < 7; i++) {
float fc2_weight_new[128];
memcpy(fc2_weight_new,&fc2_weight.array[i*128],128 * sizeof(float));
zi[i] = ConnectedLayer(yi, 128, fc2_weight_new, fc2_bias.array[i]);
}
PrintfArray(zi,7,7);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>\r\n");
//end
float result[7];
int max_probability_idx = calculate_probabilities(zi,result,7);
PrintfArray(result,7,7);
printf("%f, Label %d", result[max_probability_idx - 1] * 100, max_probability_idx);
}

25
MY/cnn.h Normal file
View File

@@ -0,0 +1,25 @@
#ifndef _CNN_H_
#define _CNN_H_
#include <math.h>
#include "my.h"
void PrintfArray(float *array, int array_num, int elements_per_line);
void **allocate2DArray(int depth, int num, size_t elementSize);
void free2DArray(float **array, int depth);
void Full(float *inputArray, int input_size, float *outputArray);
void Pooling(float *inputArray, int input_size, int kernel_size, unsigned int step, float *outputArray);
void Convolution(float *inputArray, int input_size, float *kernel, int kernel_size, float *outputArray);
void Combine(float **inputArray, int input_depth, int input_size, float *outputArray);
void Flatten2D(float **inputArray, int input_depth, int input_size, float *outputArray);
float ConnectedLayer(float *inputArray, int input_num, float *input_w, float input_b);
void ReLU1(float *inputArray, int num, float *outputArray);
float ReLU2(float data);
void AddBias(float *inputArray, int input_num, float bias, float *outputArray);
int calculate_probabilities(float *input_array, float *output_array, int input_num);
void generateMatrix(float *get_data, float Max_value, int totalPoints, float CNN_data[100][100]);
void cnn_run(void);
#endif

95
MY/debug.c Normal file
View File

@@ -0,0 +1,95 @@
#ifndef _DEBUG_H_
#define _DEBUG_H_
#include "debug.h"
#include "led.h"
u8 _DEBUG = 1;
void DEBUG(){
_DEBUG = !_DEBUG;
printf("DEBUG IS: %s",(_DEBUG ? "ON" : "OFF"));
}
void DEBUG_PRINT(const char *fmt, ...) {
if(_DEBUG){
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
}
}
void SDRAM_USED(){
u8 RAM_ID = 0;
u16 memused = 0;
u8 paddr[20];
memused=my_mem_perused(RAM_ID);
sprintf((char*)paddr,"%d.%01d%%",memused/10,memused%10);
printf("[%d] %dʹ<64><CAB9><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>%s\r\n",memused,RAM_ID++,paddr);
memused=my_mem_perused(RAM_ID);
sprintf((char*)paddr,"%d.%01d%%",memused/10,memused%10);
printf("[%d] %dʹ<64><CAB9><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>%s\r\n",memused,RAM_ID++,paddr);
memused=my_mem_perused(RAM_ID);
sprintf((char*)paddr,"%d.%01d%%",memused/10,memused%10);
printf("[%d] %dʹ<64><CAB9><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>%s\r\n",memused,RAM_ID++,paddr);
}
TIM_HandleTypeDef TIM3_Handler; //<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//ͨ<>ö<EFBFBD>ʱ<EFBFBD><CAB1>3<EFBFBD>жϳ<D0B6>ʼ<EFBFBD><CABC>
//arr<72><72><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>װֵ<D7B0><D6B5>
//psc<73><63>ʱ<EFBFBD><CAB1>Ԥ<EFBFBD><D4A4>Ƶ<EFBFBD><C6B5>
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B7BD>:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=<3D><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,<2C><>λ:Mhz
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5>Ƕ<EFBFBD>ʱ<EFBFBD><CAB1>3!(<28><>ʱ<EFBFBD><CAB1>3<EFBFBD><33><EFBFBD><EFBFBD>APB1<42>ϣ<EFBFBD>ʱ<EFBFBD><CAB1>ΪHCLK/2)
void TIM3_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //ͨ<>ö<EFBFBD>ʱ<EFBFBD><CAB1>3
TIM3_Handler.Init.Prescaler=psc; //<2F><>Ƶϵ<C6B5><CFB5>
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //<2F><><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD><EFBFBD>
TIM3_Handler.Init.Period=arr; //<2F>Զ<EFBFBD>װ<EFBFBD><D7B0>ֵ
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//ʱ<>ӷ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
HAL_TIM_Base_Init(&TIM3_Handler);
HAL_TIM_Base_Start_IT(&TIM3_Handler); //ʹ<>ܶ<EFBFBD>ʱ<EFBFBD><CAB1>3<EFBFBD>Ͷ<EFBFBD>ʱ<EFBFBD><CAB1>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6>TIM_IT_UPDATE
}
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD>
//<2F>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>ᱻHAL_TIM_Base_Init()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //ʹ<><CAB9>TIM3ʱ<33><CAB1>
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ȼ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //<2F><><EFBFBD><EFBFBD>ITM3<4D>ж<EFBFBD>
}
}
//<2F><>ʱ<EFBFBD><CAB1>3<EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
//<2F>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))
{
LED1=!LED1; //LED1<44><31>ת
}
}
#endif

11
MY/debug.h Normal file
View File

@@ -0,0 +1,11 @@
#include <sys.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include "malloc.h"
void DEBUG(void);
void DEBUG_PRINT(const char *fmt, ...);
void SDRAM_USED(void);
void TIM3_Init(u16 arr,u16 psc);

401
MY/my.c Normal file
View File

@@ -0,0 +1,401 @@
#include "my.h"
Model conv1_bias;
Model conv1_weight;
Model conv2_bias;
Model conv2_weight;
Model conv3_bias;
Model conv3_weight;
Model fc1_bias;
Model fc1_weight;
Model fc2_bias;
Model fc2_weight;
Model data;
float* modelmym_init(char* model_name){
if(conv1_bias.array == NULL && strcmp(model_name, "conv1_bias") == 0)
return conv1_bias.array = (float*)mymalloc(SRAMEX, CONV1_BIAS_ARRSIZE * sizeof(float));
else if(conv1_weight.array == NULL && strcmp(model_name, "conv1_weight") == 0)
return conv1_weight.array = (float*)mymalloc(SRAMEX, CONV1_WEIGHT_ARRSIZE * sizeof(float));
else if(conv2_bias.array == NULL && strcmp(model_name, "conv2_bias") == 0)
return conv2_bias.array = (float*)mymalloc(SRAMEX, CONV2_BIAS_ARRSIZE * sizeof(float));
else if(conv2_weight.array == NULL && strcmp(model_name, "conv2_weight") == 0)
return conv2_weight.array = (float*)mymalloc(SRAMEX, CONV2_WEIGHT_ARRSIZE * sizeof(float));
else if(conv3_bias.array == NULL && strcmp(model_name, "conv3_bias") == 0)
return conv3_bias.array = (float*)mymalloc(SRAMEX, CONV3_BIAS_ARRSIZE * sizeof(float));
else if(conv3_weight.array == NULL && strcmp(model_name, "conv3_weight") == 0)
return conv3_weight.array = (float*)mymalloc(SRAMEX, CONV3_WEIGHT_ARRSIZE * sizeof(float));
else if(fc1_bias.array == NULL && strcmp(model_name, "fc1_bias") == 0)
return fc1_bias.array = (float*)mymalloc(SRAMEX, FC1_BIAS_ARRSIZE * sizeof(float));
else if(fc1_weight.array == NULL && strcmp(model_name, "fc1_weight") == 0)
return fc1_weight.array = (float*)mymalloc(SRAMEX, FC1_WEIGHT_ARRSIZE * sizeof(float));
else if(fc2_bias.array == NULL && strcmp(model_name, "fc2_bias") == 0)
return fc2_bias.array = (float*)mymalloc(SRAMEX, FC2_BIAS_ARRSIZE * sizeof(float));
else if(fc2_weight.array == NULL && strcmp(model_name, "fc2_weight") == 0)
return fc2_weight.array = (float*)mymalloc(SRAMEX, FC2_WEIGHT_ARRSIZE * sizeof(float));
else if(data.array == NULL && strcmp(model_name, "data") == 0)
return data.array = (float*)mymalloc(SRAMEX, DATA_ARRSIZE * sizeof(float));
else if(strcmp(model_name, "all") == 0){
if(conv1_bias.array == NULL)conv1_bias.array = (float*)mymalloc(SRAMEX, CONV1_BIAS_ARRSIZE * sizeof(float));
if(conv1_weight.array == NULL)conv1_weight.array = (float*)mymalloc(SRAMEX, CONV1_WEIGHT_ARRSIZE * sizeof(float));
if(conv2_bias.array == NULL)conv2_bias.array = (float*)mymalloc(SRAMEX, CONV2_BIAS_ARRSIZE * sizeof(float));
if(conv2_weight.array == NULL)conv2_weight.array = (float*)mymalloc(SRAMEX, CONV2_WEIGHT_ARRSIZE * sizeof(float));
if(conv3_bias.array == NULL)conv3_bias.array = (float*)mymalloc(SRAMEX, CONV3_BIAS_ARRSIZE * sizeof(float));
if(conv3_weight.array == NULL)conv3_weight.array = (float*)mymalloc(SRAMEX, CONV3_WEIGHT_ARRSIZE * sizeof(float));
if(fc1_bias.array == NULL)fc1_bias.array = (float*)mymalloc(SRAMEX, FC1_BIAS_ARRSIZE * sizeof(float));
if(fc1_weight.array == NULL)fc1_weight.array = (float*)mymalloc(SRAMEX, FC1_WEIGHT_ARRSIZE * sizeof(float));
if(fc2_bias.array == NULL)fc2_bias.array = (float*)mymalloc(SRAMEX, FC2_BIAS_ARRSIZE * sizeof(float));
if(fc2_weight.array == NULL)fc2_weight.array = (float*)mymalloc(SRAMEX, FC2_WEIGHT_ARRSIZE * sizeof(float));
if(data.array == NULL)data.array = (float*)mymalloc(SRAMEX, DATA_ARRSIZE * sizeof(float));
}
return NULL;
}
u8 modelmym_free(char* model_name){
if(conv1_bias.array != NULL && strcmp(model_name, "conv1_bias") == 0){
myfree(SRAMEX,conv1_bias.array);
conv1_bias.array = NULL;
conv1_bias.realength = NULL;
return 1;
}
else if(conv1_weight.array != NULL && strcmp(model_name, "conv1_weight") == 0){
myfree(SRAMEX,conv1_weight.array);
conv1_weight.array = NULL;
conv1_weight.realength = NULL;
return 1;
}
else if(conv2_bias.array != NULL && strcmp(model_name, "conv2_bias") == 0){
myfree(SRAMEX,conv2_bias.array);
conv2_bias.array = NULL;
conv2_bias.realength = NULL;
return 1;
}
else if(conv2_weight.array != NULL && strcmp(model_name, "conv2_weight") == 0){
myfree(SRAMEX,conv2_weight.array);
conv2_weight.array = NULL;
conv2_weight.realength = NULL;
return 1;
}
else if(conv3_bias.array != NULL && strcmp(model_name, "conv3_bias") == 0){
myfree(SRAMEX,conv3_bias.array);
conv3_bias.array = NULL;
conv3_bias.realength = NULL;
return 1;
}
else if(conv3_weight.array != NULL && strcmp(model_name, "conv3_weight") == 0){
myfree(SRAMEX,conv3_weight.array);
conv3_weight.array = NULL;
conv3_weight.realength = NULL;
return 1;
}
else if(fc1_bias.array != NULL && strcmp(model_name, "fc1_bias") == 0){
myfree(SRAMEX,fc1_bias.array);
fc1_bias.array = NULL;
fc1_bias.realength = NULL;
return 1;
}
else if(fc1_weight.array != NULL && strcmp(model_name, "fc1_weight") == 0){
myfree(SRAMEX,fc1_weight.array);
fc1_weight.array = NULL;
fc1_weight.realength = NULL;
return 1;
}
else if(fc2_bias.array != NULL && strcmp(model_name, "fc2_bias") == 0){
myfree(SRAMEX,fc2_bias.array);
fc2_bias.array = NULL;
fc2_bias.realength = NULL;
return 1;
}
else if(fc2_weight.array != NULL && strcmp(model_name, "fc2_weight") == 0){
myfree(SRAMEX,fc2_weight.array);
fc2_weight.array = NULL;
fc2_weight.realength = NULL;
return 1;
}
else if(data.array != NULL && strcmp(model_name, "fc2_weight") == 0){
myfree(SRAMEX,data.array);
data.array = NULL;
data.realength = NULL;
return 1;
}
else if(strcmp(model_name, "all") == 0){
modelmym_free("conv1_bias");
modelmym_free("conv1_weight");
modelmym_free("conv2_bias");
modelmym_free("conv2_weight");
modelmym_free("conv3_bias");
modelmym_free("conv3_weight");
modelmym_free("fc1_bias");
modelmym_free("fc1_weight");
modelmym_free("fc2_bias");
modelmym_free("fc2_weight");
modelmym_free("data");
return 2;
}
return NULL;
}
u8 model_write(char* model_name)
{
if(strcmp(model_name, "all") == 0){
model_write("conv1_bias");
model_write("conv1_weight");
model_write("conv2_bias");
model_write("conv2_weight");
model_write("conv3_bias");
model_write("conv3_weight");
model_write("fc1_bias");
model_write("fc1_weight");
model_write("fc2_bias");
model_write("fc2_weight");
model_write("data");
model_info("all");
SDRAM_USED();
}else {
u8 res=0;
u32 _larr = 0;
char _tmp[11] = "";
char _path[20] = {0};
int progress;
Model *_model = model(model_name);
if(_model == NULL){
if(f_open(file,(const TCHAR*) sprintf(_path, "0:/%s.txt",model_name),1)){
DEBUG_PRINT("\r\n<EFBFBD>ļ<EFBFBD>[%s]<5D><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>\r\n",_path);
return 200;
}
_model = model("data");
_model -> name = model_name;
}
if(_model -> array == NULL)modelmym_init(model_name);
sprintf(_path, "0:/%s.txt",_model -> name);
if(f_open(file,(const TCHAR*)_path,1)){
DEBUG_PRINT("\r\n<EFBFBD>ļ<EFBFBD>[%s]<5D><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>\r\n",_path);
return 200;
}
DEBUG_PRINT("\r\n<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>%s\r\n",_path);
if(_model -> array == NULL){
DEBUG_PRINT("\r\n<EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD>ȡģ<EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD>[%s]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",_model -> name);
return 201;
}
DEBUG_PRINT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>%s\r\n",_model -> name);
printf("\r\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>%s<><73><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD>......\r\n",_model -> name);
while(_larr < _model -> maxlength){
res=f_read(file,fatbuf,11,&br);
if(res){
DEBUG_PRINT("<EFBFBD><EFBFBD>ȡ[%s]<5D>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>:%d\r\n",_path,res);
return 202;
}
else{
for(u32 i=0;i<br;i++){
if(fatbuf[i]==0x0d){
float value = atof(_tmp);
memset(_tmp, 0, sizeof(_tmp));
_model -> array[_larr++] = value;
//DEBUG_PRINT("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[string]: %s\r\n",i,_tmp);
//DEBUG_PRINT("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[float]: %f\r\n",i+1,value);
}else{
char buffer[2];
sprintf(buffer, "%c", fatbuf[i]);
strcat(_tmp, buffer);
//DEBUG_PRINT("[%d]: %c\r\n",i,fatbuf[i]);
}
}
if(_model -> maxlength >= 73728 && (_larr % (_model -> maxlength/10) == 0 || _larr >= _model -> maxlength || _larr == 1)) {
progress = _larr >= _model -> maxlength ? 100 : _larr == 1 ? 0 : progress + 10;
DEBUG_PRINT("\r\n[");
for(u16 j=0; j<50;j++){
if(j < progress/2) printf("=");
else DEBUG_PRINT(" ");
}
printf("] %d%%", progress);
}
}
}
_model -> realength = _larr; //_larr<72><72><EFBFBD><EFBFBD>ֵΪģ<CEAA><C4A3><EFBFBD><EFBFBD><EFBFBD>󳤶<EFBFBD>
DEBUG_PRINT("\r\n[%s]<5D><>ģ<EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>! ģ<>ͳ<EFBFBD><CDB3><EFBFBD>Ϊ %d\r\n",_model -> name,_model -> realength);
return res;
}
return NULL;
}
void model_read(char* model_name, u32 gap){
if(strcmp(model_name, "all") == 0){
model_read("conv1_bias", gap);
model_read("conv1_weight", gap);
model_read("conv2_bias", gap);
model_read("conv2_weight", gap);
model_read("conv3_bias", gap);
model_read("conv3_weight", gap);
model_read("fc1_bias", gap);
model_read("fc1_weight", gap);
model_read("fc2_bias", gap);
model_read("fc2_weight", gap);
model_read("data", gap);
}else {
Model *_model = model(model_name);
for (int i=0;i<((_model -> realength/gap)+(_model -> realength%gap ? 2 : 1));i++)
printf("\r\n%s_floatArray[%d]: %f",_model -> name,i*gap<_model -> realength ? i*gap : _model -> realength-1,i*gap<_model -> realength ? _model -> array[i*gap] : _model -> array[_model -> realength-1]);
printf("\r\n");
}
}
u8 switch_data(char* data_name){
char _path[20] = {0};
if(f_open(file,(const TCHAR*) sprintf(_path, "0:/%s.txt",data_name),1)){
DEBUG_PRINT("\r\n<EFBFBD>ļ<EFBFBD>[%s]<5D><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>\r\n",_path);
return 200;
}
DEBUG_PRINT("\r\n<EFBFBD>µ<EFBFBD>data<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>%s\r\n",_path);
model_write(data_name);
printf("<EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD> %s.txt",data_name);
return 1;
}
u8 sd_read(u32 length, char* model_name, u32 gap)
{
u8 res=0;
u32 _larr = 0;
char _tmp[11] = "";
char _path[20] = {0};
float* floatArray = NULL;
Model *_model = model(model_name);
if(length >= _model -> maxlength)length = _model -> maxlength -1;
if((floatArray = modelmym_init(model_name)) == NULL){
DEBUG_PRINT("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
return 7;
}
sprintf(_path, "0:/%s.txt",model_name);
f_open(file,(const TCHAR*)_path,1);//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
while(_larr <= length){
res=f_read(file,fatbuf,11,&br);
if(res)DEBUG_PRINT("\r\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d\r\n",res);
else{
for(u32 i=0;i<br;i++){
if(fatbuf[i]==0x0d){
float value = atof(_tmp);
memset(_tmp, 0, sizeof(_tmp));
floatArray[_larr++] = value;
DEBUG_PRINT("<EFBFBD>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[string]: %s\r\n",i,_tmp);
DEBUG_PRINT("<EFBFBD>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[float]: %f\r\n",i+1,value);
}else{
char buffer[2];
sprintf(buffer, "%c", fatbuf[i]);
strcat(_tmp, buffer);
DEBUG_PRINT("[%d]: %c\r\n",i,fatbuf[i]);
}
}
}
}
for (int i=0;i<((length/gap)+(length%gap ? 2 : 1));i++)
printf("\r\nfloatArray[%d]: %f",i*gap<=length ? i*gap : length,i*gap<=length ? floatArray[i*gap] : floatArray[length]);
printf("\r\n");
return res;
}
void* model(char* model_name){
if(strcmp(model_name, "conv1_bias") == 0)return &conv1_bias;
else if(strcmp(model_name, "conv1_weight") == 0)return &conv1_weight;
else if(strcmp(model_name, "conv2_bias") == 0)return &conv2_bias;
else if(strcmp(model_name, "conv2_weight") == 0)return &conv2_weight;
else if(strcmp(model_name, "conv3_bias") == 0)return &conv3_bias;
else if(strcmp(model_name, "conv3_weight") == 0)return &conv3_weight;
else if(strcmp(model_name, "fc1_bias") == 0)return &fc1_bias;
else if(strcmp(model_name, "fc1_weight") == 0)return &fc1_weight;
else if(strcmp(model_name, "fc2_bias") == 0)return &fc2_bias;
else if(strcmp(model_name, "fc2_weight") == 0)return &fc2_weight;
else if(strcmp(model_name, "data") == 0)return &data;
return NULL;
}
void model_info(char* model_name){
if(strcmp(model_name, "all") == 0){
model_info("conv1_bias");
model_info("conv1_weight");
model_info("conv2_bias");
model_info("conv2_weight");
model_info("conv3_bias");
model_info("conv3_weight");
model_info("fc1_bias");
model_info("fc1_weight");
model_info("fc2_bias");
model_info("fc2_weight");
model_info("data");
}else {
Model *_model = model(model_name);
printf("\r\nmodel.name is: %s\r\n",_model -> name);
printf("model.array.address is: 0X%X\r\n",_model -> array);
printf("model.maxlength is: %d\r\n",_model -> maxlength);
printf("model.realength is: %d\r\n",_model -> realength);
}
}
void model_init(){
conv1_bias.name = "conv1_bias";
conv1_bias.array = modelmym_init(conv1_bias.name);
conv1_bias.maxlength = CONV1_BIAS_ARRSIZE;
conv1_weight.name = "conv1_weight";
conv1_weight.array = modelmym_init(conv1_weight.name);
conv1_weight.maxlength = CONV1_WEIGHT_ARRSIZE;
conv2_bias.name = "conv2_bias";
conv2_bias.array = modelmym_init(conv2_bias.name);
conv2_bias.maxlength = CONV2_BIAS_ARRSIZE;
conv2_weight.name = "conv2_weight";
conv2_weight.array = modelmym_init(conv2_weight.name);
conv2_weight.maxlength = CONV2_WEIGHT_ARRSIZE;
conv3_bias.name = "conv3_bias";
conv3_bias.array = modelmym_init(conv3_bias.name);
conv3_bias.maxlength = CONV3_BIAS_ARRSIZE;
conv3_weight.name = "conv3_weight";
conv3_weight.array = modelmym_init(conv3_weight.name);
conv3_weight.maxlength = CONV3_WEIGHT_ARRSIZE;
fc1_bias.name = "fc1_bias";
fc1_bias.array = modelmym_init(fc1_bias.name);
fc1_bias.maxlength = FC1_BIAS_ARRSIZE;
fc1_weight.name = "fc1_weight";
fc1_weight.array = modelmym_init(fc1_weight.name);
fc1_weight.maxlength = FC1_WEIGHT_ARRSIZE;
fc2_bias.name = "fc2_bias";
fc2_bias.array = modelmym_init(fc2_bias.name);
fc2_bias.maxlength = FC2_BIAS_ARRSIZE;
fc2_weight.name = "fc2_weight";
fc2_weight.array = modelmym_init(fc2_weight.name);
fc2_weight.maxlength = FC2_WEIGHT_ARRSIZE;
data.name = "data";
data.array = modelmym_init(data.name);
data.maxlength = DATA_ARRSIZE;
}

189
MY/my.h Normal file
View File

@@ -0,0 +1,189 @@
#ifndef _MY_H_
#define _MY_H_
#include "fattester.h"
#include "sdio_sdcard.h"
#include "usmart.h"
#include "usart.h"
#include "exfuns.h"
#include "malloc.h"
#include "ff.h"
#include "debug.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char* name;
float* array;
u32 maxlength;
u32 realength;
} Model;
#define CONV1_BIAS_ARRSIZE 32
#define CONV1_WEIGHT_ARRSIZE 32*1*3*3 //288
#define CONV2_BIAS_ARRSIZE 64
#define CONV2_WEIGHT_ARRSIZE 64*32*3*3 //18432
#define CONV3_BIAS_ARRSIZE 128
#define CONV3_WEIGHT_ARRSIZE 128*64*3*3 //73728
#define FC1_BIAS_ARRSIZE 128
#define FC1_WEIGHT_ARRSIZE 128*18432 //2359296
#define FC2_BIAS_ARRSIZE 7
#define FC2_WEIGHT_ARRSIZE 7*128 //896
#define DATA_ARRSIZE 100*100 //10000
extern Model conv1_bias;
extern Model conv1_weight;
extern Model conv2_bias;
extern Model conv2_weight;
extern Model conv3_bias;
extern Model conv3_weight;
extern Model fc1_bias;
extern Model fc1_weight;
extern Model fc2_bias;
extern Model fc2_weight;
extern Model data;
float* modelmym_init(char* model_name);
u8 modelmym_free(char* model_name);
u8 model_write(char* model_name);
void model_read(char* model_name, u32 gap);
u8 switch_data(char* data_name);
u8 sd_read(u32 length, char* model_name,u32 gap);
void* model(char* model_name);
void model_info(char* model_name);
void model_init(void);
//conv1_bias[a*1] a:0~31
//conv1_weight[a*9+b*9+c*3+d*1] a:0~31 b:0 c:0~2 d:0~2
//conv2_bias[a*1] a:0~63
//conv2_weight[a*288+b*9+c*3+d*1] a:0~63 b:0~31 c:0~2 d:0~2
//conv3_bias[a*1] a:0~127
//conv3_weight[a*576+b*9+c*3+d*1] a:0~127 b:0~63 c:0~2 d:0~2
//fc1_bias[a*1] a:0~127
//fc1_weight[a*18432+b*1] a:0~127 b:0~18431
//fc2_bias[a*1] a:0~6
//fc2_weight[a*128+b*1] a:0~6 b:0~127
/*--------------------------------
for(u8 a; a<?; a++)
--------------------------------*/
//u8 sd_read(u16 length)
//{
// u8 res=0;
// char _tmp[11] = "";
// float floatArray[32] = {0};
// int _larr = 0;
// printf("\r\nRead file data is:\r\n");
// res=f_read(file,fatbuf,length,&br);
// if(res) //<2F><><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD>
// {
// printf("\r\n<><6E><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD>:%d\r\n",res);
// }else
// {
// for(int i=0;i<length;i++){
// if(fatbuf[i]==0x0d){
// DEBUG_PRINT("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[string]: %s\r\n",i,_tmp);
// i++;
// float value = atof(_tmp);
// memset(_tmp, 0, sizeof(_tmp));
// floatArray[_larr++] = value;
// DEBUG_PRINT("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[float]: %f\r\n",i,value);
// }else{
// char buffer[2];
// sprintf(buffer, "%c", fatbuf[i]);
// strcat(_tmp, buffer);
// DEBUG_PRINT("[%d]: %c\r\n",i,fatbuf[i]);
// }
// }
// }
// for (int i=0;i<_larr;i++){
// DEBUG_PRINT("floatArray[%d]: %f\r\n",i,floatArray[i]);
// }
// return res;
//}
//u8 sd_read(u16 length, char* model)
//{
// float* floatArray = NULL;
// if((floatArray = model_init(model)) == NULL)printf("<22><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
// u8 res=0;
// char _tmp[11] = "";
// u32 _larr = 0;
// length = length*11;
// printf("\r\nRead file data is:\r\n");
// for(int i=0;i<length/512;i++){
// res=f_read(file,fatbuf,512,&br);
// if(res)printf("\r\n<><6E><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD>:%d\r\n",res);
// else{
// for(int i=0;i<br;i++){
// if(fatbuf[i]==0x0d){
// DEBUG_PRINT("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[string]: %s\r\n",i,_tmp);
// i++;
// float value = atof(_tmp);
// memset(_tmp, 0, sizeof(_tmp));
// floatArray[_larr++] = value;
// DEBUG_PRINT("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[float]: %f\r\n",i,value);
// }else{
// char buffer[2];
// sprintf(buffer, "%c", fatbuf[i]);
// strcat(_tmp, buffer);
// DEBUG_PRINT("[%d]: %c\r\n",i,fatbuf[i]);
// }
// }
// }
// }
// if(length%512){
// res=f_read(file,fatbuf,length%512,&br);
// if(res)printf("\r\nRead Error:%d\r\n",res);
// else{
// for(int i=0;i<br;i++){
// if(fatbuf[i]==0x0d){
// DEBUG_PRINT("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[string]: %s\r\n",i,_tmp);
// i++;
// float value = atof(_tmp);
// memset(_tmp, 0, sizeof(_tmp));
// floatArray[_larr++] = value;
// DEBUG_PRINT("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[float]: %f\r\n",i,value);
// }else{
// char buffer[2];
// sprintf(buffer, "%c", fatbuf[i]);
// strcat(_tmp, buffer);
// DEBUG_PRINT("[%d]: %c\r\n",i,fatbuf[i]);
// }
// }
// }
// }
// for (int i=0;i<_larr/10;i++){
// printf("floatArray[%d]: %f\r\n",i*10,floatArray[i*10]);
// }
// return res;
//}
#endif