407,ec11,内部flash,保存参数调出参数_单片机

flash.h

#ifndef __flash_H 
#define __flash_H


#include "sys.h"


extern u32 flash1_rx_buff[200];//读取flash内容存放到该数组
extern u32 flash1_rx_len;

extern u32 flash1_tx_buff[200];//将该数组写入flash
extern u32 flash1_tx_len;

/*---------------------------------------flash.h---------------------------------------------*/
#define STM32_FLASH_BASE 0x08000000//FLASH的起始地址
#define FLASH_SAVE_ADDR 0X080E0000//存放起始地址,可自己改

//FLASH 扇区的起始地址
#define ADDR_FLASH_SECTOR_0 ((u32)0x08000000)//扇区0起始地址, 16 Kbytes
#define ADDR_FLASH_SECTOR_1 ((u32)0x08004000)//扇区1起始地址, 16 Kbytes
#define ADDR_FLASH_SECTOR_2 ((u32)0x08008000)//扇区2起始地址, 16 Kbytes
#define ADDR_FLASH_SECTOR_3 ((u32)0x0800C000)//扇区3起始地址, 16 Kbytes
#define ADDR_FLASH_SECTOR_4 ((u32)0x08010000)//扇区4起始地址, 64 Kbytes
#define ADDR_FLASH_SECTOR_5 ((u32)0x08020000)//扇区5起始地址, 128 Kbytes
#define ADDR_FLASH_SECTOR_6 ((u32)0x08040000)//扇区6起始地址, 128 Kbytes
#define ADDR_FLASH_SECTOR_7 ((u32)0x08060000)//扇区7起始地址, 128 Kbytes
#define ADDR_FLASH_SECTOR_8 ((u32)0x08080000)//扇区8起始地址, 128 Kbytes
#define ADDR_FLASH_SECTOR_9 ((u32)0x080A0000)//扇区9起始地址, 128 Kbytes
#define ADDR_FLASH_SECTOR_10 ((u32)0x080C0000)//扇区10起始地址,128 Kbytes
#define ADDR_FLASH_SECTOR_11 ((u32)0x080E0000)//扇区11起始地址,128 Kbytes
//读取指定地址的半字(16位数据)
//faddr:读地址
//返回值:对应数据.
u32 STMFLASH_ReadWord(u32 faddr);
//获取某个地址所在的flash扇区
//addr:flash地址
//返回值:0~11,即addr所在的扇区
uint16_t STMFLASH_GetFlashSector(u32 addr);
//从指定地址开始写入指定长度的数据
//WriteAddr:起始地址(此地址必须为4的倍数!!)
//pBuffer:数据指针
//NumToWrite:字(32位)数(就是要写入的32位数据的个数.)
void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite);
//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToRead:字(4位)数
void STMFLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead);


#endif

/*---------------------------------------flash.c---------------------------------------------*/

flash.c

#include "flash.h"

u32 flash1_rx_buff[200];//读取flash内容存放到该数组
u32 flash1_rx_len=10;
u32 flash1_tx_buff[200];//将该数组写入flash
u32 flash1_tx_len=10;
//读取指定地址的半字(16位数据)
//faddr:读地址
//返回值:对应数据.
u32 STMFLASH_ReadWord(u32 faddr)
{
return *(vu32*)faddr;
}


//获取某个地址所在的flash扇区
//addr:flash地址
//返回值:0~11,即addr所在的扇区
uint16_t STMFLASH_GetFlashSector(u32 addr)
{
if(addr<ADDR_FLASH_SECTOR_1)return FLASH_Sector_0;
else if(addr<ADDR_FLASH_SECTOR_2)return FLASH_Sector_1;
else if(addr<ADDR_FLASH_SECTOR_3)return FLASH_Sector_2;
else if(addr<ADDR_FLASH_SECTOR_4)return FLASH_Sector_3;
else if(addr<ADDR_FLASH_SECTOR_5)return FLASH_Sector_4;
else if(addr<ADDR_FLASH_SECTOR_6)return FLASH_Sector_5;
else if(addr<ADDR_FLASH_SECTOR_7)return FLASH_Sector_6;
else if(addr<ADDR_FLASH_SECTOR_8)return FLASH_Sector_7;
else if(addr<ADDR_FLASH_SECTOR_9)return FLASH_Sector_8;
else if(addr<ADDR_FLASH_SECTOR_10)return FLASH_Sector_9;
else if(addr<ADDR_FLASH_SECTOR_11)return FLASH_Sector_10;
return FLASH_Sector_11;
}

