Почему я не могу полностью перевести Zynq-7000 на низкую мощность?

#arm #xilinx #zynq

Вопрос:

Почему любая из следующих записей в регистре приводит к остановке моей программы?

  • slcr.DDR_CLK_CTRL[DDR_2XCLKACT] = 0
  • slcr.DDR_CLK_CTRL[DDR_3XCLKACT] = 0
  • slcr.DDR_PLL_CTRL[PLL_BYPASS_FORCE] = 1
  • slcr.DDR_PLL_CTRL[PLL_PWRDWN] = 1

Я новичок во встроенной разработке и пытаюсь реализовать некоторый код на языке C с голыми костями, чтобы перевести zynq 7000 в спящий режим на странице 674 Технического справочного руководства

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

Я использую встроенную кнопку моей платы разработки Cora Z7-07S в качестве источника прерываний. Обработчик прерывания при нажатии кнопки вниз выполняет функцию выключения питания и выполняет функцию пробуждения при нажатии кнопки вверх.

Я следовал этому уроку (видео здесь) на своем Cora Z7-07, чтобы заставить работать прерывание. Создает ли использование GPIO AXI в качестве источника прерываний некоторую зависимость от DDR? Есть ли способ настроить PL, чтобы избежать этого и при этом разрешить прерывание GPIO?

Комментарии:

1. Случайно, ваши инструкции по отключению DDR находятся в памяти DDR ?

2. @user3124812 это может все объяснить. как бы я узнал, находятся ли мои инструкции в памяти DDR? Я явно не включал их в DDR, но я понимаю, что это не значит, что их нет. Есть ли способ гарантировать, что инструкции используют альтернативную память, которая все еще работает?

3. конечно, проверив физический адрес памяти, содержащий эти инструкции. Если я правильно помню, Zynq7000 имеет 1 МБ статической памяти, используемой загрузчиком первого этапа (FSBL). Эта память используется в самом начале для инициализации периферийных устройств и DDR. Поместите туда код «засыпания» и выполните его.

4. @user3124812 Я попытался создать новый скрипт компоновщика и указать все на ps7_ram_0 вместо ps7_ddr_0 по умолчанию, затем перестроил, но получил то же поведение. Есть ли хороший учебник/пример, подходящий для начинающих, который демонстрирует, как управлять и проверять места хранения кода и данных в памяти?

5. @user3124812 Я подтвердил, пройдя через отладчик, что мои изменения в сценарии компоновщика позволили коду пройти этапы DDR, чтобы завершить процедуру полного сна (раньше этого не было). Проблема теперь в том, что он не реагирует на прерывание GPIO для пробуждения.