- For Cosmic Compiler:
1- Define a segment FLASH_CODE by the mean of " #pragma section (FLASH_CODE)". This segment is defined in the stm8s_flash.c file.
2- Uncomment the "#define RAM_EXECUTION (1)" line in the stm8s.h file, or define it in Cosmic compiler preprocessor to enable the FLASH_CODE segment definition.
3- In STVD Select Project\Settings\Linker\Category "input" and in the RAM section add the FLASH_CODE segment with "-ic" options.
4- In main.c file call the _fctcpy() function with first segment character as parameter "_fctcpy('F');" to load the declared moveable code segment (FLASH_CODE) in RAM before execution.
5- By default the _fctcpy function is packaged in the Cosmic machine library, so the function prototype "int _fctcopy(char name);" must be added in main.c file.
в первую страницу флеш записываю последовательность 0-32. потом пытаюсь стереть эту страницу.
main.c
Код
_fctcpy('f');
adr=(u8 *)0x4000;
FLASH->DUKR = FLASH_RASS_KEY2;
FLASH->DUKR = FLASH_RASS_KEY1;
for (i=0;i<32;i++){
*(adr++)=i;
while ((FLASH->IAPSR & FLASH_IAPSR_EOP)==0);
}
eeErase((u8*)0x4000);
while ((FLASH->IAPSR & FLASH_IAPSR_EOP)==0);
FLASH->IAPSR &= (uint8_t)(~FLASH_IAPSR_DUL);
adr=(u8 *)0x4000;
FLASH->DUKR = FLASH_RASS_KEY2;
FLASH->DUKR = FLASH_RASS_KEY1;
for (i=0;i<32;i++){
*(adr++)=i;
while ((FLASH->IAPSR & FLASH_IAPSR_EOP)==0);
}
eeErase((u8*)0x4000);
while ((FLASH->IAPSR & FLASH_IAPSR_EOP)==0);
FLASH->IAPSR &= (uint8_t)(~FLASH_IAPSR_DUL);
функция eeErase
Код
#pragma section (flash_code)
IN_RAM(void eeErase(u8 *adr)){
FLASH->CR2 |= FLASH_CR2_ERASE;
FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NERASE);
*adr++ = 0;
*adr++ = 0;
*adr++ = 0;
*adr++ = 0;
}
#pragma section ()
IN_RAM(void eeErase(u8 *adr)){
FLASH->CR2 |= FLASH_CR2_ERASE;
FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NERASE);
*adr++ = 0;
*adr++ = 0;
*adr++ = 0;
*adr++ = 0;
}
#pragma section ()
в файле stm8s003k3.lsf добавляю сегмент flash_code
Код
+seg .data -b 0x100 -m 0x100 -n .data
+seg .in_ram -a .data -n .in_ram -ic
+seg .bss -a .in_ram -n .bss
+seg .flash_code -a .bss -n .flash_code
+seg .in_ram -a .data -n .in_ram -ic
+seg .bss -a .in_ram -n .bss
+seg .flash_code -a .bss -n .flash_code
#define RAM_EXECUTION (1) в файле stm8s.h раскоментил.
в итоге в выходном hex файле функция располагается по адресам ОЗУ, на что STVP_CmdLine.exe ругается:
>>> Loading file out/project.hex in PROGRAM MEMORY image in computer
(API) WARNING : FILE : line 42: Address 0x12C is out of range and is ignored!
По сути вроде правильно ругается. Только тогда я не понимаю, как расположить код функции во флеш, чтобы потом функция _fctcpy('f') скопировала его в секцию flash_code и обращение было именно к функции расположенной в ОЗУ?