Страница 1 из 1
Изменение константы во время выполнения программы STM32
Добавлено: Ср апр 08, 2015 13:24:07
Foxek
Добрый вечер, Хотел узнать как в STM32 в момент выполнения программы изменить константу объявленную в начале программы, я так понимаю во FLASH памяти можно что то изменить, но не могу понять что и как. Заранее спасибо
Re: Изменение константы во время выполнения программы STM32
Добавлено: Ср апр 08, 2015 14:41:08
balmer
Можно, но минимум блоками по 256 байт. См stm32f30x_flash.h или аналогичный для другого семейства чипов.
Re: Изменение константы во время выполнения программы STM32
Добавлено: Ср апр 08, 2015 15:08:31
Foxek
Спасибо, буду копать)
Re: Изменение константы во время выполнения программы STM32
Добавлено: Ср апр 08, 2015 19:05:04
Pavel_1978
Зависит от чипа и страница может быть от 256 до 2048 байт. Для изменения нужно разблокировать память стереть всю страницу и записать измененное значение. ну и константа должна естественно находится вне блока в котором прошивка лежит, как правило используют последние страницы флеша.
Re: Изменение константы во время выполнения программы STM32
Добавлено: Чт апр 09, 2015 19:07:46
Galizin
Хотел бы уточнить высказывания пред ораторов.
Можно инициализировать константу единичными битами, а потом сверху в нее что либо записать, но только 1 раз. Нужно учитывать что размер записанных данных за один раз постоянен и равен 2 байта (для f100).
Re: Изменение константы во время выполнения программы STM32
Добавлено: Чт апр 09, 2015 21:32:50
Pavel_1978
А можно по подробнее??
С кодом..
Re: Изменение константы во время выполнения программы STM32
Добавлено: Чт апр 09, 2015 23:01:52
Myp3ik
Не надо стирать страницу для записи в ячейку флеш, если эта ячейка чистая, то есть все биты в ней в единице. А вот очистить одну ячейку нельзя, только страницу сразу. Если у Вас в коде есть константа равная 0xFFFF, можете её один раз модифицировать во время выполнения программы.
Re: Изменение константы во время выполнения программы STM32
Добавлено: Пт апр 10, 2015 09:53:47
Galizin
Пожалуйста с кодом.
http://radiokot.ru/circuit/digital/measure/113/03.rar
Файл calibration.c строка 162. Определяется структура для записи калибровочных значений. Она инициализируется 0xffff из файла 1088ff.h. А далее в строке 301 происходит запись в эту структуру калибровочных значений.
Да поподробнее ....
Стирание - установка в 1 всех битов в странице. Запись во флеш означает установку в 0 (стирание) требуемых битов. Можно делать порцией по 2 байта. Если в каком либо месте памяти записаны 1, то в нем можно произвести стирание этих 1 путем записи во флеш.
Re: Изменение константы во время выполнения программы STM32
Добавлено: Пт апр 10, 2015 10:08:42
balmer
Myp3ik, Galizin
А вот мне вспоминается, что в STM32 после Erase Page все заполняется нулями (на STM32L девайсах как минимум).
PS: Похоже на STM32F1 стирается в FF, а на STM32L1 стирается в 00 значения.
Re: Изменение константы во время выполнения программы STM32
Добавлено: Пн апр 20, 2015 17:04:00
FantasyDD
И я скажу свое мяу
Неплохо описал эту функцию друг этого сайта
kalobyte на своем сайте
http://easystm32.ru/for-beginners/38-flash-stm32
и немного подробнее на этом сайте
http://chipspace.ru/stm32-flash-structure/ и
http://chipspace.ru/stm32-flash-program-erase
Если взять драйвер HAL то там все просто:
This subsection provides a set of functions allowing to manage the FLASH program
operations.
The FLASH Memory Programming functions, includes the following functions:
HAL_FLASH_Unlock(void);
HAL_FLASH_Lock(void);
HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data);
HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint32_t Data);
Any operation of erase or program should follow these steps:
1. Call the
HAL_FLASH_Unlock() function to enable the flash control register and program memory access.
2. Call the desired function to erase page or program data.
3. Call the
HAL_FLASH_Lock() to disable the flash program memory access
(recommended to protect the FLASH memory against possible unwanted operation).
Код: Выделить всё
HAL_StatusTypeDef status;
status = HAL_FLASH_Unlock();
status = HAL_FLASH_Program();
status = HAL_FLASH_Lock();
Взято с оригинальной документации от ST
http://www.st.com/st-web-ui/static/acti ... 113898.pdf