Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
stlink/flashloaders/stm32f0.s
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
71 lines (60 sloc)
1.61 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.syntax unified | |
.text | |
/* | |
* Arguments: | |
* r0 - source memory ptr | |
* r1 - target memory ptr | |
* r2 - count of bytes | |
* r3 - flash register offset | |
*/ | |
.global copy | |
copy: | |
/* | |
* These two NOPs here are a safety precaution, added by Pekka Nikander | |
* while debugging the STM32F05x support. They may not be needed, but | |
* there were strange problems with simpler programs, like a program | |
* that had just a breakpoint or a program that first moved zero to register r2 | |
* and then had a breakpoint. So, it appears safest to have these two nops. | |
* | |
* Feel free to remove them, if you dare, but then please do test the result | |
* rigorously. Also, if you remove these, it may be a good idea first to | |
* #if 0 them out, with a comment when these were taken out, and to remove | |
* these only a few months later... But YMMV. | |
*/ | |
nop | |
nop | |
# load flash control register address | |
# add r3 to flash_base for support dual bank (see flash_loader.c) | |
ldr r7, flash_base | |
add r7, r7, r3 | |
ldr r5, flash_off_sr | |
add r5, r5, r7 | |
loop: | |
# copy 2 bytes | |
ldrh r4, [r0] | |
strh r4, [r1] | |
# increment address | |
adds r0, r0, #0x2 | |
adds r1, r1, #0x2 | |
# BUSY flag | |
ldr r7, =0x01 | |
wait: | |
# get FLASH_SR | |
ldr r4, [r5] | |
# wait until BUSY flag is reset | |
tst r4, r7 | |
bne wait | |
# test PGERR or WRPRTERR flag is reset | |
ldr r7, =0x14 | |
tst r4, r7 | |
bne exit | |
# loop if count > 0 | |
subs r2, r2, #0x2 | |
bgt loop | |
exit: | |
bkpt | |
.align 2 | |
flash_base: | |
.word 0x40022000 | |
flash_off_sr: | |
.word 0x0c |