Изменение константы во время выполнения программы STM32
Изменение константы во время выполнения программы STM32
Добрый вечер, Хотел узнать как в STM32 в момент выполнения программы изменить константу объявленную в начале программы, я так понимаю во FLASH памяти можно что то изменить, но не могу понять что и как. Заранее спасибо
- Реклама
- balmer
- Это не хвост, это антенна
- Сообщения: 1433
- Зарегистрирован: Вс дек 02, 2012 03:13:48
- Откуда: Калининград
Re: Изменение константы во время выполнения программы STM32
Можно, но минимум блоками по 256 байт. См stm32f30x_flash.h или аналогичный для другого семейства чипов.
Re: Изменение константы во время выполнения программы STM32
Спасибо, буду копать)
- Pavel_1978
- Опытный кот
- Сообщения: 830
- Зарегистрирован: Пт ноя 16, 2007 11:21:37
Re: Изменение константы во время выполнения программы STM32
Зависит от чипа и страница может быть от 256 до 2048 байт. Для изменения нужно разблокировать память стереть всю страницу и записать измененное значение. ну и константа должна естественно находится вне блока в котором прошивка лежит, как правило используют последние страницы флеша.
Re: Изменение константы во время выполнения программы STM32
Хотел бы уточнить высказывания пред ораторов.
Можно инициализировать константу единичными битами, а потом сверху в нее что либо записать, но только 1 раз. Нужно учитывать что размер записанных данных за один раз постоянен и равен 2 байта (для f100).
Можно инициализировать константу единичными битами, а потом сверху в нее что либо записать, но только 1 раз. Нужно учитывать что размер записанных данных за один раз постоянен и равен 2 байта (для f100).
- Реклама
- Pavel_1978
- Опытный кот
- Сообщения: 830
- Зарегистрирован: Пт ноя 16, 2007 11:21:37
Re: Изменение константы во время выполнения программы STM32
А можно по подробнее??
С кодом..
С кодом..
Re: Изменение константы во время выполнения программы STM32
Не надо стирать страницу для записи в ячейку флеш, если эта ячейка чистая, то есть все биты в ней в единице. А вот очистить одну ячейку нельзя, только страницу сразу. Если у Вас в коде есть константа равная 0xFFFF, можете её один раз модифицировать во время выполнения программы.
Иван Сусанин - первый полупроводник 
Re: Изменение константы во время выполнения программы STM32
Пожалуйста с кодом.
http://radiokot.ru/circuit/digital/measure/113/03.rar
Файл calibration.c строка 162. Определяется структура для записи калибровочных значений. Она инициализируется 0xffff из файла 1088ff.h. А далее в строке 301 происходит запись в эту структуру калибровочных значений.
Да поподробнее ....
Стирание - установка в 1 всех битов в странице. Запись во флеш означает установку в 0 (стирание) требуемых битов. Можно делать порцией по 2 байта. Если в каком либо месте памяти записаны 1, то в нем можно произвести стирание этих 1 путем записи во флеш.
http://radiokot.ru/circuit/digital/measure/113/03.rar
Файл calibration.c строка 162. Определяется структура для записи калибровочных значений. Она инициализируется 0xffff из файла 1088ff.h. А далее в строке 301 происходит запись в эту структуру калибровочных значений.
Да поподробнее ....
Стирание - установка в 1 всех битов в странице. Запись во флеш означает установку в 0 (стирание) требуемых битов. Можно делать порцией по 2 байта. Если в каком либо месте памяти записаны 1, то в нем можно произвести стирание этих 1 путем записи во флеш.
- balmer
- Это не хвост, это антенна
- Сообщения: 1433
- Зарегистрирован: Вс дек 02, 2012 03:13:48
- Откуда: Калининград
Re: Изменение константы во время выполнения программы STM32
Myp3ik, Galizin
А вот мне вспоминается, что в STM32 после Erase Page все заполняется нулями (на STM32L девайсах как минимум).
PS: Похоже на STM32F1 стирается в FF, а на STM32L1 стирается в 00 значения.
А вот мне вспоминается, что в STM32 после Erase Page все заполняется нулями (на STM32L девайсах как минимум).
PS: Похоже на STM32F1 стирается в FF, а на STM32L1 стирается в 00 значения.
- FantasyDD
- Нашел транзистор. Понюхал.
- Сообщения: 165
- Зарегистрирован: Чт фев 19, 2015 17:26:19
- Откуда: СССР
Re: Изменение константы во время выполнения программы STM32
И я скажу свое мяу
Неплохо описал эту функцию друг этого сайта 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).
Взято с оригинальной документации от ST http://www.st.com/st-web-ui/static/acti ... 113898.pdf
Неплохо описал эту функцию друг этого сайта 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();

