реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32f4 + emWin, пытаюсь использовать SDRAM в качестве системной памяти
TolikG
сообщение Jul 17 2015, 10:06
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071



Использую эвалборд stm32F439, там на борту есть SDRAM. У куба есть пример инициализации с использованием внешней SDRAM для данных и стэка. Пытаюсь использовать этот пример в связке с библиотекой emWin. В примере из куба "simple hello world", заменил файлы startup_..xx.s, system_stm32f4xx.c и файл линкера которые взял из примера использования SDRAM. Откомпилировал, запустил - получил хардфаулт при выполнении функции GUI_Init();
Так как функция билиотечная (исходного кода нету) - понять причину не могу. Вопрос: можно ли использовать библиотеку в такой схеме или остается довольствоваться примерами работающими только с внутренней памятью? Или я неправильно что то делаю?
Go to the top of the page
 
+Quote Post
Jekin
сообщение Jul 17 2015, 10:50
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 9-09-07
Из: Минск
Пользователь №: 30 406



А вы библиотеку emWin корректно настроили? GUI_Init также вызывает открытые для редактированию пользователю функции инициализации библиотеки и контроллера дисплея. В одной из них (GUI_X_Config кажется), кстати, происходит выделение памяти для библиотеки.
Посмотрите мануал, там подробно описано.
Go to the top of the page
 
+Quote Post
TolikG
сообщение Jul 17 2015, 13:18
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071



В одной из них (GUI_X_Config кажется), кстати, происходит выделение памяти для библиотеки.
Посмотрите мануал, там подробно описано.
[/quote]
Функции, описанные в мануале: GUI_ALLOC_AssignMemory(), LCD_X_Config(), LCD_X_DisplayDriver() вызываются, массив памяти для функции GUI_ALLOC виден в окне Watch - адреса 0xC00007a4...0xC00055C4, то есть внешняя память. Хардфаулт происходит где то дальше...
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jul 19 2015, 13:55
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



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

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


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
zorromen
сообщение Jul 26 2015, 14:30
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



Есть stm32F429, вроде все из примера запустилось само и работает, скажите, а emWin использует ускоритель DMA2D по умолчанию? И какие накладываются ограничения, на работу, ну типа многослойность или еще что.
Go to the top of the page
 
+Quote Post
TolikG
сообщение Jul 27 2015, 04:38
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071



Цитата(hd44780 @ Jul 19 2015, 16:55) *
У Вас дисплей FSMC (SSD1289, SSD1963)?


У меня RGB LCD интерфейс
Go to the top of the page
 
+Quote Post
TolikG
сообщение Jul 27 2015, 07:07
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 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? Если библиотека ее использует, то какие адреса?
Возможно причина хардфаулта в том, что библиотека лезет в адреса, которые уже использованы линкером?
Go to the top of the page
 
+Quote Post
TolikG
сообщение Jul 28 2015, 06:19
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 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 в качестве системной памяти запустить не удалось.
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Jul 28 2015, 08:24
Сообщение #9


Местный
***

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

Go to the top of the page
 
+Quote Post
TolikG
сообщение Jul 28 2015, 13:03
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 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, параметры линковки редактируются при настройке проекта...
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Jul 28 2015, 15:28
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



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

Сообщение отредактировал IgorKossak - Jul 28 2015, 17:04
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
TolikG
сообщение Jul 29 2015, 04:35
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 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 };
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 29 2015, 05:25
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

а какой смысл тогда крутить дефайны и функции менять, если это библиотека уже скомпиленая?
Go to the top of the page
 
+Quote Post
TolikG
сообщение Jul 29 2015, 08:48
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071



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

Смысл в том, что на плате стоит 16 мегабайт памяти, а использовать ее нельзя.
Может подскажете где взять исходники? smile3046.gif
Go to the top of the page
 
+Quote Post
sadat
сообщение Jul 29 2015, 14:00
Сообщение #15


Частый гость
**

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



Цитата(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);
    }
  }

И никто не даст никакой вероятности, что проработав энное время на вашем устройстве, использующем готовые файлы, не появится примерно такое же сообщение. Или это я слишком заморачиваюсь?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th July 2025 - 17:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01514 секунд с 7
ELECTRONIX ©2004-2016