//从指定地址开始写入指定长度的数据
//WriteAddr:起始地址(此地址必须为4的倍数!!)
//pBuffer:数据指针
//NumToWrite:字(32位)数(就是要写入的32位数据的个数.)
void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)
{
FLASH_Status status = FLASH_COMPLETE;
u32 addrx=0;
u32 endaddr=0;
if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return; //非法地址
FLASH_Unlock(); //解锁
FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存

addrx=WriteAddr; //写入的起始地址
endaddr=WriteAddr+NumToWrite*4; //写入的结束地址
if(addrx<0X1FFF0000) //只有主存储区,才需要执行擦除操作!!
{
while(addrx<endaddr) //扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
{
if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区
{
status=FLASH_EraseSector(STMFLASH_GetFlashSector(addrx),VoltageRange_3);//VCC=2.7~3.6V之间!!
if(status!=FLASH_COMPLETE)break; //发生错误了
}else addrx+=4;
}
}
if(status==FLASH_COMPLETE)
{
while(WriteAddr<endaddr)//写数据
{
if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//写入数据
{
break; //写入异常
}
WriteAddr+=4;
pBuffer++;
}
}
FLASH_DataCacheCmd(ENABLE); //FLASH擦除结束,开启数据缓存
FLASH_Lock();//上锁
}

//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToRead:字(4位)数
void STMFLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead)
{
u32 i;
for(i=0;i<NumToRead;i++)
{
pBuffer[i]=STMFLASH_ReadWord(ReadAddr);//读取4个字节.
ReadAddr+=4;//偏移4个字节.
}
}


/* demo main.c

u32 flash1_rx_buff[100];//读取flash内容存放到该数组
u32 flash1_rx_len=10;
u32 flash1_tx_buff[100];//将该数组写入flash
u32 flash1_tx_len=10;

u8 flash2_rx_buff[100];//读取flash内容存放到该数组
u8 flash2_rx_len=10;
u8 flash2_tx_buff[100];//将该数组写入flash
u8 flash2_tx_len=10;
int main()
{

STMFLASH_Write(FLASH_SAVE_ADDR,flash1_tx_buff,flash1_tx_len);
STMFLASH_Read(FLASH_SAVE_ADDR, flash1_rx_buff,flash1_rx_len);

//如若要定义u8数组可
//STMFLASH_Write(FLASH_SAVE_ADDR,(u32*)flash2_tx_buff,len);//len= flash2_tx_len/4 + (flash2_tx_len%4)? 1 : 0
//STMFLASH_Read(FLASH_SAVE_ADDR, (u32*)flash2_rx_buff,len);//len= flash2_rx_len/4 + (flash2_rx_len%4)? 1 : 0
}

*/

EC11.h

#ifndef __EC11_H
#define __EC11_H
#include "sys.h"

#define EC11D PEin(0)

#define EC11A PGin(14)
#define EC11B PGin(15)

extern u8 EC11_sign[3];

void EC11_Init(void);
void EC11_Check(void);

#endif


//demo
// if(key_sign[0])
// {
// key_sign[0]=0;
// if(servo_duty[option]<2000)
// servo_duty[option]+=1;
// }
// if(key_sign[1])
// {
// key_sign[1]=0;
// if(servo_duty[option]>0) servo_duty[option]-=1;
// }
// if(key_sign[2])
// {
// key_sign[2]=0;
// break;
// }

EC11.c

#include "EC11.h"
#include "usart.h"
#include "delay.h"




u8 EC11_sign[3]={0};
u8 EC11_status_old[2]={0};
u8 EC11_count=0;


void EC11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_DOWN GPIO_PuPd_UP
GPIO_Init(GPIOG, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}

void EC11_Check(void)
{
if(!EC11A)
{
if(EC11_status_old[0])
{
if(!EC11B) EC11_sign[0]=1;
else EC11_sign[1]=1;
}
EC11_status_old[0]=0;
}

else
{

EC11_status_old[0]=1;
}


if(!EC11D)
{

delay_ms(10);
if(!EC11D)
{
if(EC11_status_old[1])
{
EC11_sign[2]=1;
}
EC11_status_old[1]=0;
}

}
else
{
EC11_status_old[1]=1;
}
// if(EC11_count==9)
// {
//
// }

// EC11_count++;
// if(EC11_count>9) EC11_count=0;
}

