charkin 0 7 мая, 2023 Опубликовано 7 мая, 2023 · Жалоба Всем привет. Чип STM32F769, к нему через FMC подключена внешняя ОЗУ (используется для вывода изображения на дисплей). Хочу частично использовать внешнюю ОЗУ для приема данных от UART и SPI. Объявил массив следующим образом : uint8_t rx_buffer[131072] @ ".sram"; В icf-файл вписал данные о новой области памяти: define symbol __ICFEDIT_region_SRAM_start__ = 0xC03B5800; define symbol __ICFEDIT_region_SRAM_end__ = 0xC043CC00; define symbol __ICFEDIT_size_sram__ = 524288; define region SRAM_region = mem:[from __ICFEDIT_region_SRAM_start__ to __ICFEDIT_region_SRAM_end__]; place in SRAM_region { readwrite section .sram }; Проверяю map-файл, вижу что массив размещен во внешней ОЗУ, все хорошо. Но прием данных не работает - в приемном буфере мусор 😞 Пробую читать через SPI, в DMA-режиме. Вопрос : возможно ли в принципе использовать внешнюю память для использования ее периферией, и с DMA? Если да, то что делаю не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 7 мая, 2023 Опубликовано 7 мая, 2023 · Жалоба 1 hour ago, charkin said: Пробую читать через SPI, в DMA-режиме. А FMC инициализирован? Линковщик всё разместил правильно, но он и понятия не имеет, что это "внешняя" память. Для него лишь адреса имеют значения. А где они находятся - вопрос другой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 7 мая, 2023 Опубликовано 7 мая, 2023 · Жалоба 35 minutes ago, haker_fox said: А FMC инициализирован? Линковщик всё разместил правильно, но он и понятия не имеет, что это "внешняя" память. Для него лишь адреса имеют значения. А где они находятся - вопрос другой. Да, FMC проинициализирован и работает верно - изображение на дисплее есть. Ну и просто скопировать данные из ОЗУ МК в буфер во внешней памяти тоже могу - memcpy() работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 7 мая, 2023 Опубликовано 7 мая, 2023 · Жалоба On 5/7/2023 at 7:23 PM, charkin said: Да, FMC проинициализирован и работает верно - изображение на дисплее есть. Ну и просто скопировать данные из ОЗУ МК в буфер во внешней памяти тоже могу - memcpy() работает. А кэши настроены ? MPU настроено ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 7 мая, 2023 Опубликовано 7 мая, 2023 · Жалоба 27 minutes ago, dimka76 said: А кэши настроены ? MPU настроено ? Кэш данных и инструкций не включал, MPU не настраивал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 7 мая, 2023 Опубликовано 7 мая, 2023 · Жалоба On 5/7/2023 at 9:17 PM, charkin said: Кэш данных и инструкций не включал, MPU не настраивал. Вот поэтому у вас и мусор при работе с периферией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 7 мая, 2023 Опубликовано 7 мая, 2023 · Жалоба 5 minutes ago, dimka76 said: Вот поэтому у вас и мусор при работе с периферией. То есть icf-файл у меня отредактирован верно, а для того, чтобы все работало, необходимо верно настроить регионы памяти в MPU? Кэши можно не включать, правильно понимаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 7 мая, 2023 Опубликовано 7 мая, 2023 · Жалоба On 5/7/2023 at 10:10 PM, charkin said: То есть icf-файл у меня отредактирован верно, а для того, чтобы все работало, необходимо верно настроить регионы памяти в MPU? Кэши можно не включать, правильно понимаю? Про icf не знаю, я IAR не использую. По поводу MPU и кэш у ST была отдельная методичка. Да и тут на форуме были темы про кэши в М7. Вроде для работы с периферией через DMA надо настраивать MPU и включать кэши. Я в таких случаях включаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 7 мая, 2023 Опубликовано 7 мая, 2023 · Жалоба 9 minutes ago, dimka76 said: Про icf не знаю, я IAR не использую. По поводу MPU и кэш у ST была отдельная методичка. Да и тут на форуме были темы про кэши в М7. Вроде для работы с периферией через DMA надо настраивать MPU и включать кэши. Я в таких случаях включаю. Я в другом проекте включал кэши, а область памяти, в которой были размещены буферы для работы с периферией в DMA-режиме настраивал как некэшируемую. Вроде работало. Но это все было в пределах ОЗУ МК, а тут внешняя память. В этом проекте решил попробовать не включать кэши и MPU - прием данных по UART и SPI в DMA-режиме работал нормально.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 8 мая, 2023 Опубликовано 8 мая, 2023 · Жалоба 8 hours ago, charkin said: То есть icf-файл у меня отредактирован верно, а для того, чтобы все работало, необходимо верно настроить регионы памяти в MPU? Да. icf-файл не имеет никакого отношения к аппаратному обеспечению. И ничего не знает о нём. Вы можете указать даже несуществующий регион памяти, например 0xFFFFFF00 : 0xFFFFFFFF, и всё равно проект в IAR (думаю, что и в другом инструментарии тоже) будет собран без ошибок. Ибо линковщику и невдомёк, что такого региона просто нет. Он покорно расположит Ваши данные в этой области. Не знаю, может быть каким-то интеллектом линковщик и наделён по поводу знания железа, в принципе производитель инструмента это сделать может, но смысла в этом нет. Поэтому, разместит то, что Вы ему сказали и там, где сказали. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться