Перейти к содержанию
    

Использую эвалборд stm32F439, там на борту есть SDRAM. У куба есть пример инициализации с использованием внешней SDRAM для данных и стэка. Пытаюсь использовать этот пример в связке с библиотекой emWin. В примере из куба "simple hello world", заменил файлы startup_..xx.s, system_stm32f4xx.c и файл линкера которые взял из примера использования SDRAM. Откомпилировал, запустил - получил хардфаулт при выполнении функции GUI_Init();

Так как функция билиотечная (исходного кода нету) - понять причину не могу. Вопрос: можно ли использовать библиотеку в такой схеме или остается довольствоваться примерами работающими только с внутренней памятью? Или я неправильно что то делаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы библиотеку emWin корректно настроили? GUI_Init также вызывает открытые для редактированию пользователю функции инициализации библиотеки и контроллера дисплея. В одной из них (GUI_X_Config кажется), кстати, происходит выделение памяти для библиотеки.

Посмотрите мануал, там подробно описано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В одной из них (GUI_X_Config кажется), кстати, происходит выделение памяти для библиотеки.

Посмотрите мануал, там подробно описано.

Функции, описанные в мануале: GUI_ALLOC_AssignMemory(), LCD_X_Config(), LCD_X_DisplayDriver() вызываются, массив памяти для функции GUI_ALLOC виден в окне Watch - адреса 0xC00007a4...0xC00055C4, то есть внешняя память. Хардфаулт происходит где то дальше...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подтверждаю, проблема есть. Мгновенно проявляется даже при простом переносе буфера STemWin в SDRAM (всё остальное неизменно).

 

У Вас дисплей FSMC (SSD1289, SSD1963)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть stm32F429, вроде все из примера запустилось само и работает, скажите, а emWin использует ускоритель DMA2D по умолчанию? И какие накладываются ограничения, на работу, ну типа многослойность или еще что.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В примере из куба "simple hello world", заменил файлы startup_..xx.s, system_stm32f4xx.c и файл линкера которые взял из примера использования SDRAM.

В примере есть функция инициализации памяти

  /* Init the STemWin GUI Library */
 BSP_SDRAM_Init(); /* Initializes the SDRAM device */

которую я закоментировал, так как память инициализируется в startup. Возникает вопрос - зачем в простейшем примере нужна SDRAM? Если библиотека ее использует, то какие адреса?

Возможно причина хардфаулта в том, что библиотека лезет в адреса, которые уже использованы линкером?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мгновенно проявляется даже при простом переносе буфера STemWin в SDRAM (всё остальное неизменно).

Подключил логический анализатор к шине SDRAM и обнаружил, что библиотека обращается к банку 0 (адреса 0xC0000000 - 0xC0400000). В файле GUIConf.c внес изменения

// 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 в качестве системной памяти запустить не удалось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использую эвалборд 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 выделялась во внутренней памяти, то при компиляции появится ошибка, что мол места для нее нет. Хотя не могу точно утверждать, я не знаю что там за пример.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2) Зачем менять файлы startup_..xx.s...

 

4) Скорее всего у них в этом примере выделен большой размер кучи. Если изменить параметры линковки, так чтобы куча для emWin выделялась во внутренней памяти, то при компиляции появится ошибка, что мол места для нее нет.

Чтобы инициализация SDRAM выполнялась во время startup, до входа в функцию main().

Исходный пример - простейший "Hello world", куча для emWin выделялась во внутренней памяти

#define GUI_NUMBYTES  (1024) *  128
U32 aMemory[GUI_NUMBYTES / 4];

Компилятор IAR 7.30, параметры линковки редактируются при настройке проекта...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В startup у Вас происходит инициализация FSMC? Использовать внешнюю SDRAM как свою системную можно только через FSMC. Если он проинициализрован и в настройках линковщика вы разместили кучу emWin во внешней SDRAM, то все должно работать. Не работает и хотите, чтобы Вам помогли - покажите настройки линковщика (хоть скриншотом) и инициализацию FSMS.

Изменено пользователем IgorKossak
избыточное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В startup у Вас происходит инициализация FSMC?

Да, именно так. Я использую рабочий пример из CubeMX, в котором уже все настроено для использования SDRAM в качестве системной памяти. Проблема в том, что STemWin - это скомпилированная библиотека, а не исходный код. При выполнении функции GUI_Init() она ломится в SDRAM в неизвестные адреса, файл линкера ей побарабану (простейший пример "Hello..." - линкер настроен на внутреннюю память). А Вы используете бинарник или исходный код emWin?

 

файл линкера для использования SDRAM

/*###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

/*###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 };

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема в том, что STemWin - это скомпилированная библиотека, а не исходный код.

а какой смысл тогда крутить дефайны и функции менять, если это библиотека уже скомпиленая?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а какой смысл тогда крутить дефайны и функции менять, если это библиотека уже скомпиленая?

Смысл в том, что на плате стоит 16 мегабайт памяти, а использовать ее нельзя.

Может подскажете где взять исходники? :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может подскажете где взять исходники? :smile3046:

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

И никто не даст никакой вероятности, что проработав энное время на вашем устройстве, использующем готовые файлы, не появится примерно такое же сообщение. Или это я слишком заморачиваюсь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...