Esempio n. 1
0
//读取Flash里的的PID值
void PID_ReadFlash(void)
{
	u8 point=29;
	u16 flash_data[39];
	
	//读出Flash数据
	STMFLASH_Read(PAGE1,flash_data,39);
	
	if(flash_data[point++] == ADJUST_FLAG)//判断PID是否已经进行校准
	{
		//读出当前PID值
		PID_ROL.P = (float)flash_data[point++]/1000;
		PID_ROL.I = (float)flash_data[point++]/1000;
		PID_ROL.D = (float)flash_data[point++]/1000;
		
		PID_PIT.P = (float)flash_data[point++]/1000;
		PID_PIT.I = (float)flash_data[point++]/1000;
		PID_PIT.D = (float)flash_data[point++]/1000;
		
		PID_YAW.P = (float)flash_data[point++]/1000;
		PID_YAW.I = (float)flash_data[point++]/1000;
		PID_YAW.D = (float)flash_data[point++]/1000;
	}
	else
	{
		//写入当前PID值
		PID_WriteFlash();
	}
}
void load_data_from_flash()
{
    pd_printf("loading config data from flash...\n");
    int32 cnt, i;
    int32 magic = 0;
    pd_printf("loading config data from flash...\n");
	//TODO: add system data storage interface.
    //STMFLASH_Read(PANDO_CONFIG_ADDRESS, (uint16 *)&magic, sizeof(int32));
    pd_printf("read magic : %x\n", magic);
    if(magic != PANDO_CONFIG_MAGIC)
    {
        pd_printf("flash config data not initialized!\n");
        return;
    }
	////TODO: add system data storage interface.
    //STMFLASH_Read(PANDO_CONFIG_ADDRESS + sizeof(int32), (uint16 *)&cnt, sizeof(int32));
    pd_printf("reading config from flash , key count : %d...\n", cnt);
    for(i=0; i<cnt; i++) 
    {
        struct data_pair * p = (struct data_pair * )pd_malloc(sizeof(struct data_pair));
        STMFLASH_Read(PANDO_CONFIG_ADDRESS + sizeof(int32) + sizeof(int32) + sizeof(struct data_pair)*i,
            (uint16 *)p, sizeof(struct data_pair));
        p->next = head;
        head = p;
    }
    pd_printf("done...\n");
}
Esempio n. 3
0
//写入PID值
void PID_WriteFlash(void)
{
	u8 point=29;
	u16 flash_data[39];
	
	//读出Flash数据
	STMFLASH_Read(PAGE1,flash_data,39);
	
	//数据重新写入PID数据!
	flash_data[point++] = ADJUST_FLAG;
	
	flash_data[point++] = (u16)(PID_ROL.P*1000);
	flash_data[point++] = (u16)(PID_ROL.I*1000);
	flash_data[point++] = (u16)(PID_ROL.D*1000);
	
	flash_data[point++] = (u16)(PID_PIT.P*1000);
	flash_data[point++] = (u16)(PID_PIT.I*1000);
	flash_data[point++] = (u16)(PID_PIT.D*1000);
	
	flash_data[point++] = (u16)(PID_YAW.P*1000);
	flash_data[point++] = (u16)(PID_YAW.I*1000);
	flash_data[point++] = (u16)(PID_YAW.D*1000);
	
	//写入Flash数据
	STMFLASH_Write(PAGE1,flash_data,39);
	
}
Esempio n. 4
0
static uint8_t  isEEPROMValid(void)
{
	STMFLASH_Read(TABLE_ADDRESS,(uint16_t *)(&table),2);
	if((int16_t)table.version==EEPROM_DEFAULT_VERSION)
			return 1;
	else
			return 0;
}
Esempio n. 5
0
//函数名:ParameterRead()
//输入:无
//输出:无
//描述:初始化时,读取上位机最后一次设定的参数
//作者:马骏
//备注:没考上研,心情不好
void  ParameterRead()
{      
  //STMFLASH_Read(STM32_FLASH_BASE+STM32_FLASH_OFFEST+PIDParameterAdd,PIDParameter.ReadBuf,3);
  STMFLASH_Read(STM32_FLASH_BASE+STM32_FLASH_OFFEST+BTParameterAdd,BTParameter.ReadBuf,3);
  
  printf("从FLASH中读取参数...\r\n");

}
Esempio n. 6
0
//load params for EEPROM
void TableReadEEPROM(void)
{
//		uint8_t i=0;
		uint8_t paramNums=sizeof(table)/sizeof(float);
//		for(i=0;i<sizeof(table);i++)
//		{
//			 p=(float *)(&table) + i;
//			 STMFLASH_Read(TABLE_ADDRESS,(uint16_t *)p,2);
//		}
		STMFLASH_Read(TABLE_ADDRESS,(uint16_t *)(&table),paramNums * 2);
}
Esempio n. 7
0
void Steering_Init(void) {
    STMFLASH_Read(STEERING_DATA_ADDR, (u16*)(&steering_data), sizeof(struct steering_type));
    TIM2_PWM_Init(20000,71);
    TIM3_PWM_Init(20000,71);
    TIM5_PWM_Init(20000,71);
    TIM1_PWM_Init(20000,71);
    TIM8_PWM_Init(20000,71);
    TIM4_PWM_Init(20000,71);
    if(STEERING_INIT_MARK==steering_data.mark)
        Steering_Move(steering_data.init);
    else
        Steering_Move(default_init);
}
Esempio n. 8
0
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)	
{
	u32 secpos;	  
	u16 secoff;	   
	u16 secremain; 
 	u16 i;    
	u32 offaddr;  
	if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;
	FLASH_Unlock();					
	offaddr=WriteAddr-STM32_FLASH_BASE;		
	secpos=offaddr/STM32_SECTOR_SIZE;			
	secoff=(offaddr%STM32_SECTOR_SIZE)/2;		
	secremain=STM32_SECTOR_SIZE/2-secoff;	
	if(NumToWrite<=secremain)
		{
		secremain=NumToWrite;
		}
	else
		{
		return;
		}
	while(1) 
	{	
		STMFLASH_Read(secpos*STM32_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM32_SECTOR_SIZE/2);
		for(i=0;i<secremain;i++)
		{
			if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;
		}
		if(i<secremain)
		{
			FLASH_ErasePage(secpos*STM32_SECTOR_SIZE+STM32_FLASH_BASE);
			for(i=0;i<secremain;i++)
			{
				STMFLASH_BUF[i+secoff]=pBuffer[i];	  
			}
			STMFLASH_Write_NoCheck(secpos*STM32_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM32_SECTOR_SIZE/2);
		}else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);		   
		if(NumToWrite==secremain)break;
		else
		{
			secpos++;				
			secoff=0;				 
		   	pBuffer+=secremain;  
			WriteAddr+=secremain;	   
		   	NumToWrite-=secremain;	
			if(NumToWrite>(STM32_SECTOR_SIZE/2))secremain=STM32_SECTOR_SIZE/2;//ÏÂÒ»¸öÉÈÇø»¹ÊÇд²»Íê
			else secremain=NumToWrite;
		}	 
	};	
	FLASH_Lock();
}
Esempio n. 9
0
u8* GetBoardInformation(void)
{
	extern u8 ID_MOTORA,ID_MOTORB;
	
	STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)boardIDConf.buffer,BOARD_ID_CONFIGURATION_SIZE);
	
	boardIDConf.mainID    =boardIDConf.buffer[0];
	boardIDConf.subID     =boardIDConf.buffer[1];
	boardIDConf.MotorID[0]=boardIDConf.buffer[2];
	boardIDConf.MotorID[1]=boardIDConf.buffer[3];
	
	ID_MOTORA=boardIDConf.MotorID[0];
	ID_MOTORB=boardIDConf.MotorID[1];


	return boardIDConf.buffer;
}
Esempio n. 10
0
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)	
{
	u32 secpos;	   //扇区地址
	u16 secoff;	   //扇区内偏移地址(16位字计算)
	u16 secremain; //扇区内剩余地址(16位字计算)	   
 	u16 i;    
	u32 offaddr;   //去掉0X08000000后的地址
	if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*128)))return;//非法地址
	STMFLASH_Unlock();						//解锁
	offaddr=WriteAddr-STM32_FLASH_BASE;		//实际偏移地址offaddr=.5000 
	secpos=offaddr/1024;			        //扇区号
	secoff=(offaddr%1024)/2;		        //在扇区内的偏移(2个字节为基本单位.)
	secremain=512-secoff;		//扇区剩余空间大小   
	if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围
	while(1) 
	{	
		STMFLASH_Read(secpos*1024+STM32_FLASH_BASE,STMFLASH_BUF,512);//读出整个扇区的内容
		for(i=0;i<secremain;i++)//校验数据
		{
			if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除  	  
		}
		if(i<secremain)//需要擦除
		{
			STMFLASH_ErasePage(secpos*1024+STM32_FLASH_BASE);//擦除这个扇区
			for(i=0;i<secremain;i++)//复制
			{
				STMFLASH_BUF[i+secoff]=pBuffer[i];	  
			}
			STMFLASH_Write_NoCheck(secpos*1024+STM32_FLASH_BASE,STMFLASH_BUF,512);//写入整个扇区  
		}else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间. 				   
		if(NumToWrite==secremain)break;//写入结束了
		else//写入未结束
		{
		   // printf("扇区加1\r\n");
			secpos++;				//扇区地址增1
			secoff=0;				//偏移位置为0 	 
		   	pBuffer+=secremain;  	//指针偏移
			WriteAddr+=secremain;	//写地址偏移	   
		   	NumToWrite-=secremain;	//字节(16位)数递减
			if(NumToWrite>512)
               secremain=512;//下一个扇区还是写不完
			else secremain=NumToWrite;//下一个扇区可以写完了
		}	 
	};	
	STMFLASH_Lock();//上锁
}
Esempio n. 11
0
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)	
{
	u32 secpos;	   //扇区地址
	u16 secoff;	   //扇区内偏移地址(16位字计算)
	u16 secremain; //扇区内剩余地址(16位字计算)	   
 	u16 i;    
	u32 offaddr;   //去掉0X08000000后的地址
	if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
	FLASH_Unlock();						//解锁
	offaddr=WriteAddr-STM32_FLASH_BASE;		//实际偏移地址.
	secpos=offaddr/STM_SECTOR_SIZE;			//扇区地址  0~127 for STM32F103RBT6
	secoff=(offaddr%STM_SECTOR_SIZE)/2;		//在扇区内的偏移(2个字节为基本单位.)
	secremain=STM_SECTOR_SIZE/2-secoff;		//扇区剩余空间大小   
	if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围
	while(1) 
	{	
		STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容
		for(i=0;i<secremain;i++)//校验数据
		{
			if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除  	  
		}
		if(i<secremain)//需要擦除
		{
			FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区
			for(i=0;i<secremain;i++)//复制
			{
				STMFLASH_BUF[i+secoff]=pBuffer[i];	  
			}
			STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区  
		}else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间. 				   
		if(NumToWrite==secremain)break;//写入结束了
		else//写入未结束
		{
			secpos++;				//扇区地址增1
			secoff=0;				//偏移位置为0 	 
		   	pBuffer+=secremain;  	//指针偏移
			WriteAddr+=secremain;	//写地址偏移	   
		   	NumToWrite-=secremain;	//字节(16位)数递减
			if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
			else secremain=NumToWrite;//下一个扇区可以写完了
		}	 
	};	
	FLASH_Lock();//上锁
}
Esempio n. 12
0
//load params for EEPROM
void TableReadEEPROM(void)
{
		uint8_t paramNums=sizeof(table)/sizeof(float);

		STMFLASH_Read(TABLE_ADDRESS,(uint16_t *)(&table),paramNums * 2);
}