Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32f4 + emWin
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
TolikG
Использую эвалборд stm32F439, там на борту есть SDRAM. У куба есть пример инициализации с использованием внешней SDRAM для данных и стэка. Пытаюсь использовать этот пример в связке с библиотекой emWin. В примере из куба "simple hello world", заменил файлы startup_..xx.s, system_stm32f4xx.c и файл линкера которые взял из примера использования SDRAM. Откомпилировал, запустил - получил хардфаулт при выполнении функции GUI_Init();
Так как функция билиотечная (исходного кода нету) - понять причину не могу. Вопрос: можно ли использовать библиотеку в такой схеме или остается довольствоваться примерами работающими только с внутренней памятью? Или я неправильно что то делаю?
Jekin
А вы библиотеку emWin корректно настроили? GUI_Init также вызывает открытые для редактированию пользователю функции инициализации библиотеки и контроллера дисплея. В одной из них (GUI_X_Config кажется), кстати, происходит выделение памяти для библиотеки.
Посмотрите мануал, там подробно описано.
TolikG
В одной из них (GUI_X_Config кажется), кстати, происходит выделение памяти для библиотеки.
Посмотрите мануал, там подробно описано.
[/quote]
Функции, описанные в мануале: GUI_ALLOC_AssignMemory(), LCD_X_Config(), LCD_X_DisplayDriver() вызываются, массив памяти для функции GUI_ALLOC виден в окне Watch - адреса 0xC00007a4...0xC00055C4, то есть внешняя память. Хардфаулт происходит где то дальше...
hd44780
Подтверждаю, проблема есть. Мгновенно проявляется даже при простом переносе буфера STemWin в SDRAM (всё остальное неизменно).

У Вас дисплей FSMC (SSD1289, SSD1963)?
zorromen
Есть stm32F429, вроде все из примера запустилось само и работает, скажите, а emWin использует ускоритель DMA2D по умолчанию? И какие накладываются ограничения, на работу, ну типа многослойность или еще что.
TolikG
Цитата(hd44780 @ Jul 19 2015, 16:55) *
У Вас дисплей FSMC (SSD1289, SSD1963)?


У меня RGB LCD интерфейс
TolikG
Цитата(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? Если библиотека ее использует, то какие адреса?
Возможно причина хардфаулта в том, что библиотека лезет в адреса, которые уже использованы линкером?
TolikG
Цитата(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 в качестве системной памяти запустить не удалось.
yanvasiij
Цитата(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 выделялась во внутренней памяти, то при компиляции появится ошибка, что мол места для нее нет. Хотя не могу точно утверждать, я не знаю что там за пример.

TolikG
Цитата(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, параметры линковки редактируются при настройке проекта...
yanvasiij
В startup у Вас происходит инициализация FSMC? Использовать внешнюю SDRAM как свою системную можно только через FSMC. Если он проинициализрован и в настройках линковщика вы разместили кучу emWin во внешней SDRAM, то все должно работать. Не работает и хотите, чтобы Вам помогли - покажите настройки линковщика (хоть скриншотом) и инициализацию FSMS.
TolikG
Цитата(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 };
Golikov A.
Цитата
Проблема в том, что STemWin - это скомпилированная библиотека, а не исходный код.

а какой смысл тогда крутить дефайны и функции менять, если это библиотека уже скомпиленая?
TolikG
Цитата(Golikov A. @ Jul 29 2015, 08:25) *
а какой смысл тогда крутить дефайны и функции менять, если это библиотека уже скомпиленая?

Смысл в том, что на плате стоит 16 мегабайт памяти, а использовать ее нельзя.
Может подскажете где взять исходники? smile3046.gif
sadat
Цитата(TolikG @ Jul 29 2015, 11:48) *
Может подскажете где взять исходники? smile3046.gif

В сети только исходники версии 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);
    }
  }

И никто не даст никакой вероятности, что проработав энное время на вашем устройстве, использующем готовые файлы, не появится примерно такое же сообщение. Или это я слишком заморачиваюсь?
Jekin
Цитата(sadat @ Jul 29 2015, 17:00) *
И никто не даст никакой вероятности, что проработав энное время на вашем устройстве, использующем готовые файлы, не появится примерно такое же сообщение. Или это я слишком заморачиваюсь?

Если исходники emWin скомпилированы с дефайном GUI_TRIAL_VERSION, то при вызове GUI_Init библиотека будет показывать данное сообщение в течении 1,5 с . Позже это сообщение появляться уже не будет ни при каких обстоятельствах.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.