2015-02-13 2 views
3

Так что я не могу записать во внутреннюю флеш-память сразу после ее стирания. Если после операции записи нет операции стирания, я могу. Есть идеи о том, почему?Не удается записать во флэш-память после стирания

Функция программирования возвращает значение «успешной записи», но при просмотре памяти данные не записываются. Вот код:

uint32_t pageAddress = 0x08008000; 
uint16_t buffer = 0xAAAA; 

HAL_FLASH_Unlock(); 
FLASH_PageErase(pageAddress); 
HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, pageAddress, buffer); 
HAL_FLASH_Lock(); 

Я попытался блокировкой памяти между стиранием и программированием его, создавая задержку между этими операциями, что не помогает.

+0

ли флэш-стирания/write call s не возвращает информацию о статусе/ошибке? –

+0

@ FLASH_PageErase()'MartinJames не работает. «HAL_FLASH_Program()» делает, и это «HAL_OK», независимо от того, была ли запись успешной или нет. –

+0

Что произойдет, если вы просто замените 'HAL_FLASH_Program()' на 'FLASH_Program_HalfWord()'? – ElderBug

ответ

3

Проблема заключалась в том, что бит PER в регистре FLASH-> CR, который установлен, когда вызывается FLASH_PageErase(), не очищается в конце его. Очистка этого бита, пока вспышка все еще разблокирована, позволяет запускать другие операции со вспышкой.

Документация STM не имеет права говорить об этом.

+1

Ты спас свой день. Еще одна вещь, которую я заметил, заключается в том, что при попытке выполнить несколько последовательных хранилищ (используя «HAL_FLASH_Program') вам нужно очистить бит PG после каждой операции (по крайней мере, это был мой случай на STM32F072). Поэтому я изменил свою программу, чтобы она выполняла 'CLEAR_BIT (FLASH-> CR, (FLASH_CR_PER))' после очистки страницы и 'CLEAR_BIT (FLASH-> CR, (FLASH_CR_PG))' после программирования слова. – iwasz

+0

Я хотел стереть страницу, и я вызвал FLASH_pageErase (pageaddress), но после стирания я не могу записать код в ST.Its, показывающий «внутренняя ошибка команды» и «загрузка Flash не удалось», что может быть проблемой? – GOKUL

+0

Загрузить «abc \\ abc.axf» Ошибка: Flash Загрузка не удалась - Целевая DLL была отменена Flash Load закончена в 15:08:10 Загрузить «abc \\ abc.axf» Ошибка: Flash Download failed - Target DLL отменена Flash Load закончена в 15:08:18 – GOKUL

0

У меня возникла проблема с записью и чтением из пользовательского раздела флэш-памяти через библиотеку hall_stm32f4xx. После того, как я написал значение для начального адреса настроенной пользователем памяти, я прочитал его как null или (не был сохранен после программирования).

Это код

void writeFlash(void) 
 
{ 
 
\t HAL_StatusTypeDef status; 
 
\t status = \t HAL_FLASH_Unlock(); 
 
\t status= HAL_FLASH_Program(TYPEPROGRAM_HALFWORD,(uint32_t) userConfig; 
 
\t status = HAL_FLASH_Lock(); 
 
} 
 

 
void readFlash(void) 
 
{ 
 
\t tempvalue = *(uint8_t *)(userConfig); 
 

 
}

, и это является частью линкера для сконфигурировано пользователем вспышки

MEMORY 
 
{ 
 
    RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K 
 
    CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K 
 
    FLASH1 (rx) : ORIGIN = 0x08000000, LENGTH = 32k 
 
    DATA (xrw) : ORIGIN = 0x08008000, LENGTH = 32k   
 
    FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 512K-64k 
 
    FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0 
 
    EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0 
 
    EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0 
 
    EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0 
 
    EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0 
 
    MEMORY_ARRAY (xrw) : ORIGIN = 0x20002000, LENGTH = 32 
 
} 
 

 
SECTIONS 
 
{ 
 
    /////// > FLASH 
 
    /////// > FLASH1 
 
\t .user_data : 
 
\t { 
 
\t . = ALIGN(4); 
 
\t  *(.user_data) 
 
\t . = ALIGN(4); 
 
\t } > DATA 
 
    /////// > MEMORY_ARRAY 
 
    /////// > RAM 
 
}

Смежные вопросы