key.h

#ifndef __KEY_H 
#define __KEY_H


#include "sys.h"
//KEY 端口定义
#define KEY4 PDin(11)// DS0
#define KEY5 PDin(13)// DS1

#define KEY6 PDin(12)// DS1
#define KEY7 PDin(10)// DS1
#define KEY8 PDin(14)// DS1


#define Key4ShortClickVal 40
#define Key4LongClickVal 44

#define Key5ShortClickVal 50
#define Key5LongClickVal 55

#define Key6ShortClickVal 60
#define Key6LongClickVal 66

#define Key7ShortClickVal 70
#define Key7LongClickVal 77

#define Key8ShortClickVal 80
#define Key8LongClickVal 88

#define NoKeyVal 99

#define LongPressCount 45//超过60*5ms=300ms,算做长按


#define ParInt1 0
#define ParInt2 1
#define ParInt3 2
#define ParInt4 3
#define ParInt5 4


#define ParFloat1 0
#define ParFloat2 1
#define ParFloat3 2
#define ParFloat4 3
#define ParFloat5 4

extern int StepIntArray[5];//数组0-1-2-3-4
extern float StepFloatArray[5];
extern u8 StepIntIndex;
extern u8 StepFloatIndex;
extern u8 KeyModeFlag;//=0,不支持连续按,只支持短按和长按,=1支持连续按
extern u8 FlagKeyAddSub;//=0,加法操作,=1,减法操作

extern u8 FlagIntParIndex;//1-5
extern u8 FlagFloatParIndex;//1-5

void KEY_Init(void);//初始化
u8 KeyScan(void);//只有短按

u8 KeyScan0(u8 keymode);//包括短按+连续按下
u8 KeyScan1(u8 keymode);//包括短按,长按,连续按,


#endif

key.c

#include "key.h"
#include "delay.h"


int StepIntArray[5]={1,5,100,500,1000};//数组0-1-2-3-4
float StepFloatArray[5]={0.01,0.1,1,10,100};
u8 StepIntIndex=0;
u8 StepFloatIndex=0;
u8 KeyModeFlag=0;//=0,不支持连续按,支持短按和长按,=1支持连续按

u8 FlagKeyAddSub=0;//=0,加法操作,=1,减法操作
u8 FlagIntParIndex=1;//1-5
u8 FlagFloatParIndex=1;//1-5


void KEY_Init(void)//初始化
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//?? GPIOF ??
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_13| GPIO_Pin_12| GPIO_Pin_10| GPIO_Pin_14;//LED0 ? LED1 ?? IO ?
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//??????
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//??
GPIO_Init(GPIOD, &GPIO_InitStructure);//??? GPIO
}

//u8 unsigned char 0-255
//只是做短按的功能
u8 KeyScan(void)
{
u8 KeyValueTemp;
if(KEY4==0)
{
delay_ms(15);//软件去抖动
if(KEY4==0)
{
while(KEY4==0);//等待按键松开
KeyValueTemp=Key4ShortClickVal;
}
}

else if(KEY5==0)
{
delay_ms(15);
if(KEY5==0)
{ while(KEY5==0);//等待按键松开
KeyValueTemp=Key5ShortClickVal;
}
}

else if(KEY6==0)
{
delay_ms(15);
if(KEY6==0)
{ while(KEY6==0);//等待按键松开
KeyValueTemp=Key6ShortClickVal;
}
}

else if(KEY7==0)
{
delay_ms(15);
if(KEY7==0)
{ while(KEY7==0);//等待按键松开
KeyValueTemp=Key7ShortClickVal;
}
}

else if(KEY8==0)
{
delay_ms(15);
if(KEY8==0)
{ while(KEY8==0);//等待按键松开
KeyValueTemp=Key8ShortClickVal;
}
}

else KeyValueTemp=NoKeyVal;

return KeyValueTemp;

}

