/* Adopted from STM AN4065 stm32f0xx_flash.c:FLASH_ProgramWord */

write:  
        ldr     r4, STM32_FLASH_BASE
        mov     r5, #1            /*  FLASH_CR_PG, FLASH_SR_BUSY */
        mov     r6, #4            /*  PGERR  */
write_half_word:
        ldr     r3, [r4, #16]     /*  FLASH->CR   */
        orr     r3, r5            
        str     r3, [r4, #16]     /*  FLASH->CR |= FLASH_CR_PG */
	ldrh    r3, [r0]          /*  r3 = *sram */
        strh    r3, [r1]          /*  *flash = r3 */
busy:
        ldr	r3, [r4, #12]     /*  FLASH->SR  */
        tst	r3, r5            /*  FLASH_SR_BUSY  */
        beq	busy

        tst	r3, r6            /*  PGERR  */
        bne	exit

        add     r0, r0, #2        /*  sram += 2  */
        add     r1, r1, #2        /*  flash += 2  */
        sub	r2, r2, #0x01     /*  count--  */
        cmp     r2, #0
        bne	write_half_word
exit:
        ldr     r3, [r4, #16]     /*  FLASH->CR  */
        bic     r3, r5            
        str     r3, [r4, #16]     /*  FLASH->CR &= ~FLASH_CR_PG  */
        bkpt	#0x00

STM32_FLASH_BASE: .word 0x40022000
