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

 
 
> STM8L Запись EEPROM
T800
сообщение Jul 1 2015, 06:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 2-12-13
Пользователь №: 79 453



Всем привет.
Столкнулся с непонятной проблемой.
stm8l101, IAR
Суть явления - если я запускаю сессию дебага, то вижу что запись в EEPROM работает нормально. Пробовал разными способами, через указатель и через объявление переменной в области EEPROM. Плата работает как надо.
если отключаю STLink от платы и не дебажу, то не пишется значение в EEPROM.

защиту записи снимаю в самом начале программы, чтобы не ждать установки бита разблокирования памяти, хотя пробовал по-разному

Ещё одна странность. При дебаге в содержимом регистров я вижу что бит DUL в FLASH_IAPSR == 1, т.е. память разблокирована для записи. Решил проверить в коде программы
if(FLASH_IAPSR_bit.DUL==0)
{
-зажигаем светодиод
}

так вот при дебаге содержимое регистров показывает DUL==1, но в программе условие FLASH_IAPSR_bit.DUL==0 выполняется... При работе платы без дебага светодиод наоборот не горит, т.е. FLASH_IAPSR_bit.DUL==1 но EEPROM не пишет всё равно.

В общем ничего не понимаю, наверное что-то очевидное, нужна помощь зала.

Сообщение отредактировал T800 - Jul 1 2015, 06:44
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
uriy
сообщение Jul 2 2015, 04:42
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Делаю вот так в STM8L152 IAR, но я пользуюсь либами. Но заодно вижу пару ошибок копи паста. Не стал исправлять.

Разлачивать FLASH_MemType_Program никчему и почему-то в конце FLASH_Unlock

Код
void SavePairedWithAddress(uint8_t* PairedWithAddress)
{
    uint8_t GBuffer[FLASH_BLOCK_SIZE];
    
    memset(GBuffer, 0xff, FLASH_BLOCK_SIZE);
    memcpy(GBuffer, PairedWithAddress, 12);
        
    /* Define flash programming Time*/
    FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);

    FLASH_Unlock(FLASH_MemType_Program);
    /* Wait until Flash Program area unlocked flag is set*/
    while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET);

    /* Unlock flash data eeprom memory */
    FLASH_Unlock(FLASH_MemType_Data);
    /* Wait until Data EEPROM area unlocked flag is set*/
    while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);
    
    /* This function is executed from RAM */
    FLASH_ProgramBlock(PAIRED_ADDRESS_BLOCK_OPERATION, FLASH_MemType_Data, FLASH_ProgramMode_Standard, GBuffer);

    /* Wait until End of high voltage flag is set*/
    while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET);
    
    FLASH_Lock(FLASH_MemType_Program);
    FLASH_Unlock(FLASH_MemType_Data);
}
Go to the top of the page
 
+Quote Post
T800
сообщение Jul 3 2015, 15:13
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 2-12-13
Пользователь №: 79 453



Я примерно понял в чём дело. Адрес по которому я храню данные почему-то считается памятью программы а не EEPROM. Что-то как-то в мануале неясно где что, при беглом просмотре. Некие option bytes определяют границу используемого EEPROM.
Похоже при дебаге область памяти программы разблокирована, а при обычной работе я её сам не разблокировал. Разблокировка помогла.
Изначально тоже собирался использовать либы, но столкнулся с тем что через либу не работает непонятно почему, а напрямую работает запросто. Детально нет времени пока разбираться, главное работоспособность достигнута. Потом посмотрим. Спасибо.
Go to the top of the page
 
+Quote Post

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

 


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


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