Salamander 2 24 января, 2020 Опубликовано 24 января, 2020 (изменено) · Жалоба Добрый день. Настраиваю связку MT48LC4M32B2P-6A + stm32f7 Первоначально память завелась сразу, я написал коротенький код, заполняющий буфер, копирующий из буфера в sdram, а затем читающий из сдрам в другой буфер. Сверил оба буфера, все ОК. И успокоился. После этого я много чего настраивал, менял, возможно поменял что-то, не касающееся сдрам напрямую, но влияющее га ее работу. А может быть и память накрылась Короче, когда я снова попытался поработать с памятью - данных при чтении не получил. Отладка показала, что генерируется прерывание HardFault на строке, которая пишет в память по определенному адресу. Скажите, этот факт, он как то может свидетельствовать о том, что проблема га в микросхеме памяти, а в коде или в настройках контроллера? Я к тому, что, насколько я представляю себе принцип работы sdram, у контроллера нет обратной связи с микросхемой при записи, контроллер дрыгает ногами и не получает от микросхемы какого либо подтверждения исполнения. Другими словами, если микросхему вообще выпаять, или если она в силу неисправности не будет отвечать, то к зависанию в микроконтроллере это не приведет, программа после попытки записи двинется дальше, а при чтении получит нули, правильно? или возможны варианты? Аналогичной микросхемы, чтобы путем перепаивания, проверить, у меня нет, код весь излазил, не пойму в чем причина. Изменено 24 января, 2020 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 50 minutes ago, Salamander said: если микросхему вообще выпаять, или если она в силу неисправности не будет отвечать, то к зависанию в микроконтроллере это не приведет, программа после попытки записи двинется дальше, а при чтении получит нули, правильно? Правильно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба Ок, а что тогда может вызывать зависание на, строке Quote #define sdram_base_addr 0xC0000000; *(__IO uint32_t*) (sdram_base_addr) = 0x000000ff; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба Возможно физическое повреждение чипа памяти. В частности серия MT имеет очень нежные контакты, +4в уже дохнут. Мой чип памяти на отладке сдох от болтающегося провода дежурки +5в. 2 hours ago, Salamander said: возможно поменял что-то Для таких ситуаций существует система контроля версий, откатиться назад - посмотреть изменения. Для программного кода есть несколько бесплатных программ, лично мне нравится черепаха TortoiseHg. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 7 minutes ago, AVI-crak said: Возможно физическое повреждение чипа памяти. В частности серия MT имеет очень нежные контакты, +4в уже дохнут. Мой чип памяти на отладке сдох от болтающегося провода дежурки +5в. И как это приводит к зависанию контррллера? Он ведь, в конечном счете дрыгает ногами. Во время записи обратной информации не получает. Даже ноги свои в режим чтения не переводит. В общем, наверное я сделаю вот что.... отключу fmc совсем. И попробую записать. Sdram, конечно, в этом случае не будет влиять, но вот другой вопрос - не свихнется ли контроллер от попытки обратиться по несуществующему адресу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 1 hour ago, Salamander said: Ок, а что тогда может вызывать зависание на, строке Hard Fault - это не зависание. 17 minutes ago, Salamander said: но вот другой вопрос - не свихнется ли контроллер от попытки обратиться по несуществующему адресу? Внезапно, получите тот же Hard Fault. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба А если не отключать fmc, но не инициализировать сдрам, будет фаульт? 18 minutes ago, aaarrr said: Hard Fault - это не зависание. Ну допустим, что может его вызвать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 16 minutes ago, Salamander said: Ну допустим, что может его вызвать? Например, чтение или запись по запрещённому адресу (запись во флеш микроконтроллера или выполнение кода из IO-памяти). Или обращение по невыровненному адресу. Тут лучше читать первоисточники. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 19 minutes ago, Salamander said: что может его вызвать? Обращение к выключенной периферии, обращение по несуществующему адресу и т.д. и т.п. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
golf2109 0 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба по какому адресу расположенo начало SDRAM? C0000000? ее размер? каково содержимое GUIConf.c ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 17 minutes ago, haker_fox said: Или обращение по невыровненному адресу. А вот с этого момента поподробнее. Я, кстати, когда все работало, игрался с шириной шины (ставил в настройках 16 бит), с форматом записываемых данных (писал 32 битные данные) и у меня не всегда получалось их потом правильно прочесть. Жаль, не проверял тогда - есть ли hard fault. Ответьте на ряд вопросов по адресации sdram. 1. Влияет ли как-то ширина шины sdram, на то, как я буду читать из нее данные программным кодом, обращаясь как единому адресному пространству? Для примера у меня 32 битная сдрам. Начальный адрес 0хc0000000. Я хочу записать 4 байта. Эти 4 байта влезут в одну ячейку памяти, по одному ее физическому адресу. Но в адресное пространство эти байты будут записаны по адресам 0хс000000-0хс0000003, так? А если я запишу 32 битное слово, то в едином адресном пространстве оно так же будет располагаться по адресам 0-3? А если я захочу прочитать 32 битное слово, которое я раньше записал по адресу 0хс0000000, то контроллер возьмет эти данные из одной ячейки микросхемы сдрам, спроецирует их в адрсное пространство по адресам 0-3, а мне выдаст в виде склеенных четырех байт . Если у меня 8битная память, то будет то же самое - в едином адресном пространстве по каждому адресу записано 8 бит, а захоти я прочитать или записать несколько 32 битных слов, мне просто нужно обращаться к адресам, кратным 4м? Просто скажите, правильно ли я понял механизм? 10 minutes ago, golf2109 said: какому адресу расположенo начало SDRAM? C0000000? ее размер? 0xc0000000, размер памяти 1м х 32 х 4 банка ГУИ тут ни при чем, он не установлен, я ручками пишу и читаю. Еще вопрос - особо волнует - в настройках сдрам можно выбрать ширину 32 бит. При этом есть еще одна опция byte enable. Она можеть быть отключена, может быть равна не только 32 бита, но и 16 бит? Как это понимать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 16 минут назад, Salamander сказал: Я, кстати, когда все работало, игрался с шириной шины (ставил в настройках 16 бит) Зачем??? Вы не знаете как у Вас чип SDRAM подключен?? Может стоит лучше найти принципиальную схему и посмотреть на неё, а не "играться"? 16 минут назад, Salamander сказал: Если у меня 8битная память, то будет то же самое - в едином адресном пространстве по каждому адресу записано 8 бит, а захоти я прочитать или записать несколько 32 битных слов, мне просто нужно обращаться к адресам, кратным 4м? Если всё проинициализировано правильно, то обращаться можете ровно также как к внутренней ОЗУ. 16 минут назад, Salamander сказал: Еще вопрос - особо волнует - в настройках сдрам можно выбрать ширину 32 бит. При этом есть еще одна опция byte enable. Она можеть быть отключена, может быть равна не только 32 бита, но и 16 бит? Как это понимать? Не понятно о каких настройках речь. Видимо о калокубовских. Тогда скорей всего мануал на FMC даже не открывали. Советую открыть и прочитать - многое станет ясно. 1 час назад, Salamander сказал: А если не отключать fmc, но не инициализировать сдрам, будет фаульт? Ну допустим, что может его вызвать? Видимо опять-же нужно открыть мануал на ядро и прочитать описание регистров, описывающих причину fault-а. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 24 января, 2020 Опубликовано 24 января, 2020 (изменено) · Жалоба 41 minutes ago, jcxz said: Зачем??? Вы не знаете как у Вас чип SDRAM подключен?? Может стоит лучше найти принципиальную схему и посмотреть на неё, а не "играться" Так принципиальную схему я и разрабатывал. У меня 32 бита. Все подключены. Когда спаял плату, корректно прочесть данные не получилось. Я достал из ящика плату дискавери. Посмотрел схему. На схеме 32 битная микросхема, у которой задействовано лишь 16 линий данных, остальные резистором притянуты к земле кажется. И в кубе пример для этой платы тоже настроен на 16 бит. Сделал я проект, попробовал пописать в память на плате - ура, работает. Взял свою 32 битную плату, внушил ей, что на ней 16 битная память - ура, работает. Разбирательства почему у меня не работало на 32 битах, я оставил на потом. "Потом" настало вчера, но, как указано в начале темы, я или что-то ковырнул, не подумав или спалил микросхему. О чем собственно и спросил, создав тему, мол может ли возникать хардфаульт при неисправной микросхеме. Из двух возможных вариантов ответа в теме прозвучало два. Изменено 24 января, 2020 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 10 minutes ago, Salamander said: может ли возникать хардфаульт при неисправной микросхеме При простом чтении-записи не может, ищите проблемы в софте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 2 hours ago, Salamander said: А вот с этого момента поподробнее. Здесь перечислены команды, которые допускают невыровненный доступ. Остальные команды доступа к памяти вызовут UsageFault, который будет эскалирован до HardFault. Это при условии, что USageFault не включен. 2 hours ago, Salamander said: Влияет ли как-то ширина шины sdram, Не влияет. Вы конфигурируете EMC в соответствии со схемой подключения памяти. 2 hours ago, Salamander said: оно так же будет располагаться по адресам 0-3? Конечно, другого не дано. 2 hours ago, Salamander said: несколько 32 битных слов, мне просто нужно обращаться к адресам, кратным 4м? Если вы используете высокоуровневый язык (Си и т.п.), то вас нюансы железа уже не должны заботить. Компилятор сгенерирует нужные команды, а ЕМС, при условии, что он правильно настроен, доделает всю работу. 1 hour ago, Salamander said: создав тему, мол может ли возникать хардфаульт при неисправной микросхеме. Я думаю, что при неисправном железе, может быть всё, что угодно... Например, вы в памяти можете хранить адрес переменной (указатель в Си). И если микросхема вам выдала битый указатель, и МК пытается считать данные с Марса, то конечно возникнет хардфолт. 1 hour ago, aaarrr said: При простом чтении-записи не может, ищите проблемы в софте. +1. Правда мы не знаем, как автор тестирует свою микросхему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться