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

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


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

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



1. Правильно ли я понял что эту 16-бит память нельзя использовать как внутреннюю (для стека, глобальных переменных), т.к. записать в неё корректно 1 байт невозможно (пишется полуслово разом)?
2. Прозрачно для программы это обойти нельзя (средствами FSMC или компилятора)?
3. Если можно, то что для этого нужно сделать, какие минусы?

В идеале хотелось бы чтобы стек и куча FreeRTOS остались в intSRAM, остальное в extSRAM.


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


Гуру
******

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



Цитата(athlon64 @ May 14 2012, 10:19) *
Сильно понятнее не стало rolleyes.gif

Код
#pragma location=0xFFFF0400
__no_init volatile char PORT1; /* PORT1 is located at address
                                  0xFFFF0400 */

Go to the top of the page
 
+Quote Post
KRS
сообщение May 15 2012, 19:13
Сообщение #18


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

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



Цитата(athlon64 @ May 15 2012, 15:53) *
1. Правильно ли я понял что эту 16-бит память нельзя использовать как внутреннюю (для стека, глобальных переменных), т.к. записать в неё корректно 1 байт невозможно (пишется полуслово разом)?

Нет, не правильно!
там есть сигналы byte enable.

Go to the top of the page
 
+Quote Post
athlon64
сообщение May 16 2012, 06:36
Сообщение #19


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

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



Цитата(_Артём_ @ May 16 2012, 00:38) *
Код
#pragma location=0xFFFF0400
__no_init volatile char PORT1; /* PORT1 is located at address 0xFFFF0400 */

а, такой вариант определения переменных я пробовал. В принципе подойдёт, но всё же не хотелось бы вручную считать адреса для каждой глобальной структуры.

У меня проблема сейчас в том, что не удаётся корректно записать во внешнюю SRAM 8-битные данные.
Например, заполняю область с адреса 0x60000000 256ю байтами от 0 до 255:
Код
void MemTest(char *pMem)
{
  for (int i=0; i<256; i++)
    *(pMem+i) = i;
}

int main(void)
{
  Init();

  while (1)
  {
    MemTest((char*) (0x60000000));
  }
}

Смотрю в отладке, что записалось:
При записи 0 - записался байт 0x00 по адресу 0x60000001
При записи 1 - записался байт 0x01 по адресу 0x60000000
При записи 2 - записался байт 0x00 по адресу 0x60000003
При записи 3 - записался байт 0x03 по адресу 0x60000002
При записи 4 - записался байт 0x00 по адресу 0x60000005
При записи 5 - записался байт 0x05 по адресу 0x60000004
и так далее

Если заполнять память данными по 16-32 бит - данные пишутся верно.

Цитата(KRS @ May 16 2012, 01:13) *
Нет, не правильно!
там есть сигналы byte enable.

Тут конечно моя ошибка в том что, не посмотрел на подключение SRAM и настройку FSMC (плату разрабатывал, трассировал другой сотрудник).

Покурил Reference Manual по FSMC и Application Note AN2784.
Проверил сигналы NBL[1..0] - выставляются верно, выбирается по очереди сначала младший байт, потом старший. При записи 16-32битных значений - выбираются оба байта.
Посмотреть шину данных и адреса в данный момент проблематично на этой плате.

Код инициализации ExtSRAM и фрагмент схемы с подключением микросхемы памяти привожу (шины адреса и данных так развёрнуты для удобства трассировки sm.gif ).

Сообщение отредактировал athlon64 - May 16 2012, 06:28
Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  SystemInit_ExtMemCtl.txt ( 5.9 килобайт ) Кол-во скачиваний: 160
 


--------------------
Руслан
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 16 2012, 08:28
Сообщение #20


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

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



Похоже что ошибка найдена.
Конструктора развернули шину данных, а дороги выбора байта на запись поменять местами забыли. rolleyes.gif
Плата на перепайке линий BHE, BLE.

Сообщение отредактировал athlon64 - May 16 2012, 08:31


--------------------
Руслан
Go to the top of the page
 
+Quote Post
KRS
сообщение May 16 2012, 10:56
Сообщение #21


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

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



Цитата(athlon64 @ May 16 2012, 10:36) *
а, такой вариант определения переменных я пробовал. В принципе подойдёт, но всё же не хотелось бы вручную считать адреса для каждой глобальной структуры.

можно вместо адреса указать секцию
#pragma location = "EXT_SRAM"
можно еще --section использовать для переноса всех данных или кода целиком для файла(ов).
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 16 2012, 13:40
Сообщение #22


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

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



Перепаяли дорожки, запись байта теперь заработала. rolleyes.gif
Потестировал полчаса внешнюю SRAM (запись-чтение-проверка того что прочитано), всё ОК, ошибок нет.
Перенёс секцию readwrite в RAMext_region, стек оставил во внутренней SRAM. И заметил такой баг: постоянно пингуя контроллер (проект на FreeRTOS 6.1 + LwIP 1.3.2) некоторое время (10 секунд - 2 минуты) пинг нормальный, а дальше начинает расти и прекращается совсем, лишь изредка "простреливая" с временем 2000-3000 мс. Если размещать секцию readwrite во внутренней SRAM, то такого не наблюдается.
Подозреваю, что запарываются какие то структуры стека в ОЗУ.
Куда копать, кроме настроек таймингов FSMC? Завтра буду разбираться дальше.


--------------------
Руслан
Go to the top of the page
 
+Quote Post
KRS
сообщение May 16 2012, 19:10
Сообщение #23


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

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



Цитата(athlon64 @ May 16 2012, 17:40) *
Подозреваю, что запарываются какие то структуры стека в ОЗУ.
Куда копать, кроме настроек таймингов FSMC? Завтра буду разбираться дальше.

Вы бы для начала тест памяти сделали - что бы убедится что ОЗУ нормальное и настройки...
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 17 2012, 03:50
Сообщение #24


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

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



Цитата(KRS @ May 17 2012, 01:10) *
Вы бы для начала тест памяти сделали - что бы убедится что ОЗУ нормальное и настройки...

Погонял сегодня память в течении часа - 0 ошибок чтения/записи


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


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

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



Странно, конечно, но глючить начинает только обмен по ethernet, все остальные задачи работают нормально.

В течении дня никаких ошибок во время теста памяти не зафиксировано.
Может быть у LwIP есть какие то особенности при работе с внешней памятью?

Ещё заметил, пинг портится примерно так же, как портится после выхода из сессии отладки (без использования внешней памяти). Пока не выйдешь из отладки - всё ОК, или если не запускать отладку вообще. А после выхода из отладки, пинг сразу портится, в остальном контроллер продолжает работать. То же самое если поставить контроллер на паузу в отладке.
Не разбирался ещё почему, может быть изза нарушения обмена с с MICREL KS8995.

Сообщение отредактировал athlon64 - May 17 2012, 12:11
Эскизы прикрепленных изображений
Прикрепленное изображение
 


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

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

 


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


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