При стирании STM32 Flash Sector зависает программа

Я использую FreeRtos и в одной из задач стираю сектор флэш-памяти, используя следующий код

HAL_FLASH_Unlock();
    // Fill EraseInit structure
        static FLASH_EraseInitTypeDef EraseInitStruct;
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; 
    EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
    EraseInitStruct.Sector = sector;
    EraseInitStruct.NbSectors = numOfSectorsToErase;
HAL_FLASHEx_Erase_IT(&EraseInitStruct); 
  
    HAL_FLASH_Lock();

Я думал, что это неблокирующий вызов для стирания сектора, однако, когда он вызывается, все другие потоки кажутся вытесненными на 100 мс (как видно на осциллографе), пока стирание не будет завершено. Я, должно быть, делаю что-то не так, потому что использую версию стирания с прерыванием. Не должно ли все так вешать правильно?

(Уверен, что стираю сектор, в котором не находится программный код. Сектор 6)


person Hadi Jaber    schedule 28.10.2020    source источник
comment
Я думаю, что доступ для чтения (всей) флэш-памяти заблокирован во время операций стирания / записи (страницы) флэш-контроллера. Скорее всего, дело обстоит иначе, используя MCU с двумя банками вспышек, потому что для каждого банка есть отдельный контроллер флэш-памяти. Должен быть задокументирован в TRM вашего MCU STM32.   -  person HS2    schedule 28.10.2020
comment
@ HS2 Использование stm32f411 disco. Из того, что я видел, в таблице данных пока нет ничего, что объясняло бы это. Однако в справочном листе для своего HAL они объясняют, что существует две версии стирания. Есть версия с опросом и блокировкой HAL_FLashEx_Erase и неблокирующая версия HAL_FLashEx_Erase_IT. Я считаю, что это означает, что он не должен делать то, что делает при использовании HAL_FLashEx_Erase_IT.   -  person Hadi Jaber    schedule 28.10.2020
comment
@HadiJaber вы также можете запустить код из ОЗУ. ОЗУ не застопоривается, поэтому нужно как-то определять окончание операции. Справочное руководство важно, а не даташит.   -  person 0___________    schedule 29.10.2020


Ответы (2)


Документация понятна:

введите описание изображения здесь

Всегда читайте документацию, а не интернет-форумы.

person 0___________    schedule 28.10.2020

Так что, казалось бы, @ HS2 правильный. Среди дальнейших исследований стирание сектора на флеш-памяти приведет к блокировке выполнения, как указано здесь https://community.st.com/s/question/0D50X00009XkXwuSAF/how-to-save-a-variable-in-nonvolatile-memory

говоря, мигание блокирует выполнение кода.

Теперь это вызывает еще больше вопросов, хотя, например, почему инженеры в stm должны включать прерывание версии стирания сектора, когда в любом случае вызов будет блокироваться в любом случае. Это очень вводит в заблуждение. Похоже, для этого нет варианта использования.

person Hadi Jaber    schedule 28.10.2020
comment
Хади - не читайте инета, читайте документацию. И во-вторых, не используйте для этого HAL. - person 0___________; 29.10.2020