Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 05.10.2015
Сообщений: 51

Как разместить переменную типа const uint8_t во флеше в секторе размером 16 килобайт, STM32f205

15.11.2019, 13:45. Показов 4180. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как разместить переменную типа const uint8_t во флеше в секторе размером 16 килобайт, STM32f205. В STM32f205, чтоб записать во флеш одну переменную один байт, надо запомнить в ОЗУ весь сектор, минимум 16 килобайт, затем стереть весь сектор (одну переменную стереть нельзя), в ОЗУ поменять один байт и затем записать весь сектор опять во флеш. Сектора бывают 16 64 и 128 килобайт. Первые четыре сектора как раз по 16 килобайт. И второй вопрос линкер в листинге пишет о какой-то памяти RW Data. Кто знает, что это за память и как с ней работать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2019, 13:45
Ответы с готовыми решениями:

Как воспроизвести аудио файлы размером 1 килобайт?
У меня есть .wav аудио файлы очень малого размера - 1Кб, как массивы байтов, и я пробую воспроизвести их с помощью NAudio, но у меня не...

Покажите, как динамически разместить переменную типа double и передать ей начальное значение -123.0987
Используя оператор new, покажите, как динамически разместить переменную типа double и передать ей начальное значение -123.0987.

Как вывести переменную формата const char* const
Решая задачи на codewars столкнулся с проблемой, как напечатать/вывести в консоль переменную const char* const names? #include...

10
Эксперт .NET
 Аватар для Rius
13120 / 7680 / 1675
Регистрация: 25.05.2015
Сообщений: 23,426
Записей в блоге: 14
15.11.2019, 13:49
Разместить можно и в коде, значение будет только для чтения.
Или вы хотите сделать его перезаписываемым, как у eeprom?
0
2 / 2 / 0
Регистрация: 05.10.2015
Сообщений: 51
15.11.2019, 13:57  [ТС]
Мне нужна перезаписываемая переменная. Сейчас я использую флеш
C++
1
const uint8_t kkk ;
// но линкер по своему усмотрению размещает ее в любом секторе, а мне надо в первых четырех или в RW Data
0
Эксперт .NET
 Аватар для Rius
13120 / 7680 / 1675
Регистрация: 25.05.2015
Сообщений: 23,426
Записей в блоге: 14
15.11.2019, 14:05
Ок, перезаписываемая.
Проблема сделать её такой? Или разместить в нужной области памяти? Или и то, и другое?

Добавлено через 1 минуту
По первому вопросу смотрите эмуляцию eeprom: Эмуляция EEPROM во Flash-памяти программ
По второму : см. линкер файл и атрибуты секций кода.
0
2 / 2 / 0
Регистрация: 05.10.2015
Сообщений: 51
15.11.2019, 14:07  [ТС]
Вот что мне пишет в листинге.
Code (inc. data) RO Data RW Data ZI Data Debug

59568 4640 20652 784 124144 588230 Grand Totals
59568 4640 20652 272 124144 588230 ELF Image Totals (compressed)
59568 4640 20652 272 0 0 ROM Totals

То есть 59 килобайт кода во влеше, 20 килобайт данных во флеше, 784 байта RW Data , 124 килобайта ОЗУ. Вот что такое RW Data. Озу так много, потому, что я запоминаю весь сектор, перед тем как его стереть.
0
Эксперт .NET
 Аватар для Rius
13120 / 7680 / 1675
Регистрация: 25.05.2015
Сообщений: 23,426
Записей в блоге: 14
15.11.2019, 14:11
Вероятно,
Ro data: константы во flash ;
Rw data: переменные в озу;
Zi data : инициализируемый нулями массив, который данных по умолчанию не предусматривает.

