Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM8L Запись EEPROM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
T800
Всем привет.
Столкнулся с непонятной проблемой.
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 не пишет всё равно.

В общем ничего не понимаю, наверное что-то очевидное, нужна помощь зала.
uriy
Делаю вот так в 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);
}
T800
Я примерно понял в чём дело. Адрес по которому я храню данные почему-то считается памятью программы а не EEPROM. Что-то как-то в мануале неясно где что, при беглом просмотре. Некие option bytes определяют границу используемого EEPROM.
Похоже при дебаге область памяти программы разблокирована, а при обычной работе я её сам не разблокировал. Разблокировка помогла.
Изначально тоже собирался использовать либы, но столкнулся с тем что через либу не работает непонятно почему, а напрямую работает запросто. Детально нет времени пока разбираться, главное работоспособность достигнута. Потом посмотрим. Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.