diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/stm8.src/test/flash.c | |
| download | sdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz | |
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'sim/ucsim/stm8.src/test/flash.c')
| -rw-r--r-- | sim/ucsim/stm8.src/test/flash.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/sim/ucsim/stm8.src/test/flash.c b/sim/ucsim/stm8.src/test/flash.c new file mode 100644 index 0000000..07a2394 --- /dev/null +++ b/sim/ucsim/stm8.src/test/flash.c @@ -0,0 +1,141 @@ +/* */ + +#include <string.h> + +#include "stm8.h" + +#include "flash.h" + + +// Lock, unklock + +void +flash_punlock(void) +{ + FLASH->pukr= 0x56; + FLASH->pukr= 0xae; +} + +void +flash_dunlock(void) +{ + FLASH->pukr= 0xae; + FLASH->pukr= 0x56; +} + +void +flash_plock(void) +{ + FLASH->iapsr&= ~0x02; +} + +void +flash_dlock(void) +{ + FLASH->iapsr&= ~0x08; +} + +void +flash_lock(void) +{ + FLASH->iapsr&= ~0x0a; +} + + +// Set programing mode + +void +flash_byte_mode(void) +{ + FLASH->cr2= 0; +#if (DEVICE & DEV_STM8SAF) + FLASH->ncr2= 0xff; +#endif +} + +void +flash_word_mode(void) +{ + FLASH->cr2= 0x40; +#if (DEVICE & DEV_STM8SAF) + FLASH->ncr2= 0xbf; +#endif +} + +void +flash_erase_mode(void) +{ + FLASH->cr2= 0x20; +#if (DEVICE & DEV_STM8SAF) + FLASH->ncr2= 0xdf; +#endif +} + + +// Check the result + +uint8_t +flash_wait_finish(void) +{ + unsigned long int timeout= 0xfffff; + //volatile + uint8_t r; + + r= FLASH->iapsr; + while (((r & 0x05) == 0) && + (timeout != 0)) + { + timeout--; + r= FLASH->iapsr; + } + if (r & 0x04) + return 0; + if (r & 0x01) + return 1; + if (timeout == 0) + return 2; + return 3; +} + +uint8_t +flash_erase_fn(volatile uint8_t *addr, volatile uint8_t *iapsr) +{ + volatile uint8_t r; + unsigned long timeout= 0xfffff; + flash_erase_mode(); + *(addr++)= 0; + *(addr++)= 0; + *(addr++)= 0; + *(addr)= 0; + r= *iapsr; + while (((r & 0x05) == 0) && + (timeout != 0)) + { + timeout--; + r= *iapsr; + GPIOD->odr^= 1; + } + if (r & 0x04) + return 0; + if (r & 0x01) + return 1; + if (timeout == 0) + return 2; + return 3; +} + +uint8_t flash_op_in_ram[120]; + +uint8_t +flash_erase(volatile uint8_t *addr, volatile uint8_t *iapsr) +{ + uint8_t r; + typedef uint8_t (*ft)(volatile uint8_t *addr, volatile uint8_t *iapsr); + ft f= (ft)flash_op_in_ram; + memcpy(flash_op_in_ram, &flash_erase_fn, 119); + r= (*f)(addr, iapsr); + return r; +} + + +/* End of stm8.src/test/flash.c */ |
