В одном из текущих проектов на STM32F407ZGT связанных с применением JSON взяла и закончилась оперативка…
В описании Memories
– Up to 1 Mbyte of Flash memory
– Up to 192+4 Kbytes of SRAM including 64-Kbyte of CCM (core coupled memory) data RAM
– Flexible static memory controller supporting Compact Flash, SRAM, PSRAM, NOR and NAND memories
Из которых 128К понятны, а вот 64-Kbyte of CCM как-то и не описаны (не разжеваны) особо. Погуглил… Тоже не много. Хотя микроконтроллер, на мой взгляд, достаточно популярный. Однако, нашел интересную ссылку на документ AN4296 (Use STM32F3/STM32G4 CCM SRAM with IAR™ EWARM, Keil® MDK-ARM and GNU-based toolchains).
Получается, что документ (STM32F3/STM32G4) не из этой серии. То есть он нужен мне здесь, в F4, но здесь его нет. Пришлось добавить!
Скачать
Сразу хочу сказать, что памяти на JSON хватило.
Приведенный перевод, отвечает на некоторые вопросы, возникшие при рассмотрении AN4760 Application note Quad-SPI interface (QUADSPI) on STM32 microcontrollers в одной из моих предыдущих статей.
Что еще бросилось в глаза
В видео уроках
STM Урок 131. LAN8742A. LWIP. SOCKET. UDP Server. Часть 1
автор пишет: «Перейдём в Configuration и в FREERTOS в первом разделе выберем схему управления памятью heap_5, она мне больше понравилась чем четвёртая, так как позволяет работать с регионами памяти».
Однако, на мой взгляд, автор несколько лукавит с регионами и создает оба массива с адресами
0х20000088 heap_sram1
0х2000ecf0 heap_sram2
в одном регионе памяти.
Я долго пытался воспроизвести все это в IAR… Получилось только обмануть:
// Вариант легко работает с stm32f746xx_flash.icf без редактирования // Не инициализированный массив улетает за пределы секции .bss автоматически создает секцию .noinit перед block CSTACK, block HEAP uint8_t heap_sram1[32*1024]; __no_init uint8_t heap_sram2[32*1024];
Сама по себе heap_5 тоже не особо где подробно описана, однако… Интуитивно, зачем кучу дробить на 2 массива? — Видимо, чтобы рассадить на разные шины, которые можно независимо пользовать в случае занятости одной из них, например, DMA.
В любом случае, документ, перевод которого я привожу выше, позволил мне реализовать пример достаточно понятно.
#pragma location = ".textccmram" uint8_t heap_sram1[16*1024]; uint8_t heap_sram2[16*1024]; //heap_sram1 0x1000'0000 0x8000 Data Gb main.o [1] //heap_sram2 0x2000'0354 0x8000 Data Gb main.o [1] __________________________________________________ /* USER CODE BEGIN 1 */ HeapRegion_t xHeapRegions[] = { { heap_sram1, sizeof(heap_sram1) }, { heap_sram2, sizeof(heap_sram2) }, { NULL, 0 } }; vPortDefineHeapRegions( xHeapRegions );
В службе поддержки STMicroelectronics решение одобрили:
«CCM memory in STM32F4 can be used as additional RAM for the core as it is directly connected to its bus. You can locate there OS heap or system stack/heap to have more space for DMA in regular RAM.
This memory is automatically enabled, so there is no need to turn on its clock (please refer to Reference Manual for default settings of RCC->AHB1ENR registers).»
Так что не бросаемся быстрой оперативкой!
С уважением Петр.
Реализуем коммерческие проекты.
Возможна работа по договору подряда.
t654rk@mail.ru