Exemple #1
0
//
//======================================================================
// 写入
//======================================================================
void c_eep::wirte(uint8 *source, uint32 tarAddr, uint16 len) {
//
//------------------------------------
// 0. 关闭系统中断
    nvic.globalDisable();
//
//------------------------------------
// 1. 开启内部高速时钟
    RCC->CR |= ((uint32_t)RCC_CR_HSION);
    while((RCC->CR & RCC_CR_HSIRDY) == 0);
//
//------------------------------------
// 2. 解锁
	Init();
//
//------------------------------------
// 3. 擦除并写入数据
    EraseSector(tarAddr);
    ProgramPage(tarAddr, len, source);
//
//------------------------------------
// 4. 锁定
	UnInit();
//
//------------------------------------
// 5. 关闭内部高速时钟
    RCC->CR &= ~((uint32_t)RCC_CR_HSION);
    while(RCC->CR & RCC_CR_HSIRDY);
//
//------------------------------------
// 6. 开启中断
    nvic.globalEnable();
}
Exemple #2
0
int SSD_Write(void*p, int size)
{
    int r;
    EraseSector(FILE_ADDR_BEIGN);
    r = ProgramPage(FILE_ADDR_BEIGN, size, p);
    return r;
}
Exemple #3
0
static int uploadApp(void)
{
	int retval = 0;
	uint8_t recvEndAddr;
	uint32_t flashMemory = APP_ADDR_START;
	uint32_t blockNum = 0;
	uint32_t recvCnt = 0;
	uint8_t* pAppBuffer = (uint8_t *)FLASH_BUFFER_ADDR;
	
	__disable_irq();
	
	/* Erase the last sector which includes the application id */
	retval = EraseSector(LAST_SECTOR_ADDR);
	if (0 != retval)
		return retval;
	
	/* receive user application firmware data */
	retval = receiveAppData(&recvCnt, (uint8_t *)&recvEndAddr);
	if (0 != retval)
		return retval;	
	
	/* receive firmware data */
	while(1)
	{	
		pAppBuffer = (uint8_t *)FLASH_BUFFER_ADDR + (blockNum << 10);
		if (*pAppBuffer > recvEndAddr)	// reach at receive address tail
		{
			EraseSector(recvEndAddr);
			break;
		}			
		
		/* Write flash */
		flashMemory = APP_ADDR_START + (blockNum << 10);
		
		if (blockNum%4 == 0)
		{
			initAppBufData((uint32_t *)pAppBuffer);
			retval = EraseSector(flashMemory);
		}
		
		/* Write App data to falsh */
		if (0 == retval)
			retval = ProgramPage(flashMemory, APP_DATA_BLOCK_SIZE, pAppBuffer);
		
		if (0 == retval)
		{
			blockNum++;
			continue;
		}
		else
			break;
	}
	
	__enable_irq();
	
	return retval;
}
Exemple #4
0
void WriteFlashPage(u16 a, const u8 *buf) {
  // Uses r0, r1, r29, r30, r31

  u8 page[MaxFlashPageSize];
  Assert(PageSize() <= sizeof(page));

  RenableRWW();

  DwReadFlash(a, PageSize(), page);

  if (memcmp(buf, page, PageSize()) == 0) {
    ShowPageStatus(a, "unchanged");
    return;
  }

  int erase = 0;
  for (int i=0; i<PageSize(); i++) {
    if (~page[i] & buf[i]) {erase=1; break;}
  }

  if (erase) {
    ShowPageStatus(a, "erasing");
    EraseFlashPage(a);
  }

  memset(page, 0xff, PageSize());
  if (memcmp(buf, page, PageSize()) == 0) {
    return;
  }

  ShowPageStatus(a, "loading page buffer");
  LoadPageBuffer(a, buf);

  ShowPageStatus(a, "programming");
  ProgramPage(a);

  RenableRWW();
}
Exemple #5
0
// Reprogram the new settings if flash writing is allowed
static void program_cfg(cfg_setting_t *new_cfg)
{
    uint32_t status;
    uint32_t addr;
    cortex_int_state_t state;
    addr = (uint32_t)&config_rom;
    state = cortex_int_get_and_disable();
    status = EraseSector(addr);
    cortex_int_restore(state);

    if (status != 0) {
        return;
    }

    memset(write_buffer, 0xFF, sizeof(write_buffer));
    memcpy(write_buffer, new_cfg, sizeof(cfg_setting_t));
    state = cortex_int_get_and_disable();
    status = ProgramPage(addr, sizeof(write_buffer), write_buffer);
    cortex_int_restore(state);

    if (0 != status) {
        return;
    }
}