Научитесь эмулировать eeprom, и тогда запоминать не придётся.
0
2 / 2 / 0
Регистрация: 05.10.2015
Сообщений: 51
15.11.2019, 14:23  [ТС]
В этом микропроцессоре нет страниц (page), как в других. Тут вместо страниц сектора и стереть можно только сектор целиком. Такая микросхема, что сделаешь.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */
#define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */
#define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */
#define ADDR_FLASH_SECTOR_3     ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */
#define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */
#define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */
#define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */
#define ADDR_FLASH_SECTOR_7     ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */
#define ADDR_FLASH_SECTOR_8     ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbytes */
#define ADDR_FLASH_SECTOR_9     ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbytes */
#define ADDR_FLASH_SECTOR_10    ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbytes */
#define ADDR_FLASH_SECTOR_11    ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbytes */
Мне надо первые четыре сектора.
0
Эксперт .NET
 Аватар для Rius
13120 / 7680 / 1675
Регистрация: 25.05.2015
Сообщений: 23,426
Записей в блоге: 14
15.11.2019, 15:47
Я в курсе. Это ничего не меняет.

Добавлено через 1 час 21 минуту
По поводу размещения в нужном месте...

Прописываете переменную в коде:
C++
1
2
__attribute__ ((section(".firmware_data")))
static const tFirmwareData firmwareData = {};
Прописываете отдельную секцию в скрипте линкера:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* Define output sections */
SECTIONS
{
  ...........
 
  .firmware_data 0x08000000 :
  {
    . = ALIGN(8);
    KEEP(*(.firmware_data))
    . = _firmware + 0x400;
    . = ALIGN(8);
  } >FLASH
 
  ...........
И при линковке переменная размещается в указанной области. Если она одна, то будет помещена с начала (первой).

Кстати, в 0x08000000 обычно располагается таблица векторов прерываний. Вы уверены, что хотите её затереть?
1
2 / 2 / 0
Регистрация: 05.10.2015
Сообщений: 51
15.11.2019, 16:10  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
секцию в скрипте линкера:
А где искать этот скрипт линкера в кейле? Нулевой сектор не подходит, надо первый 0x08004000 или второй )0x08008000 или третий 0x0800C000 .
0
Эксперт .NET
 Аватар для Rius
13120 / 7680 / 1675
Регистрация: 25.05.2015
Сообщений: 23,426
Записей в блоге: 14
15.11.2019, 16:15
Keil не юзаю - дорого...
Пишут про какой-то scatter file
http://www.keil.com/support/ma... 000009.htm
http://www.keil.com/support/ma... 656353.htm

Добавлено через 1 минуту
Вот посередине

"Scatter file" is the linker script format for the armcc toolchain. It is different from GNU ld. So you need to use the proper file depending on your toolchain.
0
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
18.11.2019, 00:51
RO data - это данные "только чтение", но строго говоря они могут находиться и в ОЗУ (как и Code в принципе) - зависит от установок файла линковки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.11.2019, 00:51
Помогаю со студенческими работами здесь

Как перевести переменную uint16_t, в две uint8_t ? РЕШЕНО!
Собственно возник в моем тупом котелке вопрос, а Как перевести переменную uint16_t, в две uint8_t ? НАЙДЕНО РЕШЕНИЕ (смотреть ниже),...

Как строку перевести в последовательность байт типа uint8_t?
Добрый день, товарищи! Подскажите как переменную типа mpz_t перевести в массив типа uint8_t. Переменная mpz_t представляется в виде строки....

Как конвертировать переменную типа Double в переменную типа String?
Как конвертировать переменную типа Double в переменную типа String. И наоборот.

проблема при Чтении из файл массива структур размером от 4 килобайт
Здравствуйте! Я написал класс для работы с данными телефонной книги. При записи в файл при размере массива структур больше чем 4 килобайта...

Преобразование типа uint16_t в 2 uint8_t
Здравствуйте, просьба не пинать, прежде чем создавать тему, поиском перерыл все и ответа не нашел. До этого писал программы на ассемблере...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru