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

STM32F746 и внешняя SRAM

Здравствуйте.

 

Возникла непонятная ситуация. Проц STM32F746, к нему подключено внешнее статическое ОЗУ, 16 бит данных. Скелет программы сгенерен в CubeMX, кеш на команды и данные отключен.

Тест простой - сначала пишу во внешнюю RAM 12 штук 32-бит слов (используя memcpy) потом читаю в цикле по одному uint32_t. В зависимости от наличия, частоты и длительности прерываний (простой таймер и инкрементом переменной во внутреннем ОЗУ), паузы между записью и чтением, уровнем оптимизации кода при компиляции иногда происходит сбой - циклов записи на внешней шине всегда 12 а вот циклов чтения иногда проскакивает только 11 (отсутствует выдача сигналов CS и OE). Судя по всему аппаратура проца пропускает первый запрос на чтение, при этом результатом самого чтения оказывается значение, которое последним записывалось во внешнюю RAM (продублированные последние записываемые 16 бит). В зависимости от каких то шаманских действий частота сбоев может быть от 1-2 в секунду до 1-го за 7-8 часов. Пробовал собирать проект в IAR и Keil. Может будут у кого какие мысли по этому поводу?

 

Спасибо.

 

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


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

Судя по всему аппаратура проца пропускает первый запрос на чтение, при этом результатом самого чтения оказывается значение, которое последним записывалось во внешнюю RAM (продублированные последние записываемые 16 бит). В зависимости от каких то шаманских действий частота сбоев может быть от 1-2 в секунду до 1-го за 7-8 часов.

Почему "сбой"? Это же фича - кеширование, нет?

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


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

Почему "сбой"? Это же фича - кеширование, нет?

 

1. кеширование отключено

2. чтение происходит ошибочно, если, к примеру, последним в адрес base[11] было записано число 0x1234xxxx то выполненное сразу после этого чтение по адресу base[0] выдаст 0x12341234, хотя по этому адресу лежит совсем другое значение (по останову в отладчике читается правильное). При этом сам цикл чтения на шине будет отсутствовать.

т.е. бага не просто в отсутствии цикла чтения на шине а в ошибочном результате самого чтения.

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


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

В еррате на STM32F42x есть вот такое:

Corruption of data read from the FMC

 

Description

 

When the FMC is used as stack, heap or variable data, an interrupt occurring during a CPU

read access to the FMC may results in read data corruption or hard fault exception. This

problem does not occur when read accesses are performed by another master or when

FMC accesses are done when the interrupts are disabled.

 

Workaround

 

Two workarounds can be applied:

• Do not use the FMC as stack or heap, and make sure CPU read accesses to the FMC

are performed while interrupts are disabled

• Use only DMAs to perform read accesses to the FMC.

This limitation is present only in revision “A” devices. It is fixed in revision “Y”, “1” and “3”.

Теоретически могли по запарке перетащить в новый кристалл старую багу. Ну или новую багу сделали.

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


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

В еррате на STM32F42x есть вот такое:

Теоретически могли по запарке перетащить в новый кристалл старую багу. Ну или новую багу сделали.

О, спасибо! Коллега рядом как раз на подобное наткнулся, когда другая бага переехала из F4xx в F7xx, была в еррате на 4xx но отсутствовала в еррате на 7xx.

Действительно, если прерывания запрещать то все читается нормально.

 

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


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

О! Тогда сразу видно, с какой версии кристалла можно его применять. :rolleyes:

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


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

В полях mpu для внешней памяти включить совместное использование. Тогда шина будет принудительно морозить cpu и dma на операциях чтения/записи до завершения цикла.

Актуально для М4-7.

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


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

Здравствуйте! Раз уж разговор о памяти, чтоб не плодить тем, задам вопрос здесть, если можно. Для платки STM32F746-DISCOVERY пытаюсь сосдать проект в Keil5. Использую мастер. При линковке получил ошибку:

 .\Objects\F7dyscovery.axf: Error: L6982E: AT section glcd_746g_discovery.o(.ARM.__AT_0xC0000000) with base 0xc0000000 limit 0xc003fc00 overlaps address range with AT section lcdconf.o(.ARM.__AT_0xC0000000) with base 0xc0000000 limit 0xc005fa00.
Not enough information to list image symbols.

. Понятно, что связано с памятью. Что-то не так. Прошу подсказать. Спасибо.

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


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

Понятно, что связано с памятью. Что-то не так. Прошу подсказать. Спасибо.

Вероятно у Вас заданы две секции с одинаковым абсолютным адресом 0xc0000000. О чём и говорит компоновщик.

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


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

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

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

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

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

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

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

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

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

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