//u8 unsigned char 0-255
//短按+连续按下不松手,keymode=0,
//只能单独点击,点击一次加减一次,=1,连续加或者连续减
u8 KeyScan0(u8 keymode)
{
u8 KeyValueTemp;
static u8 keyUP=1;
if(keymode)keyUP=1;
if(keyUP&&(KEY4==0))
{
delay_ms(20);
keyUP=0;
if(KEY4==0)
{
KeyValueTemp=Key4ShortClickVal;
return KeyValueTemp;
}
}
else if(keyUP&&(KEY5==0))
{
delay_ms(20);
keyUP=0;
if(KEY5==0)
{
KeyValueTemp=Key5ShortClickVal;
return KeyValueTemp;
}
}

else if(keyUP&&(KEY6==0))
{
delay_ms(20);
keyUP=0;
if(KEY6==0)
{
KeyValueTemp=Key6ShortClickVal;
return KeyValueTemp;
}
}

else if(keyUP&&(KEY7==0))
{
delay_ms(20);
keyUP=0;
if(KEY7==0)
{
KeyValueTemp=Key7ShortClickVal;
return KeyValueTemp;
}
}

else if(keyUP&&(KEY8==0))
{
delay_ms(20);
keyUP=0;
if(KEY8==0)
{
KeyValueTemp=Key8ShortClickVal;
return KeyValueTemp;
}
}

if((KEY4==1)&&(KEY5==1)&&(KEY6==1)&&(KEY7==1)&&(KEY8==1))
{
keyUP=1;
}
return NoKeyVal;

}

//u8 unsigned char 0-255
//短按,连续按下不放手,长按
//keymode=0情况下,才能激活短按和长按的功能;
//keymode=1,才能激活连续按下的作用;

u8 KeyScan1(u8 keymode)
{
u8 CountPressTime=0;//长按时间计数

static u8 keyUP=1;
if(keymode)keyUP=1;

if(keyUP&&(KEY4==0))
{
delay_ms(20);
keyUP=0;
if(KEY4==0)
{
if(keymode==0)
{
while(KEY4==0)
{
delay_ms(5);
CountPressTime++;
}; //等待按键放开
if(CountPressTime>LongPressCount)
{
CountPressTime=0;
return Key4LongClickVal; //返回按键长按的按下标志
}
else return Key4ShortClickVal;
}
else if(keymode==1)
return Key4ShortClickVal;
}
}

else if(keyUP&&(KEY5==0))
{
delay_ms(20);
keyUP=0;
if(KEY5==0)
{
if(keymode==0)
{
while(KEY5==0)
{
delay_ms(5);
CountPressTime++;
}; //等待按键放开
if(CountPressTime>LongPressCount)
{
CountPressTime=0;
return Key5LongClickVal; //返回按键长按的按下标志
}
else return Key5ShortClickVal;
}
else if(keymode==1)
return Key5ShortClickVal;
}
}

else if(keyUP&&(KEY6==0))
{
delay_ms(20);
keyUP=0;
if(KEY6==0)
{
if(keymode==0)
{
while(KEY6==0)
{
delay_ms(5);
CountPressTime++;
}; //等待按键放开
if(CountPressTime>LongPressCount)
{
CountPressTime=0;
return Key6LongClickVal; //返回按键长按的按下标志
}
else return Key6ShortClickVal;

}
else if(keymode==1)
return Key6ShortClickVal;
}
}

else if(keyUP&&(KEY7==0))
{
delay_ms(20);
keyUP=0;
if(KEY7==0)
{
if(keymode==0)
{
while(KEY7==0)
{
delay_ms(5);
CountPressTime++;
}; //等待按键放开
if(CountPressTime>LongPressCount)
{
CountPressTime=0;
return Key7LongClickVal; //返回按键长按的按下标志
}
else return Key7ShortClickVal;
}
else if(keymode==1)
return Key7ShortClickVal;
}
}

else if(keyUP&&(KEY8==0))
{
delay_ms(20);
keyUP=0;
if(KEY8==0)
{
if(keymode==0)
{
while(KEY8==0)
{
delay_ms(5);
CountPressTime++;
}; //等待按键放开
if(CountPressTime>LongPressCount)
{
CountPressTime=0;
return Key8LongClickVal; //返回按键长按的按下标志
}
else return Key8ShortClickVal;

}

else if(keymode==1)
return Key8ShortClickVal;
}
}

if((KEY4==1)&&(KEY5==1)&&(KEY6==1)&&(KEY7==1)&&(KEY8==1))
{
keyUP=1;
}
return NoKeyVal;

}

main.c

#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "oled.h"
#include "extizd.h"
#include "BaseTimX.h"
#include "htimx.h"
#include "dcmotor.h"
#include "flash.h"
#include "EC11.h"


int int1=10;
int int2=12;

float float1=1.5;
float float2=10.25;

float stepx[5]={0.01,0.1,1,10,100};
float stepii=0;


void oledPage0()
{
OLED_ShowChar(0,0,'Z');
OLED_ShowChar(1*8,0,'P');
OLED_ShowChar(2*8,0,'0');

OLED_ShowChar(4*8,0,'F');
OLED_ShowChar(5*8,0,'P');
OLED_ShowChar(6*8,0,'0');


OLED_ShowChar(0*8,1,'Z');
OLED_ShowChar(1*8,1,'S');
OLED_ShowChar(2*8,1,'1');
OLED_ShowChar(3*8,1,'0');
OLED_ShowChar(4*8,1,'0');
OLED_ShowChar(5*8,1,'0');

OLED_ShowChar(6*8,1,'F');
OLED_ShowChar(7*8,1,'S');
OLED_ShowChar(8*8,1,'0');
OLED_ShowChar(9*8,1,'.');
OLED_ShowChar(10*8,1,'0');
OLED_ShowChar(11*8,1,'1');

OLED_ShowChar(0,2,'k');
OLED_ShowChar(1*8,2,'m');
OLED_ShowChar(2*8,2,'0');

OLED_ShowChar(4*8,2,'a');
OLED_ShowChar(5*8,2,'s');
OLED_ShowChar(6*8,2,'0');

OLED_ShowChar(0*8,3,'z');
OLED_ShowChar(1*8,3,'s');
OLED_ShowChar(2*8,3,'0');
OLED_ShowChar(3*8,3,'=');


OLED_ShowChar(0*8,4,'x');
OLED_ShowChar(1*8,4,'s');
OLED_ShowChar(2*8,4,'0');
OLED_ShowChar(3*8,4,'=');
}



