Beispiel #1
0
u8* bsp_Firmware_Write(u8* writebuffer,u32 writeaddress,u16 writelength)
{	
	
	u8 status=0;
	u16 index=0;
	SleepTime=0;
  FLASH_Unlock();									//解锁 
  FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
 	FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_OPERR|FLASH_FLAG_WRPERR|  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
	
   __set_PRIMASK(1);  
		  for(index=0;index<writelength;index++)
		{
			status=FLASH_ProgramByte(writeaddress+index,writebuffer[index]);  
		}
   __set_PRIMASK(0);  

	
  FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
	FLASH_Lock();//上锁	
	if(status==FLASH_COMPLETE)
	{
		MCU_WriteStatus=0;
	}
	else
	{
		MCU_WriteStatus=status;
	}
	return &MCU_WriteStatus;
		
}
Beispiel #2
0
//void SD_TEST(void)
//{
//	u8 res;
//	UINT bw,index;
//	res=f_mount( &fatfs_SDCARD,"0:/",1 );
//	res=f_open(&file_sdif, "0:/sdif.dat",FA_OPEN_EXISTING|FA_WRITE|FA_READ);
//	res=f_write(&file_sdif,SDTEST_WriteBuffer,512,&bw);
//	res=f_close(&file_sdif);
//	res=f_open(&file_sdif, "0:/sdif.dat",FA_OPEN_EXISTING |FA_WRITE);
//	res=f_write(&file_sdif,SDTEST_WriteBuffer,512,&bw);
//	res=f_close(&file_sdif);
//	res=f_open(&file_sdif, "0:/sdif.dat",FA_OPEN_EXISTING | FA_READ);
//	index=0;
//	while(SDTEST_ReadBuffer[31]!=0x04)
//	{
//		index++;
//		res=f_read(&file_sdif,SDTEST_ReadBuffer,512,&bw);
//	}
//	f_close(&file_sdif);      
//	
//	
//}
u8 bsp_ChangeAPPtoRun(u8 App_Select)
{
  u8 status=0;
	u8 Flash_status=0;
	FLASH_Unlock();									//解锁 
  FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
 	FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_OPERR|FLASH_FLAG_WRPERR|  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
	status=FLASH_EraseSector(FLASH_Sector_3 ,VoltageRange_3);//VCC=2.7~3.6V之间!!

	if(status==FLASH_COMPLETE)
	{
   __set_PRIMASK(1);  
	status=FLASH_ProgramByte(App_ToRun_Flag,App_Select);  //SysID
   __set_PRIMASK(0);  
	}
  FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
	FLASH_Lock();//上锁	
	if(status==FLASH_COMPLETE)
	{
		Flash_status=0;
	}
	else
	{
		Flash_status=status;
	}
	return Flash_status;
		
}
Beispiel #3
0
void bsp_SysinfoSave(void)
{
	u8 status=0;
	u16 index=0;
	SleepTime=0;
	memcpy(MCU_ROM_Write,(u8*)ADDR_FLASH_SECTOR_7,1024+16); //?????,???????????buffer
	memcpy(MCU_ROM_Write+1024,&char_SysID_Length,1); 
	memcpy(MCU_ROM_Write+1024+1,char_SysID,char_SysID_Length); 
	memcpy(MCU_ROM_Write+1024+9,&Battery_Threshold,1);
	memcpy(MCU_ROM_Write+1024+10,&Key_Sound,1);
	
	FLASH_Unlock();									//?? 
  FLASH_DataCacheCmd(DISABLE);//FLASH????,????????
 	FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_OPERR|FLASH_FLAG_WRPERR|  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
	status=FLASH_EraseSector(FLASH_Sector_7 ,VoltageRange_3);//VCC=2.7~3.6V??!!

	if(status==FLASH_COMPLETE)
	{

		  for(index=0;index<(1024+16);index++)
		{
			status=FLASH_ProgramByte(ADDR_FLASH_SECTOR_7+index,MCU_ROM_Write[index]);  //SysID
		}

	}
	
  FLASH_DataCacheCmd(ENABLE);	//FLASH????,??????
	FLASH_Lock();//??	
	if(status==FLASH_COMPLETE)
	{
		MCU_WriteStatus=0;
	}
	else
	{
		MCU_WriteStatus=status;
	}
//	FLASH_Unlock();									//?? 
//  FLASH_DataCacheCmd(DISABLE);//FLASH????,????????
// 	FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_OPERR|FLASH_FLAG_WRPERR|  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
//	status=FLASH_EraseSector(FLASH_Sector_7 ,VoltageRange_3);//VCC=2.7~3.6V??!!

//	if(status==FLASH_COMPLETE)
//	{

//			status=FLASH_ProgramByte(ADDR_FLASH_SECTOR_7+1024,char_SysID_Length);//????
//		  for(index=0;index<char_SysID_Length;index++)
//		{
//			status=FLASH_ProgramByte(ADDR_FLASH_SECTOR_7+1024+index+1,char_SysID[index]);  //SysID
//		}
//		  status=FLASH_ProgramByte(ADDR_FLASH_SECTOR_7+1024+9,Battery_Threshold);
//		  status=FLASH_ProgramByte(ADDR_FLASH_SECTOR_7+1024+10,Key_Sound);
//		  

//	}
//  FLASH_DataCacheCmd(ENABLE);	//FLASH????,??????
//	FLASH_Lock();//??
}
Beispiel #4
0
void flerase(uint32_t addrx)
{
	if(addrx < STM32_FLASH_BASE || addrx % 4)
		return;
	FLASH_Unlock();
	FLASH_DataCacheCmd(DISABLE);

	if(addrx<0X1FFF0000)
	{   
		FLASH_EraseSector(flash_get_sector(addrx),VoltageRange_3);
	}

	FLASH_DataCacheCmd(ENABLE);
	FLASH_Lock();
}
Beispiel #5
0
u8* bsp_MCU_Write(u8* writebuffer,u8 blockid,u16 writelength)
{	
	
	u8 status=0;
	u16 index=0;
	SleepTime=0;
	__set_PRIMASK(1);  
	memcpy(MCU_ROM_Write,(u8*)ADDR_FLASH_SECTOR_7,1024+16); //在擦除之前,先把数据读出来放在内存buffer
	__set_PRIMASK(0);  
	
  if(blockid==1)
	{
		memcpy(MCU_ROM_Write,writebuffer,writelength); //将512byte数据写入第一个block区域
	}
	if(blockid==2)
	{
		memcpy(MCU_ROM_Write+512,writebuffer,writelength); //将512byte数据写入第二个block区域
	}
	
	FLASH_Unlock();									//解锁 
  FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
 	FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_OPERR|FLASH_FLAG_WRPERR|  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
	status=FLASH_EraseSector(FLASH_Sector_7 ,VoltageRange_3);//VCC=2.7~3.6V之间!!

	if(status==FLASH_COMPLETE)
	{
   __set_PRIMASK(1);  
		  for(index=0;index<(1024+16);index++)
		{
			status=FLASH_ProgramByte(ADDR_FLASH_SECTOR_7+index,MCU_ROM_Write[index]);  //SysID
		}
   __set_PRIMASK(0);  
	}
	
  FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
	FLASH_Lock();//上锁	
	if(status==FLASH_COMPLETE)
	{
		MCU_WriteStatus=0;
	}
	else
	{
		MCU_WriteStatus=status;
	}
	return &MCU_WriteStatus;
		
}
Beispiel #6
0
/**
 * @Function void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite);
 * @description 从指定地址开始写入指定长度的数据
 *特别注意:因为STM32F4的扇区实在太大,没办法本地保存扇区数据,所以本函数
 *         写地址如果非0XFF,那么会先擦除整个扇区且不保存扇区数据.所以
 *         写非0XFF的地址,将导致整个扇区数据丢失.建议写之前确保扇区里
 *         没有重要数据,最好是整个扇区先擦除了,然后慢慢往后写. 
 *该函数对OTP区域也有效!可以用来写OTP区!
 *OTP区域地址范围:0X1FFF7800~0X1FFF7A0F
 * @Input  u32 WriteAddr:起始地址(此地址必须为4的倍数!!)
 *         u32 *pBuffer:数据指针
 *         u32 NumToWrite:字(32位)数(就是要写入的32位数据的个数.) 
 * @Return  void
 */
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();								//上锁
} 
Beispiel #7
0
u8 bsp_Firmware_Erase(u8 APP_Select)
{
	u8 status=0;
	FLASH_Unlock();									//解锁 
  FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
 	FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_OPERR|FLASH_FLAG_WRPERR|  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
	if(APP_Select)
	status=FLASH_EraseSector(FLASH_Sector_6 ,VoltageRange_3);//VCC=2.7~3.6V之间!!
	else
	status=FLASH_EraseSector(FLASH_Sector_5 ,VoltageRange_3);//VCC=2.7~3.6V之间!!
	
	MCU_WriteStatus=status;
	return MCU_WriteStatus;

}
Beispiel #8
0
void flwriten(uint32_t addrx,uint32_t *buf,uint32_t data_len)	
{ 
	FLASH_Status status = FLASH_COMPLETE;
	uint32_t endaddr = addrx + data_len / 4;	
	if(addrx < STM32_FLASH_BASE || addrx % 4)
		return;
	FLASH_Unlock();
	FLASH_DataCacheCmd(DISABLE);

	if(status == FLASH_COMPLETE)
	{
		while(addrx<endaddr)
		{
			if(FLASH_ProgramWord(addrx, *buf) != FLASH_COMPLETE)
			{ 
				break;
			}
			addrx += 4;
			buf++;
		} 
	}
	FLASH_DataCacheCmd(ENABLE);
	FLASH_Lock();
} 
void cpu_init(void) {
  RCC_DeInit();

  RCC_HSEConfig(RCC_HSE_ON);
  ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if (HSEStartUpStatus == SUCCESS) {
    
    // Enable flash buffers and prefetching
    FLASH_PrefetchBufferCmd(ENABLE);
    FLASH_InstructionCacheCmd(ENABLE);
    FLASH_DataCacheCmd(ENABLE);

    // Set startup speed
    cpu_reclock(&sysclock_120m);
  }
}
Beispiel #10
0
void CLOCK_FLASH_config()
{
	// クロックの状態を初期値に戻す
	RCC_DeInit();

	// wait stateの設定
	if     (VoltageRange_x == VoltageRange_2) FLASH_SetLatency(FLASH_Latency_6);
	else if(VoltageRange_x == VoltageRange_3) FLASH_SetLatency(FLASH_Latency_5);
	else while(1);

	// ART Acceleratorの設定
	FLASH_PrefetchBufferCmd(ENABLE);
	FLASH_InstructionCacheCmd(ENABLE);
	FLASH_DataCacheCmd(ENABLE);

	// HSIのキャリブレーション値を設定する
	RCC_AdjustHSICalibrationValue(HSICalibrationValue);

	// PLLの設定をする (max. 168 MHz)
	// PLLM: division factor, 2-63 --> 1-2 MHz (2MHz is recommended)
	// PLLN: multiplication factor, 64-432 --> 64-432 MHz
	// PLLP: division factor, 2, 4, 6, or 8 --> max 168 MHz
	// PLLQ: division factor, 2-15 --> 48 MHz
	RCC_PLLConfig(RCC_PLLSource_HSI, 8, 168, 2, 7); // HSI / 8 * 168 / 2 = 168 MHz
	//RCC_PLLConfig(RCC_PLLSource_HSI, 8, 168, 4, 7); // HSI / 8 * 168 / 4 = 84 MHz
	RCC_PLLCmd(ENABLE);
	while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) != SET);

	// HCLKの分周比を設定する (max. 168 MHz)
	RCC_HCLKConfig(RCC_SYSCLK_Div1);

	// PCLK2の分周比を設定する (max. 84 MHz)
	RCC_PCLK2Config(RCC_HCLK_Div2);

	// PLCK1の分周比を設定する (max. 42 MHz)
	RCC_PCLK1Config(RCC_HCLK_Div4);

	// SYSCLKのクロックソースをPLLに切り替える
	RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
	while(RCC_GetSYSCLKSource() != 0x08);
}
Beispiel #11
0
/**-----------------------------------------------------------------------------
 * @brief	Desinitialisation de la carte.
 */
void BSP_DeInit() {

	// Desactivation des interruptions
	__disable_irq();

	// Arret Systick
	SysTick->CTRL = 0;
	SysTick->LOAD = 0;
	SysTick->VAL = 0;

	// DeInitialisation des horloges

	//RCC_AHB1PeriphClockCmd(0xFFFFFFFF, DISABLE);
	RCC_AHB1PeriphResetCmd(0xFFFFFFFF, ENABLE);
	RCC_AHB1PeriphResetCmd(0xFFFFFFFF, DISABLE);

	//RCC_AHB2PeriphClockCmd(0xFFFFFFFF, DISABLE);
	RCC_AHB2PeriphResetCmd(0xFFFFFFFF, ENABLE);
	RCC_AHB2PeriphResetCmd(0xFFFFFFFF, DISABLE);

	//RCC_AHB3PeriphClockCmd(0xFFFFFFFF, DISABLE);
	RCC_AHB3PeriphResetCmd(0xFFFFFFFF, ENABLE);
	RCC_AHB3PeriphResetCmd(0xFFFFFFFF, DISABLE);

	//RCC_APB1PeriphClockCmd(0xFFFFFFFF, DISABLE);
	RCC_APB1PeriphResetCmd(0xFFFFFFFF, ENABLE);
	RCC_APB1PeriphResetCmd(0xFFFFFFFF, DISABLE);

	//RCC_APB2PeriphClockCmd(0xFFFFFFFF, DISABLE);
	RCC_APB2PeriphResetCmd(0xFFFFFFFF, ENABLE);
	RCC_APB2PeriphResetCmd(0xFFFFFFFF, DISABLE);
	RCC_DeInit();

	// ReInit Flash
	FLASH_PrefetchBufferCmd(DISABLE);
	FLASH_InstructionCacheCmd(DISABLE);
	FLASH_DataCacheCmd(DISABLE);
}
Beispiel #12
0
static void prvSetupHardware( void )
{
#if 1
     ErrorStatus HSEStartUpStatus;

    /* RCC system reset(for debug purpose) */
    RCC_DeInit();                                                               // 将外设RCC寄存器重设为缺省值

    /* Enable HSE */
    RCC_HSEConfig(RCC_HSE_ON);                                                  // 设置外部高速晶振(HSE)

    /* Wait till HSE is ready */
    HSEStartUpStatus = RCC_WaitForHSEStartUp();                                 // 等待HSE起振,该函数将等待直到HSE就绪,或者在超时的情况下退出

    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(ENABLE);  					                   // 使能预取指缓存   
    FLASH_InstructionCacheCmd(ENABLE);
	FLASH_DataCacheCmd(ENABLE);
	
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);                                      // 设置代码延时值

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);                                        // 设置AHB时钟(HCLK)

    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);                                         // 设置高速AHB时钟(PCLK2)

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);                                         // 设置低速AHB时钟(PCLK1)

    /* ADCCLK = PCLK2/4 */
    //RCC_ADCCLKConfig(RCC_PCLK2_Div4);                                       // 设置ADC时钟(ADCCLK)

    if(HSEStartUpStatus == SUCCESS)
    {
        /* PLLCLK = ((12MHz/12)*336)/4 = 84 MHz */
        RCC_PLLConfig(RCC_PLLCFGR_PLLSRC_HSE, 12, 336, 4, 7);                    // 设置PLL时钟源及倍频系数
		HSE_Or_HSI = 1;
        //MsTimeTick = 84000;
    }
    else
    {
        /* PLLCLK = ((4MHz/7)*336)/4 = 48 MHz */
        RCC_PLLConfig(RCC_PLLCFGR_PLLSRC_HSI, 7, 336, 4, 4);                // 设置PLL时钟源及倍频系数
        HSE_Or_HSI = 0;
        //MsTimeTick = 48000;
    }

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);                                                     // 使能PLL

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)                      // 检查指定的RCC标志位设置与否
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                              // 设置系统时钟(SYSCLK)

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)                                    // 返回用作系统时钟的时钟源
    {
    }

	/* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE and AFIO clocks */
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_ADC1 , ENABLE );

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC
	                        | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE,ENABLE);

	/* Configure HCLK clock as SysTick clock source. */
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK );
#endif
	RCC_GetClocksFreq(&RCC_Clocks);
	SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
}
Beispiel #13
0
uint8_t configFlashWrite(void) {
    configRec_t *recs;
    uint8_t ret = 0;
    int i;

    recs = (void *)aqCalloc(CONFIG_NUM_PARAMS, sizeof(configRec_t));

    if (recs) {
        configToken_t *tr = (configToken_t *)recs;
        configToken_t *tf = 0;

        // read all tokens
        do {
            tf = configTokenIterate(tf);

            // copy to RAM
            if (tf) {
                // only one instance per key
                do {
                    if (tr->key == 0 || tr->key == tf->key) {
                        memcpy(tr, tf, sizeof(configToken_t));
                        break;
                    }
                    tr++;
                } while (1);
            }
        } while (tf);

        ret = flashErase(flashStartAddr(), CONFIG_NUM_PARAMS*sizeof(configRec_t)/sizeof(uint32_t));

        // invalidate the flash data cache
        FLASH_DataCacheCmd(DISABLE);
        FLASH_DataCacheReset();
        FLASH_DataCacheCmd(ENABLE);

        if (ret) {
            tr = (configToken_t *)recs;

            // copy tokens back to flash
            while (tr->key)
                configTokenStore(tr++);

            // create param list in RAM
            for (i = 0; i < CONFIG_NUM_PARAMS; i++) {
                memcpy(recs[i].name, configParameterStrings[i], 16);
                recs[i].val = p[i];
            }

            ret = flashAddress(flashStartAddr(), (uint32_t *)recs, CONFIG_NUM_PARAMS*sizeof(configRec_t)/sizeof(uint32_t));
        }

        aqFree(recs, CONFIG_NUM_PARAMS, sizeof(configRec_t));

	AQ_NOTICE("config: Parameters saved to flash memory.\n");
    }
    else {
        AQ_NOTICE("config: Error writing params to flash, cannot allocate memory.\n");
    }

    return ret;
}