|
STM32f4 + emWin, пытаюсь использовать SDRAM в качестве системной памяти |
|
|
|
Jul 27 2015, 04:38
|
Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071

|
Цитата(hd44780 @ Jul 19 2015, 16:55)  У Вас дисплей FSMC (SSD1289, SSD1963)? У меня RGB LCD интерфейс
|
|
|
|
|
Jul 27 2015, 07:07
|
Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071

|
Цитата(TolikG @ Jul 17 2015, 13:06)  В примере из куба "simple hello world", заменил файлы startup_..xx.s, system_stm32f4xx.c и файл линкера которые взял из примера использования SDRAM. В примере есть функция инициализации памяти CODE /* Init the STemWin GUI Library */ BSP_SDRAM_Init(); /* Initializes the SDRAM device */ которую я закоментировал, так как память инициализируется в startup. Возникает вопрос - зачем в простейшем примере нужна SDRAM? Если библиотека ее использует, то какие адреса? Возможно причина хардфаулта в том, что библиотека лезет в адреса, которые уже использованы линкером?
|
|
|
|
|
Jul 28 2015, 06:19
|
Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071

|
Цитата(hd44780 @ Jul 19 2015, 16:55)  Мгновенно проявляется даже при простом переносе буфера STemWin в SDRAM (всё остальное неизменно). Подключил логический анализатор к шине SDRAM и обнаружил, что библиотека обращается к банку 0 (адреса 0xC0000000 - 0xC0400000). В файле GUIConf.c внес изменения CODE // Define the available number of bytes available for the GUI // //#define GUI_NUMBYTES (1024) * 150 #define GUI_NUMBYTES (1024L * 2048)
//U32 aMemory[GUI_NUMBYTES / 4]; U32 * aMemory = (U32 *)(0xC0800000);
Простой пример запустился. SDRAM в качестве системной памяти запустить не удалось.
|
|
|
|
|
Jul 28 2015, 08:24
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Цитата(TolikG @ Jul 17 2015, 15:06)  Использую эвалборд stm32F439, там на борту есть SDRAM. У куба есть пример инициализации с использованием внешней SDRAM для данных и стэка. Пытаюсь использовать этот пример в связке с библиотекой emWin. В примере из куба "simple hello world", заменил файлы startup_..xx.s, system_stm32f4xx.c и файл линкера которые взял из примера использования SDRAM. Откомпилировал, запустил - получил хардфаулт при выполнении функции GUI_Init(); Так как функция билиотечная (исходного кода нету) - понять причину не могу. Вопрос: можно ли использовать библиотеку в такой схеме или остается довольствоваться примерами работающими только с внутренней памятью? Или я неправильно что то делаю? 1) С внешнией памятью emWin работает точно. Я работал и не раз. 2) Зачем менять файлы startup_..xx.s, system_stm32f4xx.c. Нужно лишь указать компилятору по какому адресу размещать память для файла GUI_X_Config.c (в нем статически "забивается" место под кучу для emWin). Приведите файл линкера, я так понимаю именно в нем вы это делаете? В каком компиляторе? 3) Вы работаете с SDRAM через FSMC? Инициалзицию памяти и FSMC нужно проводить до вызова функции GUI_Init(). Функция BSP_SDRAM_Init() я так подозреваю именно этим и занимается. Цитата Возникает вопрос - зачем в простейшем примере нужна SDRAM? 4) Скорее всего у них в этом примере выделен большой размер кучи. Если изменить параметры линковки, так чтобы куча для emWin выделялась во внутренней памяти, то при компиляции появится ошибка, что мол места для нее нет. Хотя не могу точно утверждать, я не знаю что там за пример.
|
|
|
|
|
Jul 28 2015, 13:03
|
Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071

|
Цитата(yanvasiij @ Jul 28 2015, 11:24)  2) Зачем менять файлы startup_..xx.s...
4) Скорее всего у них в этом примере выделен большой размер кучи. Если изменить параметры линковки, так чтобы куча для emWin выделялась во внутренней памяти, то при компиляции появится ошибка, что мол места для нее нет. Чтобы инициализация SDRAM выполнялась во время startup, до входа в функцию main(). Исходный пример - простейший "Hello world", куча для emWin выделялась во внутренней памяти CODE #define GUI_NUMBYTES (1024) * 128 U32 aMemory[GUI_NUMBYTES / 4];
Компилятор IAR 7.30, параметры линковки редактируются при настройке проекта...
|
|
|
|
|
Jul 29 2015, 04:35
|
Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071

|
Цитата(yanvasiij @ Jul 28 2015, 18:28)  В startup у Вас происходит инициализация FSMC? Да, именно так. Я использую рабочий пример из CubeMX, в котором уже все настроено для использования SDRAM в качестве системной памяти. Проблема в том, что STemWin - это скомпилированная библиотека, а не исходный код. При выполнении функции GUI_Init() она ломится в SDRAM в неизвестные адреса, файл линкера ей побарабану (простейший пример "Hello..." - линкер настроен на внутреннюю память). А Вы используете бинарник или исходный код emWin? файл линкера для использования SDRAM CODE /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x081FFFFF; define symbol __ICFEDIT_region_RAM_start__ = 0xC0C00000; define symbol __ICFEDIT_region_RAM_end__ = 0xC0CFFF00; define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000; define symbol __ICFEDIT_region_CCMRAM_end__ = 0x1000FFFF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x400; define symbol __ICFEDIT_size_heap__ = 0x2000; /**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; define region CCMRAM_region = mem:[from __ICFEDIT_region_CCMRAM_start__ to __ICFEDIT_region_CCMRAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite }; do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block HEAP }; файл линкера без использования SDRAM CODE /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x081FFFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF; define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000; define symbol __ICFEDIT_region_CCMRAM_end__ = 0x1000FFFF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x4000; define symbol __ICFEDIT_size_heap__ = 0x2000; /**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; define region CCMRAM_region = mem:[from __ICFEDIT_region_CCMRAM_start__ to __ICFEDIT_region_CCMRAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite }; do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block HEAP };
|
|
|
|
|
Jul 29 2015, 08:48
|
Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071

|
Цитата(Golikov A. @ Jul 29 2015, 08:25)  а какой смысл тогда крутить дефайны и функции менять, если это библиотека уже скомпиленая? Смысл в том, что на плате стоит 16 мегабайт памяти, а использовать ее нельзя. Может подскажете где взять исходники?
|
|
|
|
|
Jul 29 2015, 14:00
|

Частый гость
 
Группа: Свой
Сообщений: 117
Регистрация: 6-07-05
Из: Белгород
Пользователь №: 6 575

|
Цитата(TolikG @ Jul 29 2015, 11:48)  Может подскажете где взять исходники?  В сети только исходники версии 3.98 и 3.90 видел, из-за большой массы файлов компилирование проекта занимало несколько минут - поэтому emWin стала доступна лишь в виде "больших скомпилированных фалов". Однако в открытых источниках (3.90) есть часть кода в GUICore.C : Код #if defined(GUI_TRIAL_VERSION) { int i; for (i = 0; i < 10; i++) { GUI_DispString("This uC-GUI library\n" "is for evaluation\n" "purpose only.\n" "A license is\n" "required to use\n" "it in a product\n\n" "www.micrium.com\n"); GUI_GotoXY(0, 0); } } И никто не даст никакой вероятности, что проработав энное время на вашем устройстве, использующем готовые файлы, не появится примерно такое же сообщение. Или это я слишком заморачиваюсь?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|