Jump to content

    

STM32F746 и внешняя SRAM

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

 

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

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

 

Спасибо.

 

Share this post


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

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

Share this post


Link to post
Share on other sites
Почему "сбой"? Это же фича - кеширование, нет?

 

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

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

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

Share this post


Link to post
Share on other sites

В еррате на 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”.

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

Share this post


Link to post
Share on other sites
В еррате на STM32F42x есть вот такое:

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

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Здравствуйте! Раз уж разговор о памяти, чтоб не плодить тем, задам вопрос здесть, если можно. Для платки 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.

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

Share this post


Link to post
Share on other sites
Понятно, что связано с памятью. Что-то не так. Прошу подсказать. Спасибо.

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

Share this post


Link to post
Share on other sites

Да. Два конфига одновременно.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this