Beispiel #1
0
int stm32f1_flash_write(cm3ice_ctrl_t * ctrl, ice_mem_ref_t * mem, 
					 const void * buf, ice_size_t len)
{
	uint16_t data;
	uint32_t addr;
	uint8_t * ptr;
	uint32_t cr;
	int n;
	int i;

	n = (len + 1) / 2;

	ptr = (uint8_t *)buf;
	addr = mem->base + mem->offs;

	cm3ice_rd32(ctrl, STM32F_BASE_FLASH + FLASH_CR, &cr);
	if (cr & LOCK) {
		DCC_LOG(LOG_TRACE, "unlocking flash...");
		/* unlock flash write */
		cm3ice_wr32(ctrl, STM32F_BASE_FLASH + FLASH_KEYR, FLASH_KEY1);
		cm3ice_wr32(ctrl, STM32F_BASE_FLASH + FLASH_KEYR, FLASH_KEY2);
	}


	DCC_LOG2(LOG_TRACE, "0x%08x len=%d", addr, len);

	for (i = 0; i < n; i++) {
		data = ptr[0] | (ptr[1] << 8);
		stm32f10x_flash_wr16(ctrl, addr, data);
		ptr += 2;
		addr += 2;
	}
	
	return n * 2;
}
Beispiel #2
0
int flash_write(uint32_t offs, const void * buf, unsigned int len)
{
	struct stm32_flash * flash = STM32_FLASH;
	uint16_t data;
	uint16_t * addr;
	uint8_t * ptr;
	int n;
	int i;

	n = (len + 1) / 2;

	ptr = (uint8_t *)buf;
	addr = (uint16_t *)(STM32_FLASH_ADDR + offs);

	for (i = 0; i < n; i++) {
		data = ptr[0] | (ptr[1] << 8);
		if (stm32f10x_flash_wr16(flash, addr, data) < 0)
			return -1;
		ptr += 2;
		addr++;
	}
	
	return n * 2;
}