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

 
 
 
Reply to this topicStart new topic
> 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
scifi
сообщение Jan 23 2015, 06:59
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Вот так будет кузявее:
CODE
/*
void
block_erase(uint8_t *dst)
{
FLASH_CR2 = 0x20;
FLASH_NCR2 = 0xDF;
*dst++ = 0;
*dst++ = 0;
*dst++ = 0;
*dst = 0;
}
*/

static uint8_t block_erase_code[] = {
0x35, 0x20, 0x50, 0x5B, /* MOV FLASH_CR2, #0x20 */
0x35, 0xDF, 0x50, 0x5C, /* MOV FLASH_NCR2, #0xDF */
0x4F, /* CLR A */
0xF7, /* LD (X), A */
0x5C, /* INCW X */
0xF7, /* LD (X), A */
0x5C, /* INCW X */
0xF7, /* LD (X), A */
0x5C, /* INCW X */
0xF7, /* LD (X), A */
0x81, /* RET */
};

static void (*const block_erase)(uint8_t *dst) = (void (*)(uint8_t *dst))block_erase_code;

void
flash_eraseblock(void* addr)
{
block_erase(addr);
}
Go to the top of the page
 
+Quote Post
-Игорь-
сообщение Jan 23 2015, 07:29
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #4


Гуру
******

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



STM8 - это разве ARM? wacko.gif
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 23 2015, 08:57
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(jcxz @ Jan 23 2015, 10:45) *
STM8 - это разве ARM? wacko.gif

Перенёс.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 23 2015, 08:58
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(-Игорь- @ Jan 23 2015, 10:29) *
static void (*const block_erase)(uint8_t *dst) = (void (*)(uint8_t *dst))block_erase_code;
ух....

Похоже, я там лишний шаг сделал. Можно не делать обёртку для функции в ОЗУ, а всегда вызывать её по указателю:
Код
в заголовке:
extern void (*const block_erase)(uint8_t *dst);
в сишнике:
void (*const block_erase)(uint8_t *dst) = (void (*)(uint8_t *dst))block_erase_code;
вызов:
block_erase(ADDR);
Go to the top of the page
 
+Quote Post
meloden2
сообщение Jan 25 2015, 00:46
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 343
Регистрация: 1-07-12
Из: СПб - Китай - Гонг Конг
Пользователь №: 72 579



А в STM есть русскоязычная поддержка, которая отвечает, если не сильно заморачивать им голову.


--------------------
Поиск по складам: http://search.venicegrp.ru/ru/search.html
Производство печатных плат и контрактное производство: http://www.venicegrp.ru/menu/production.html
info@venicegrp.ru
Санкт-Петербург / Гонг Конг / Китай
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 10th July 2025 - 20:49
Рейтинг@Mail.ru


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