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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> IAR (STM32+Ext SRAM)
athlon64
сообщение May 3 2012, 07:16
Сообщение #1


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Использую связку STM32F217IG + SRAM CY7C1061AV33 (1 M × 16bit). IAR 6.30

Инициализацию FSMC взял из демо-проекта к плате STM322xG EVAL.
Память прекрасно читается и пишется (если писать 16-битными словами) по указателю. Скорость порадовала.
Пробовал размещать в этой памяти heap FreeRTOS, подменив указатель - некоторые задачи работают, некоторые нет (видимо из-за выравнивания).

Хотелось бы, конечно, чтобы линкер знал про эту область памяти и мог размещать в ней глобальные структуры, которых планируется много. Ну, конечно, с поправкой на выравнивание по 16 бит. Возможно такое? Попытался поправить скрипт линкера, но при попытке разместить в секции любые данные, процессор не стартует. Если такое возможно сделать, поделитесь, плис, примером скрипта линкера. И откуда в данном случае инициализировать FSMC?

Если нет, то какой способ размещения данных можно применить? Данные - массивы, структуры.

Сообщение отредактировал athlon64 - May 3 2012, 07:19


--------------------
Руслан
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение May 3 2012, 07:39
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Дайте свой скрипт, посмотрим
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 3 2012, 08:24
Сообщение #3


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Вот, например, моя попытка разместить стек во внешней памяти
Отладчик виснет
Прикрепленные файлы
Прикрепленный файл  stm32f2xx_flash.txt ( 1.57 килобайт ) Кол-во скачиваний: 91
 


--------------------
Руслан
Go to the top of the page
 
+Quote Post
KRS
сообщение May 3 2012, 09:53
Сообщение #4


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(athlon64 @ May 3 2012, 12:24) *
Вот, например, моя попытка разместить стек во внешней памяти
Отладчик виснет

Вы хотите сказать что без отладчика работает?
До использования внешнюю память же проинитить надо.
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 3 2012, 12:03
Сообщение #5


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Цитата(KRS @ May 3 2012, 15:53) *
Вы хотите сказать что без отладчика работает?

Нет, не работает.
Я о том, что не могу даже в отладке посмотреть куда попадает проц.



--------------------
Руслан
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение May 3 2012, 12:09
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Дык а вы инициализируете эту память? Это надо делать до входа в main в какой-то специальной функции или стартап самому написать...
Go to the top of the page
 
+Quote Post
KRS
сообщение May 3 2012, 12:35
Сообщение #7


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Непомнящий Евгений @ May 3 2012, 16:09) *
Это надо делать до входа в main в какой-то специальной функции или стартап самому написать...

На cortex-m3 проблематично потому что указатель стека ставится сразу из таблицы прерываний.
теоретически можно конечно поставить точку входа на кусок написанный на асме что бы не трогать стек до инициализации памяти...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 3 2012, 13:37
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(KRS @ May 3 2012, 15:35) *
На cortex-m3 проблематично потому что указатель стека ставится сразу из таблицы прерываний.

А что SP нельзя после инициализации поменять?
А сначала загрузит чем нибудь из диапазона внутренней RAM?
Go to the top of the page
 
+Quote Post
KRS
сообщение May 3 2012, 15:24
Сообщение #9


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(_Артём_ @ May 3 2012, 17:37) *
А что SP нельзя после инициализации поменять?
А сначала загрузит чем нибудь из диапазона внутренней RAM?

можно конечно! даже функция есть __set_MSP
но для этого контроллера очень сомнительно что именно стек нужно во внешнюю память пихать.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 3 2012, 15:30
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(KRS @ May 3 2012, 18:24) *
можно конечно!

Ну, так и думал.

Цитата(KRS @ May 3 2012, 18:24) *
даже функция есть __set_MSP

Её и использовать, если так хочется стек во внешнее озу расположить.
Это гораздо проще чем
Цитата
поставить точку входа на кусок написанный на асме что бы не трогать стек до инициализации памяти...


Цитата(KRS @ May 3 2012, 18:24) *
но для этого контроллера очень сомнительно что именно стек нужно во внешнюю память пихать.

И для многих других МК - сомнительно.
Go to the top of the page
 
+Quote Post
SSerge
сообщение May 3 2012, 16:44
Сообщение #11


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(athlon64 @ May 3 2012, 14:16) *
И откуда в данном случае инициализировать FSMC?

Самое подходящее для этого место - функция __low_level_init
Посмотрите в файле \arm\doc\EWARM_DevelopmentGuide.ENU.pdf что это такое и с чем его употребляют.

Добавлено:
Впрочем, если пользоваться STM32F2xx_StdPeriph_Lib от ST, то там уже есть свой стартап CMSIS\CM3\DeviceSupport\ST\STM32F2xx\startup\iar\startup_stm32f2xx.s,
из него вызывается функция SystemInit, её код находится в файле CMSIS\CM3\DeviceSupport\ST\STM32F2xx\system_stm32f2xx.c,
а уже там есть вызов
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */

так что инициализировать FSMC можно и таким способом, только нужно будет поправить эту функцию под свою конфигурацию памяти.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 4 2012, 03:41
Сообщение #12


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Цитата(SSerge @ May 3 2012, 22:44) *
Самое подходящее для этого место - функция __low_level_init


Ага, точно. Раскомментировал DATA_IN_ExtSRAM, поправил SystemInit_ExtMemCtl();.
Теперь в майне сразу же могу работать с ОЗУ, инициализация к тому моменту уже выполнена. Вопрос с местом инициализации решён.
Теперь как указать линкеру что это ОЗУ можно использовать? Объявить новый блок с выравниванием 16? А дальше? как разместить в нём нужные мне данные?

Сообщение отредактировал IgorKossak - May 4 2012, 07:07


--------------------
Руслан
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 12 2012, 03:49
Сообщение #13


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Всё ещё актуально


--------------------
Руслан
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 12 2012, 11:47
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(athlon64 @ May 4 2012, 06:41) *
как разместить в нём нужные мне данные?

Открыть Compiler Reference- ...-Placing code and data.
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 14 2012, 07:19
Сообщение #15


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Цитата(_Артём_ @ May 12 2012, 17:47) *
Открыть Compiler Reference- ...-Placing code and data.

Сильно понятнее не стало rolleyes.gif

Пошёл с другой строны. Нашёл в примерах IAR демо проект "SRAM_DataMemory" для платы STM322xG-EVAL, использующий аналогичную внешнюю память как основную.
В скрипте линкера этого проекта просто изменены адреса начала и конца RAM, также проект использует изменённый cstartup.s, в котором во время исполнения SystemInit() используется стек во внутренней SRAM, после чего заменяется на стек во внешней SRAM.
Переделал свой cstartup.s по аналогии с демкой, скрипт линкера тоже.
Судя по map-файлу, глобальные переменные теперь все размещены во внешней SRAM
Контроллер стартует, но не работают прерывания.
Причём после вызова vTaskStartScheduler(), а точнее vPortStartFirstTask(), значение регистра SP запарывается адресом внутреннего SRAM. До этого вызова в SP указатель во внешней SRAM.
Получившийся cstartup и скрипт линкера во вложении

Прикрепленные файлы
Прикрепленный файл  ext_sram.icf.txt ( 1.12 килобайт ) Кол-во скачиваний: 63
Прикрепленный файл  cstartup.s.txt ( 24.03 килобайт ) Кол-во скачиваний: 208
 


--------------------
Руслан
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 19:11
Рейтинг@Mail.ru


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