/**************************************************************************
**
** FILE Name : Flash_append
**
** Description :
**
** Date : 2025年3月2日
**
** Author : XxX
**
** Note :
**************************************************************************/
#include "Flash_append.h"
/********************************************************************************
* @Function 擦除所有 flash 页 ,读取 flash 初始化
* @param
* @return
* @note
* @Author
********************************************************************************/
void Flash_erase_all_page(void)
{
for(int i=0; i<32;i++) flash_erase_page(0,i);
}
void Read_init(void)
{
Parameter_read();
draw_read();
Read_servo_pid();
Camera_read();
}
/**********************************************************************
* @Function GPS数据的保存和读取 , Item科目选择
* @param
* @return
* @note
* @Author
**********************************************************************/
uint32 GPS_start_xy_buff[2 * 3]; //存储 三组数据 起点UTM值 缓冲区
uint32 Mark_Number_buff[1 * 3]; //存储 三组数据 采点个数 缓冲区
uint32 point_mark_buff_x[50 * 3]; //存储 三组数据 坐标点 缓冲区
uint32 point_mark_buff_y[50 * 3]; //存储 三组数据 坐标点 缓冲区
uint32 point_mark_state_buff[50 * 3]; //存储 三组数据 点位状态 缓冲区
void GPS_save(void)
{
GPS_start_xy_buff[0 + 2 * Item_mode] = (uint32)(int32)(GPS_start_y*1000);
GPS_start_xy_buff[1 + 2 * Item_mode] = (uint32)(int32)(GPS_start_x*1000);
mark_point_count = sets;
Mark_Number_buff[1 * Item_mode] = mark_point_count;
for ( int i = 0; i < 50; i++)
{
point_mark_buff_x[i + 50 * Item_mode] = (uint32)(int32)(point_mark[i].x*1000); //将采集到的GPS数据放大1000000倍(成为整型)放入buff缓存区
point_mark_buff_y[i + 50 * Item_mode] = (uint32)(int32)(point_mark[i].y*1000); //将采集到的GPS数据放大1000000倍(成为整型)放入buff缓存区
point_mark_state_buff[i + 50 * Item_mode] = (uint32)(int32)point_mark_state[i]; //存储点的状态
}
if(flash_check(0,Start_Point)||flash_check(0,Mark_Number)||flash_check(0,GPS_Y_SEC)||flash_check(0,GPS_X_SEC)||flash_check(0,GPS_State))
{
flash_erase_page(0,Start_Point);
flash_erase_page(0,Mark_Number);
flash_erase_page(0,GPS_X_SEC);
flash_erase_page(0,GPS_Y_SEC);
flash_erase_page(0,GPS_State);
}
flash_write_page(0, Start_Point, GPS_start_xy_buff, 2 * 3);
system_delay_ms(5);
flash_write_page(0, Mark_Number, Mark_Number_buff, 1 * 3);
system_delay_ms(5);
flash_write_page(0, GPS_X_SEC, point_mark_buff_x, 50 * 3);
system_delay_ms(5);
flash_write_page(0, GPS_Y_SEC, point_mark_buff_y, 50 * 3);
system_delay_ms(5);
flash_write_page(0, GPS_State, point_mark_state_buff, 50 * 3);
system_delay_ms(5);
LCD_ShowString(0,64 , " OK", RGB565_RED, RGB565_BLACK, IPS200_8X16_FONT, 1, IPS200_DEFAULT_CHAR_GAP);
}
void GPS_read(void)
{
flash_read_page(0, Start_Point, GPS_start_xy_buff, 2 * 3);//读取起点
system_delay_ms(5);
flash_read_page(0, Mark_Number, Mark_Number_buff, 1 * 3);//读取踩点个数
system_delay_ms(5);
flash_read_page(0, GPS_X_SEC, point_mark_buff_x, 50 * 3);//读取经度
system_delay_ms(5);
flash_read_page(0, GPS_Y_SEC, point_mark_buff_y, 50 * 3);//读取纬度
system_delay_ms(5);
flash_read_page(0, GPS_State, point_mark_state_buff, 50 * 3);//读取点位状态
system_delay_ms(5);
GPS_start_y=(double)(int32)GPS_start_xy_buff[0 + 2 * Item_mode]/1000.0;//起点
GPS_start_x=(double)(int32)GPS_start_xy_buff[1 + 2 * Item_mode]/1000.0;
mark_point_count = Mark_Number_buff[1 * Item_mode];
for(int i = 0; i < 50; i++)
{
point_mark[i].y = ((double)(int32)point_mark_buff_y[i + 50 * Item_mode])/1000.0;//gps点位
point_mark[i].x = ((double)(int32)point_mark_buff_x[i + 50 * Item_mode])/1000.0;
point_mark_state[i] = (point_state_enum)point_mark_state_buff[i + 50 * Item_mode]; //存储点的状态
}
}
/********************************************************************************
* @Function 预设速度存储读取
* @param
* @return
* @note
* @Author
********************************************************************************/
uint32 Preset_Speed_buff[9 * 3]; //各种情况的目标速度,存入flash
void speed_save(void)
{
if(flash_check(0,Preset_Speed))
{
flash_erase_page(0,Preset_Speed);
}
system_delay_ms(5);
Preset_Speed_buff[0 + 9 * Item_mode] = (uint32)(int32)(speed.obstacle_speed[0]*100);
Preset_Speed_buff[1 + 9 * Item_mode] = (uint32)(int32)(speed.obstacle_speed[1]*100);
Preset_Speed_buff[2 + 9 * Item_mode] = (uint32)(int32)(speed.obstacle_speed[2]*100);
Preset_Speed_buff[3 + 9 * Item_mode] = (uint32)(int32)(speed.obstacle_speed[3]*100);
Preset_Speed_buff[4 + 9 * Item_mode] = (uint32)(int32)(speed.obstacle_speed[4]*100);
Preset_Speed_buff[5 + 9 * Item_mode] = (uint32)(int32)(speed.obstacle_speed[5]*100);
Preset_Speed_buff[6 + 9 * Item_mode] = (uint32)(int32)(speed.obstacle_speed[6]*100);
Preset_Speed_buff[7 + 9 * Item_mode] = (uint32)(int32)(speed.obstacle_speed[7]*100);
Preset_Speed_buff[8 + 9 * Item_mode] = (uint32)(int32)(speed.obstacle_speed[8]*100);
flash_write_page(0 , Preset_Speed , Preset_Speed_buff , 9 * 3);
}
void speed_read(void)
{
flash_read_page(0 , Preset_Speed , Preset_Speed_buff , 9 * 3);
system_delay_ms(5);
speed.obstacle_speed[0] = ((float)(int32)Preset_Speed_buff[0 + 9 * Item_mode] )/100.0f;
speed.obstacle_speed[1] = ((float)(int32)Preset_Speed_buff[1 + 9 * Item_mode] )/100.0f;
speed.obstacle_speed[2] = ((float)(int32)Preset_Speed_buff[2 + 9 * Item_mode] )/100.0f;
speed.obstacle_speed[3] = ((float)(int32)Preset_Speed_buff[3 + 9 * Item_mode] )/100.0f;
speed.obstacle_speed[4] = ((float)(int32)Preset_Speed_buff[4 + 9 * Item_mode] )/100.0f;
speed.obstacle_speed[5] = ((float)(int32)Preset_Speed_buff[5 + 9 * Item_mode] )/100.0f;
speed.obstacle_speed[6] = ((float)(int32)Preset_Speed_buff[6 + 9 * Item_mode] )/100.0f;
speed.obstacle_speed[7] = ((float)(int32)Preset_Speed_buff[7 + 9 * Item_mode] )/100.0f;
speed.obstacle_speed[8] = ((float)(int32)Preset_Speed_buff[8 + 9 * Item_mode] )/100.0f;
}
/********************************************************************************
* @Function 控制参数的保存和读取
* @param
* @return
* @note
* @Author
********************************************************************************/
uint32 Controller_buff[9 * 3];
void control_save(void)
{
if(flash_check(0,Control_Parameter))
{
flash_erase_page(0,Control_Parameter);
}
system_delay_ms(5);
Controller_buff[0 + 9 * Item_mode] = (uint32)(int32)( control.stanley_k[0] * 100 );
Controller_buff[1 + 9 * Item_mode] = (uint32)(int32)( control.stanley_k[1] * 100 );
Controller_buff[2 + 9 * Item_mode] = (uint32)(int32)( control.stanley_ki * 100);
Controller_buff[3 + 9 * Item_mode] = (uint32)(int32)( control.stanley_i_outmax * 100);
Controller_buff[4 + 9 * Item_mode] = (uint32)(int32)( control.curvature_border * 100);
Controller_buff[5 + 9 * Item_mode] = (uint32)(int32)( control.curvature_k * 100);
Controller_buff[6 + 9 * Item_mode] = (uint32)(int32)( control.stanley_L * 100);
Controller_buff[7 + 9 * Item_mode] = (uint32)(int32)( control.stanley_L_kv * 100);
Controller_buff[8 + 9 * Item_mode] = (uint32)(int32)( control.stanley_L_kc * 100);
flash_write_page(0 , Control_Parameter , Controller_buff , 9 * 3);
}
void control_read(void)
{
flash_read_page( 0 , Control_Parameter , Controller_buff , 9 * 3);
system_delay_ms(5);
control.stanley_k[0] = ((float)(int32)Controller_buff[0 + 9 * Item_mode]) / 100.0f;
control.stanley_k[1] = ((float)(int32)Controller_buff[1 + 9 * Item_mode]) / 100.0f;
control.stanley_ki = ((float)(int32)Controller_buff[2 + 9 * Item_mode]) / 100.0f;
control.stanley_i_outmax = ((float)(int32)Controller_buff[3 + 9 * Item_mode]) / 100.0f;
control.curvature_border = ((float)(int32)Controller_buff[4 + 9 * Item_mode]) / 100.0f;
control.curvature_k = ((float)(int32)Controller_buff[5 + 9 * Item_mode]) / 100.0f;
control.stanley_L = ((float)(int32)Controller_buff[6 + 9 * Item_mode]) / 100.0f;
control.stanley_L_kv = ((float)(int32)Controller_buff[7 + 9 * Item_mode]) / 100.0f;
control.stanley_L_kc = ((float)(int32)Controller_buff[8 + 9 * Item_mode]) / 100.0f;
}
/********************************************************************************
* @Function 特殊标志位保存和读取
* @param
* @return
* @note
* @Author
********************************************************************************/
void Parameter_save(void)
{
if(flash_check(0,MEM_SEC_SET))
{
flash_erase_page(0,MEM_SEC_SET);
}
system_delay_ms(5);
flash_write_page(0,MEM_SEC_SET,Set_parameter,9);
LCD_ShowString(0,64 , " OK", RGB565_yinguanglv, RGB565_BLACK, IPS200_8X16_FONT, 1, IPS200_DEFAULT_CHAR_GAP);
}
void Parameter_read(void)
{
flash_read_page(0,MEM_SEC_SET,Set_parameter,9);
gps_angle_trust = ((float)Set_parameter[7])/100.0f;
gps_dis_trust = ((float)Set_parameter[8])/100.0f;
}
/********************************************************************************
* @Function 路径规划保存与读取
* @param
* @return
* @note
* @Author
********************************************************************************/
uint32 R_buff[3];
void draw_save(void)
{
if(flash_check(0,MEM_draw_R))
{
flash_erase_page(0,MEM_draw_R);
}
system_delay_ms(5);
R_buff[0] = (uint32)(int32)(draw_R*100);
R_buff[1] = (uint32)(int32)(draw_rk1*100);
R_buff[2] = (uint32)(int32)(draw_rk2*100);
flash_write_page(0 , MEM_draw_R , R_buff, 3);
LCD_ShowString(150, 128, "save", RGB565_yinguanglv, RGB565_BLACK, IPS200_8X16_FONT, 1,IPS200_DEFAULT_CHAR_GAP);
}
void draw_read(void)
{
flash_read_page(0 , MEM_draw_R , R_buff, 3);
draw_R = ((float)(int32)R_buff[0])/100.f;
draw_rk1 = ((float)(int32)R_buff[1])/100.f;
draw_rk2 = ((float)(int32)R_buff[2])/100.f;
}
/********************************************************************************
* @Function 模糊的PID
* @param
* @return
* @note
* @Author
********************************************************************************/
void fuzzy_pid_save(void)
{
if(flash_check(0,MEM_SEC_FUZZY_PID))
{
flash_erase_page(0,MEM_SEC_FUZZY_PID);
}
system_delay_ms(5);
fuzzy_parameter[0]=(uint32)(int32)(e_max_Turning[0]*100);
fuzzy_parameter[1]=(uint32)(int32)(e_min_Turning[0]*100);
fuzzy_parameter[2]=(uint32)(int32)(kp_max_Turning[0]*100);
fuzzy_parameter[3]=(uint32)(int32)(kp_min_Turning[0]*100);
fuzzy_parameter[4]=(uint32)(int32)(ki_max_Turning[0]*100);
fuzzy_parameter[5]=(uint32)(int32)(ki_min_Turning[0]*100);
fuzzy_parameter[6]=(uint32)(int32)(kd_max_Turning[0]*100);
fuzzy_parameter[7]=(uint32)(int32)(kd_min_Turning[0]*100);
system_delay_ms(5);
fuzzy_parameter[0+8]=(uint32)(int32)(e_max_Turning[1]*100);
fuzzy_parameter[1+8]=(uint32)(int32)(e_min_Turning[1]*100);
fuzzy_parameter[2+8]=(uint32)(int32)(kp_max_Turning[1]*100);
fuzzy_parameter[3+8]=(uint32)(int32)(kp_min_Turning[1]*100);
fuzzy_parameter[4+8]=(uint32)(int32)(ki_max_Turning[1]*100);
fuzzy_parameter[5+8]=(uint32)(int32)(ki_min_Turning[1]*100);
fuzzy_parameter[6+8]=(uint32)(int32)(kd_max_Turning[1]*100);
fuzzy_parameter[7+8]=(uint32)(int32)(kd_min_Turning[1]*100);
system_delay_ms(5);
flash_write_page(0, MEM_SEC_FUZZY_PID, fuzzy_parameter, 16);
system_delay_ms(5);
LCD_ShowString(0, 280, "save_finish", RGB565_RED, RGB565_BLACK, IPS200_8X16_FONT, 1,IPS200_DEFAULT_CHAR_GAP);
}
/********************************************************************************
* @Function 角度环的三套PID速度环的三套PID
* @param
* @return
* @note
* @Author
********************************************************************************/
uint32 Direct_Motor[3] = {0}; // s三套内环GPS转向环PI,Kp1、Ki1;Kp2、Ki2(被放大100倍)
void Save_motor_pid(void)
{
Direct_Motor[0]=(uint32)(int32)(PID_Motor.kp*100);
Direct_Motor[1]=(uint32)(int32)(PID_Motor.ki*100);
Direct_Motor[2]=(uint32)(int32)(PID_Motor.kd*100);
if(flash_check(0,MEM_SEC_MOTOR))
{
flash_erase_page(0,MEM_SEC_MOTOR);
}
flash_write_page(0, MEM_SEC_MOTOR, Direct_Motor, 3);
}
/********************************************************************************
* @Function 角度环的三套PID
* @param
* @return
* @note
* @Author
********************************************************************************/
uint32 Direct_Servo[6] = {0}; // s三套外环GPS转向环PI,Kp1、Ki1;Kp2、Ki2(被放大100倍)
void Save_servo_pid(void)
{
Direct_Servo[0]=(uint32)(int32)(PID_Servo.kp[0]*100);
Direct_Servo[1]=(uint32)(int32)(PID_Servo.ki[0]*100);
Direct_Servo[2]=(uint32)(int32)(PID_Servo.kd[0]*100);
Direct_Servo[3]=(uint32)(int32)(PID_Servo.kp[1]*100);
Direct_Servo[4]=(uint32)(int32)(PID_Servo.ki[1]*100);
Direct_Servo[5]=(uint32)(int32)(PID_Servo.kd[1]*100);
if(flash_check(0,MEM_SEC_SERVO))
{
flash_erase_page(0,MEM_SEC_SERVO);
}
flash_write_page(0, MEM_SEC_SERVO, Direct_Servo, 6);
}
void Read_servo_pid(void)
{
flash_read_page(0 , MEM_SEC_SERVO , Direct_Servo , 7);
system_delay_ms(5);
PID_Servo.kp[0]=(float)(int32)Direct_Servo[0]/100.0f;
PID_Servo.ki[0]=(float)(int32)Direct_Servo[1]/100.0f;
PID_Servo.kd[0]=(float)(int32)Direct_Servo[2]/100.0f;
PID_Servo.kp[1]=(float)(int32)Direct_Servo[3]/100.0f;
PID_Servo.ki[1]=(float)(int32)Direct_Servo[4]/100.0f;
PID_Servo.kd[1]=(float)(int32)Direct_Servo[5]/100.0f;
}
/********************************************************************************
* @Function 摄像头参数的保存与读取
* @param
* @return
* @note
* @Author
********************************************************************************/
uint32 Camera_parameter_buff[6];
void Camera_save(void)
{
Camera_parameter_buff[0] = (uint32)(int32)(SXT_rectangle_Servo_parameter_p * 1000);
Camera_parameter_buff[1] = (uint32)(int32)(SXT_line_Servo_parameter_p * 1000);
Camera_parameter_buff[2] = (uint32)(int32)(servo_SXT_trust * 1000);
Camera_parameter_buff[3] = SXT_all_open_flag;
Camera_parameter_buff[4] = SXT_control_flag;
Camera_parameter_buff[5] = SXT_light;
if(flash_check(0,Camera_Parameters))
{
flash_erase_page(0,Camera_Parameters);
}
flash_write_page(0, Camera_Parameters, Camera_parameter_buff, 6);
}
void Camera_read(void)
{
flash_read_page(0, Camera_Parameters, Camera_parameter_buff, 6);
system_delay_ms(5);
SXT_rectangle_Servo_parameter_p = (float)(int32)Camera_parameter_buff[0]/1000.0f;
SXT_line_Servo_parameter_p = (float)(int32)Camera_parameter_buff[1]/1000.0f;
servo_SXT_trust = (float)(int32)Camera_parameter_buff[2]/1000.0f;
SXT_all_open_flag = Camera_parameter_buff[3];
SXT_control_flag = Camera_parameter_buff[4];
SXT_light = Camera_parameter_buff[5];
}
/********************************************************************************
* @Function 科目四参数的保存与读取
* @param
* @return
* @note
* @Author
********************************************************************************/
uint32 Item_four_buff[10];
void Item_four_save(void){
}
void Item_four_read(void){
}
最新发布