int main(void)
{
u8 pid_flag=0;//=0,调节kp,=1,调节ki,=2调节kd
u8 key4cnt=0;
u8 key5cnt=0;

u8 KeyVal=0;
u32 iflash=0;
u32 intnum=0;
float a=123.456;
float kp=0.2,ki=0.3,kd=0.4;
u32 i=0;

delay_init(168);
LED_Init();
BEEP_Init();//初始化

KEY_Init();
OLED_Init();
delay_ms(5);
OLED_Clear();

KeyModeFlag=0;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
oledPage0();
BaseTimx_Init();
//TIM_Cmd(BASIC_TIM6, ENABLE);


HTim8_Init();//初始化函数中,加一时间是1us,1000---1us===1ms

TIM_Cmd(TIM8, ENABLE);

HTim8_SetPwmFreq(50);//用定时器8控制舵机,需要频率是50HZ(周期是20ms)

HTim1_Init();//
HTim1_SetPwmFreq(10000);//设置频率是10KHz


// HTim1_SetPwmDuty(P3ConT1CH1,0.3);
// HTim1_SetPwmDuty(P4ConT1CH2,0.5);
// HTim1_SetPwmDuty(P1ConT1CH3,0.65);
// HTim1_SetPwmDuty(P2ConT1CH4,0.85);
// DCMotor1Init();
// DCMotor2Init();
// DCMotor3Init();
// DCMotor4Init();
// TIM_Cmd(TIM1, ENABLE);//打开定时器1
uart_init(115200);
EC11_Init();
printf("HELLo world\r\n");
printf("HELLo world=%.2f\r\n",a);


// for(i=0;i<100;i++)
// {
// flash1_tx_buff[i]=i+0.2;
// }
//
// STMFLASH_Write(FLASH_SAVE_ADDR,flash1_tx_buff,flash1_tx_len);
//
// STMFLASH_Read(FLASH_SAVE_ADDR, flash1_rx_buff,flash1_rx_len);

// for(i=0;i<10;i++)
// {
// printf("frx[i]=%f\r\n",flash1_rx_buff[i]);
// }
// delay_ms(1000);

//读1个数据,第一个数据是P
while(1)
{
if(KEY4==0)
{
delay_ms(10);
if(KEY4==0)
{
printf("开机读取缺省参数\r\n");
kp=0.1;
ki=10.1;
kd=20.2;
}
break;
}

if(KEY5==0)
{
delay_ms(10);
if(KEY5==0)
{
printf("开机读取flash参数\r\n");

STMFLASH_Read(FLASH_SAVE_ADDR, flash1_rx_buff,3);
printf("kp*100=%d\r\n",flash1_rx_buff[0]);
printf("kp=%0.2f\r\n",(float)(flash1_rx_buff[0]/100.0));//还原数据
printf("ki*100=%d\r\n",flash1_rx_buff[1]);
printf("ki=%0.2f\r\n",(float)(flash1_rx_buff[1]/100.0));//还原数据
printf("kd*100=%d\r\n",flash1_rx_buff[2]);
printf("kd=%0.2f\r\n",(float)(flash1_rx_buff[2]/100.0));//还原数据
kp=(float)(flash1_rx_buff[0]/100.0);
printf("kp=%0.2f\r\n",kp);
ki=(float)(flash1_rx_buff[1]/100.0);
printf("ki=%0.2f\r\n",ki);

kd=(float)(flash1_rx_buff[2]/100.0);
printf("kd=%0.2f\r\n",kd);
printf("read a finished\r\n");
printf("**********\r\n");
printf("开机读取参数end\r\n");


}
break;
}

}

printf("开始大循环\r\n");

while(1)
{

KeyVal=KeyScan1(0);
switch(KeyVal)
{
case Key4ShortClickVal://选择参数

if(key4cnt==0)key4cnt=1;//0..1..2切换
else if(key4cnt==1)key4cnt=2;
else if(key4cnt==2)key4cnt=0;

if(key4cnt==0)
{
pid_flag=0;
printf("pid_flag=0,adjust kp\r\n");
}
else if(key4cnt==1)
{
pid_flag=1;
printf("pid_flag=1,adjust ki\r\n");
}
else if(key4cnt==2)
{
pid_flag=2;
printf("pid_flag=2,adjust kd\r\n");
}
break;


case Key5ShortClickVal://切换参数
key5cnt++;
if(key5cnt==5)key5cnt=0;//0..1..2..3..4
stepii=stepx[key5cnt];
printf("stepii=%0.2f\r\n",stepii);
break;
case Key6ShortClickVal:



break;
case Key7ShortClickVal://存数据

for(i=0;i<10;i++)
{
flash1_tx_buff[i]=a*100;//放大一百倍或者一千倍,进行存储
//小数点变为整数,存储,后面读出数据,除以100还原数据
a=a+0.2;
printf("11a[i]=%0.3f\r\n",a);

}

STMFLASH_Write(FLASH_SAVE_ADDR,flash1_tx_buff,flash1_tx_len);
printf("write data is finished\r\n");

break;

case Key8ShortClickVal: //取数据
// STMFLASH_Read(FLASH_SAVE_ADDR, flash1_rx_buff,flash1_rx_len);
// for(i=0;i<10;i++)
// {
// printf("frx[%d]=%d\r\n",i,flash1_rx_buff[i]);
// printf("frx[%d]=%.2f\r\n",i,(float)flash1_rx_buff[i]/100.0);//还原数据

// }

// STMFLASH_Read(FLASH_SAVE_ADDR, flash1_rx_buff,1);
//
// printf("frx[%d]=%d\r\n",i,flash1_rx_buff[0]);
// printf("frx[0]=%0.2f\r\n",(float)(flash1_rx_buff[0]/100.0));//还原数据
// printf("read a finished\r\n");
// printf("**********\r\n");

printf("start to read kp,ki,kd...\r\n");
STMFLASH_Read(FLASH_SAVE_ADDR, flash1_rx_buff,3);

printf("kp*100=%d\r\n",flash1_rx_buff[0]);
printf("kp=%0.2f\r\n",(float)(flash1_rx_buff[0]/100.0));//还原数据
printf("ki*100=%d\r\n",flash1_rx_buff[1]);
printf("ki=%0.2f\r\n",(float)(flash1_rx_buff[1]/100.0));//还原数据
printf("kd*100=%d\r\n",flash1_rx_buff[2]);
printf("kd=%0.2f\r\n",(float)(flash1_rx_buff[2]/100.0));//还原数据

kp=(float)(flash1_rx_buff[0]/100.0);
printf("kp=%0.2f\r\n",kp);

ki=(float)(flash1_rx_buff[1]/100.0);
printf("ki=%0.2f\r\n",ki);

kd=(float)(flash1_rx_buff[2]/100.0);
printf("kd=%0.2f\r\n",kd);

printf("read kp,ki,kd finished...\r\n");



break;

}




EC11_Check();
if(EC11_sign[0])
{
EC11_sign[0]=0;
if(pid_flag==0)
{
kp=kp+stepii;
if(kp>500)kp=500;
printf("kp=%0.3f\r\n",kp);
}
else if(pid_flag==1)
{
ki=ki+stepii;
if(ki>500)ki=500;
printf("ki=%0.3f\r\n",ki);
}
else if(pid_flag==2)
{
kd=kd+stepii;
if(kd>500)kd=500;
printf("kd=%0.3f\r\n",kd);
}

}
if(EC11_sign[1])
{
EC11_sign[1]=0;
if(pid_flag==0)
{
kp=kp-stepii;
if(kp<0)kp=0.01;
printf("kp=%0.3f\r\n",kp);

}
else if(pid_flag==1)
{
ki=ki-stepii;
if(ki<0)ki=0.01;
printf("ki=%0.3f\r\n",ki);
}
else if(pid_flag==2)
{
kd=kd-stepii;
if(kd<0)kd=0.01;
printf("kd=%0.3f\r\n",kd);
}

}
if(EC11_sign[2])
{
EC11_sign[2]=0;
flash1_rx_buff[0]=kp*100;
flash1_rx_buff[1]=ki*100;
flash1_rx_buff[2]=kd*100;

STMFLASH_Write(FLASH_SAVE_ADDR,flash1_rx_buff,3);

printf("EC11_sign2, save kp,ki,kd\r\n");
}

}
}
HELLo world
HELLo world=123.46
开机读取缺省参数
开始大循环
pid_flag=1,adjust ki
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
ki=10.100
pid_flag=2,adjust kd
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
kd=20.200
pid_flag=0,adjust kp
kp=0.100
kp=0.100
kp=0.100
kp=0.100
kp=0.100
kp=0.100
kp=0.100
kp=0.100
kp=0.100
kp=0.100
kp=0.100
stepii=0.10
kp=0.200
kp=0.300
kp=0.400
kp=0.500
kp=0.600
kp=0.700
kp=0.800
kp=0.900
kp=0.800
kp=0.900
kp=1.000
kp=1.100
kp=1.200
kp=1.300
kp=1.400
kp=1.500
kp=1.600
kp=1.700
kp=1.800
kp=1.900
kp=2.000
kp=2.100
kp=2.200
kp=2.300
kp=2.400
kp=2.500
kp=2.600
kp=2.700
kp=2.800
kp=2.900
kp=3.000
kp=3.100
kp=3.200
kp=3.300
kp=3.400
kp=3.500
kp=3.600
kp=3.700
kp=3.800
kp=3.900
kp=4.000
kp=3.900
kp=3.800
kp=3.700
kp=3.800
kp=3.900
kp=4.000
kp=4.100
kp=4.200
kp=4.300
kp=4.400
kp=4.500
kp=4.600
kp=4.700
kp=4.800
kp=4.900
kp=5.000
kp=5.100
kp=5.200
kp=5.300
kp=5.400
kp=5.500
kp=5.600
kp=5.700
kp=5.800
kp=5.900
kp=6.000
kp=6.100
kp=6.200
kp=6.300
kp=6.400
kp=6.500
kp=6.600
kp=6.700
kp=6.800
kp=6.900
kp=7.000
kp=7.100
kp=7.200
kp=7.300
kp=7.400
kp=7.500
kp=7.600
kp=7.700
kp=7.800
kp=7.900
kp=8.000
kp=8.100
kp=8.200
kp=8.300
kp=8.400
kp=8.500
kp=8.600
kp=8.700
kp=8.800
kp=8.900
kp=9.000
kp=9.100
kp=9.200
kp=9.300
kp=9.400
kp=9.500
kp=9.600
kp=9.700
kp=9.800
kp=9.900
kp=10.000
kp=10.100
kp=10.200
kp=10.300
kp=10.400
kp=10.500
kp=10.600
kp=10.700
kp=10.800
kp=10.900
kp=11.000
kp=11.100
kp=11.200
kp=11.300
kp=11.400
kp=11.500
kp=11.600
kp=11.700
kp=11.800
kp=11.900
kp=12.000
kp=12.100
kp=12.200
kp=12.300
kp=12.400
kp=12.500
kp=12.600
kp=12.700
kp=12.800
kp=12.900
kp=13.000
kp=13.100
kp=13.200
kp=13.300
kp=13.400
kp=13.500
kp=13.600
kp=13.700
kp=13.800
kp=13.900
kp=14.000
kp=14.100
kp=14.200
kp=14.300
kp=14.400
kp=14.500
kp=14.600
kp=14.700
kp=14.800
kp=14.900
kp=15.000
kp=15.100
kp=15.200
kp=15.300
kp=15.400
kp=15.500
kp=15.600
kp=15.700
kp=15.600
kp=15.700
kp=15.800
kp=15.900
kp=16.000
kp=16.100
kp=16.200
kp=16.300
kp=16.400
kp=16.500
kp=16.600
kp=16.700
kp=16.800
kp=16.700
kp=16.600
kp=16.500
kp=16.400
kp=16.300
kp=16.200
kp=16.100
kp=16.000
kp=15.900
kp=15.800
kp=15.700
kp=15.800
kp=15.900
kp=16.000
kp=16.100
kp=16.200
kp=16.300
kp=16.400
kp=16.500
kp=16.600
kp=16.700
kp=16.800
kp=16.900
kp=17.000
kp=17.100
kp=17.200
kp=17.300
kp=17.400
kp=17.500
kp=17.600
pid_flag=1,adjust ki
ki=10.200
ki=10.300
ki=10.400
ki=10.500
ki=10.600
ki=10.700
ki=10.800
ki=10.900
ki=11.000
ki=11.100
ki=11.000
ki=10.900
ki=10.800
ki=10.700
ki=10.600
ki=10.500
ki=10.400
ki=10.300
ki=10.200
pid_flag=2,adjust kd
kd=20.300
kd=20.400
kd=20.500
kd=20.600
kd=20.700
kd=20.800
kd=20.900
kd=21.000
kd=21.100
kd=21.200
kd=21.300
kd=21.400
kd=21.500
kd=21.600
stepii=1.00
kd=20.600
kd=19.600
kd=18.600
kd=17.600
kd=16.600
kd=15.600
kd=14.600
kd=13.600
kd=12.600
kd=11.600
kd=12.600
kd=13.600
kd=14.600
kd=15.600
kd=16.600
kd=17.600
kd=18.600
kd=19.600
kd=20.600
kd=21.600
kd=22.600
kd=23.600
kd=24.600
kd=25.600
kd=26.600
kd=27.600
kd=28.600
kd=29.600
kd=30.600
kd=31.600
kd=32.600
kd=33.600
kd=34.600
kd=35.600
kd=36.600
kd=37.600
kd=38.600
kd=39.600
kd=40.600
kd=41.600
EC11_sign2, save kp,ki,kd
start to read kp,ki,kd...
kp*100=1760
kp=17.60
ki*100=1020
ki=10.20
kd*100=4160
kd=41.60
kp=17.60
ki=10.20
kd=41.60
read kp,ki,kd finished...
pid_flag=0,adjust kp
pid_flag=1,adjust ki
pid_flag=2,adjust kd
stepii=10.00
stepii=100.00
stepii=0.01
11a[i]=123.656
11a[i]=123.856
11a[i]=124.056
11a[i]=124.256
11a[i]=124.456
11a[i]=124.656
11a[i]=124.856
11a[i]=125.056
11a[i]=125.256
11a[i]=125.456
write data is finished
start to read kp,ki,kd...
kp*100=12345
kp=123.45
ki*100=12365
ki=123.65
kd*100=12385
kd=123.85
kp=123.45
ki=123.65
kd=123.85
read kp,ki,kd finished...
start to read kp,ki,kd...
kp*100=12345
kp=123.45
ki*100=12365
ki=123.65
kd*100=12385
kd=123.85
kp=123.45
ki=123.65
kd=123.85
read kp,ki,kd finished...
start to read kp,ki,kd...
kp*100=12345
kp=123.45
ki*100=12365
ki=123.65
kd*100=12385
kd=123.85
kp=123.45
ki=123.65
kd=123.85
read kp,ki,kd finished...
11a[i]=125.656
11a[i]=125.856
11a[i]=126.056
11a[i]=126.256
11a[i]=126.456
11a[i]=126.656
11a[i]=126.856
11a[i]=127.056
11a[i]=127.256
11a[i]=127.456
write data is finished
kd=123.840
kd=123.830
kd=123.820
kd=123.830
kd=123.840
kd=123.850
kd=123.860
kd=123.870
kd=123.880
kd=123.890
kd=123.900
kd=123.910
kd=123.920
kd=123.930
EC11_sign2, save kp,ki,kd
kd=123.920
kd=123.910
![在这里插入代码片](https://img-blog.csdnimg.cn/4dda845093b84288b417d0953101ee58.png)

407,ec11,内部flash,保存参数调出参数_stm32_02