Понимание процесса записи во флэш-память в справочном руководстве STM32

Я программирую stm32l412kb, где в какой-то момент я буду записывать данные во флеш-память (из UART). Из stm32l41xx справочное руководство, я понимаю, как очистить память перед записью в нее, но на стр. 84 есть один шаг, который я не знаю, как делать при записи фактических данных. Этот шаг -

Выполните операцию записи данных по желаемому адресу памяти.

О какой операции записи данных упоминается? Я не вижу ни одного регистра, к которому идет адрес памяти, поэтому я предполагаю, что он будет использовать указатели? Как бы я это сделал?

Ваша помощь очень ценится, большое спасибо,

Гарри


person arry_h    schedule 16.07.2019    source источник
comment
На мой взгляд, в терминах есть двусмысленность: обычно операция записи во Flash состоит из: 1) стирания сектора (при необходимости) 2) программирования слова (или 2 слов), программа означает очистку одного или нескольких битов в объем памяти.   -  person Guillaume Petitjean    schedule 16.07.2019


Ответы (2)


Помимо нескольких вещей (например, только запись после стирания, тайминги, выравнивание, блокировка / разблокировка), нет большой разницы между записью в ОЗУ и записью во флэш-память. Итак, если вы выполнили шаги из справочного руководства и флэш-память готова (т.е. очищена и разблокирована), вы можете просто взять выровненный адрес памяти и записать в него.

Собственная библиотека HAL STM содержит функцию, которая выполняет за вас все громоздкие шаблоны и позволяет вам «просто писать»:

HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)

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

static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)
{
  /* Check the parameters */
  assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));

  /* Set PG bit */
  SET_BIT(FLASH->CR, FLASH_CR_PG);

  /* Program first word */
  *(__IO uint32_t*)Address = (uint32_t)Data;

  /* Barrier to ensure programming is performed in 2 steps, in right order
    (independently of compiler optimization behavior) */
  __ISB();

  /* Program second word */
  *(__IO uint32_t*)(Address+4U) = (uint32_t)(Data >> 32);
}

Как видите, здесь нет никакой магии. Это просто разыменованный указатель и присваивание.

person Vinci    schedule 16.07.2019
comment
Нельзя сказать, что между записью в RAM и FLASH нет большой разницы. Сектор флэш-памяти необходимо стереть, в зависимости от продукта, который вы должны позаботиться, чтобы программировать в другом секторе (или банке), чем тот, из которого вы выполняете, на STM32L4 вы можете программировать только 64 бита за раз, вам нужно установите один или несколько битов в регистры контроллера Flash, прежде чем делать доступ для записи на шину данных ... Однако вы правы, что в конце запись вызывается той же самой инструкцией C (или сборки). - person Guillaume Petitjean; 16.07.2019

О какой операции записи данных упоминается?

«Запись данных» - это обычная запись по адресу в памяти, которая является флэш-памятью. Обычно это STR инструкция по сборке. Просматривая вашу таблицу данных, я предполагаю, что адреса флэш-памяти находятся в диапазоне от 0x08080000 до 0x00080000.

Бывший. следующий код C запишет значение 42 в первый адрес флэш-памяти:

 *(volatile uint32_t*)0x00080000 = 42.

Для эталонной реализации вы можете увидеть stm32 drivers а>:

  /* Set PG bit */
  SET_BIT(FLASH->CR, FLASH_CR_PG);

  /* Program the double word */
  *(__IO uint32_t*)Address = (uint32_t)Data;
  *(__IO uint32_t*)(Address+4) = (uint32_t)(Data >> 32);
person KamilCuk    schedule 16.07.2019
comment
Я думаю, что ваш первый пример не работает, потому что можно запрограммировать только двойное слово (данные 2 x 32). Значит, вам нужно будет записать и в следующие четыре байта: *(volatile uint32_t*)0x00080004 = 0; - person Codo; 16.07.2019