реклама на сайте
подробности

 
 
> stm8s003 размещение функции в озу
-Игорь-
сообщение Jan 23 2015, 05:47
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-10-11
Пользователь №: 67 615



Для удаления блока в eeprom функцию удаления необходиом расположить в озу. Не получается. Делаю вроде согласно инструкции в stm8s_flash.c.
- 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);


функция 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 ()


в файле 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


#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 и обращение было именно к функции расположенной в ОЗУ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
-Игорь-
сообщение Jan 23 2015, 07:29
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-10-11
Пользователь №: 67 615



static void (*const block_erase)(uint8_t *dst) = (void (*)(uint8_t *dst))block_erase_code;
ух....
Спасибо. Работает. Красивое решение.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 23 2015, 08:45
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



STM8 - это разве ARM? wacko.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016