ADSP-BF538: динамическое управление питанием Печать
Добавил(а) microsin   

В этой статье приведен перевод документации [1], касающейся динамического управления питанием (dynamic power management, DPM) процессора Blackfin ADSP-BF538. Аппаратура DPM предоставляет следующие возможности:

• Тактирование ядра и периферийных устройств.
• PLL, блок фазовой подстройки частоты (PLL аббревиатура от Phase-locked loop), обеспечивающий умножение частоты кварцевого генератора.
• Контроллер DPM (DMPC).
• Рабочие режимы процессора, определяющие энергопотребление.
• Управление напряжением питания.

[Тактирование]

Входная тактовая частота процессора (ножка CLKIN), предоставляет необходимую частоту сигнала, которая используется в встроенном в процессор блоке умножения частоты (модуль фазовой подстройки частоты, phase-locked loop или сокращенно PLL). Во время нормальной работы пользователь программирует PLL коэффициентом умножения для частоты CLKIN. Результирующий умноженный по частоте сигнал получается на выходе управляемого напряжением генератора (voltage controlled oscillator, VCO). Затем частота VCO делится на запрограммированный пользователем коэффициент, после чего образуется тактовая частота ядра процессора (core clock, CCLK).

Еще один программируемый пользователем коэффициент задает деление частоты VCO для генерации системной тактовой частоты (system clock, SCLK, она же тактовая частота шины). Сигнал SCLK тактирует работу шины доступа к периферийным устройствам (peripheral access bus, PAB), шины прямого доступа к памяти (DMA bus, DAB), внешней шины адреса (external address bus, EAB), и блока интерфейса внешней шины (external bus interface unit, EBIU).

Эти шины работают на частоте PLL, поделенной на коэффициент 1..15 (так называемый домен SCLK). С помощью параметра SSEL в регистре делителя PLL (PLL divide register) выбирается частота делителя, чтобы эти шины могли работать на максимальной частоте SCLK (которая указана в даташите на процессор ADSP-BF538/ADSP-BF538F) или ниже.

Чтобы оптимизировать соотношение производительности и рассеиваемой мощности, процессор позволяет динамически поменять частоты ядра и системной шины (CCLK и SCLK), с грубой подстройкой. Для точной подстройки нужно также поменять тактовую частоту PLL.

PLL и управление тактированием. Чтобы предоставить генерируемые тактовые частоты для ядра и системной шины, процессор использует PLL под управлением программируемой машины состояний.

PLL используется в широком диапазоне приложений. Использование этой технологии позволяет объединить во встраиваемых и переносных устройствах низкую стоимость аппаратуры в сочетании с высоким быстродействием, причем не теряется гибкость управления энергопотреблением процессора. Различные приложения требуют применения различных частот тактирования. Входной частотой для PLL обычно служит сигнал от кварцевого генератора.

PLL взаимодействует с контроллером динамического управления питанием (dynamic power management controller, DPMC), чтобы предоставить функции управления питанием для процессора. Подробнее про DPMC см. раздел "Контроллер DPM (DPMC)".

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

На рисунке 8-1 показана концептуальная модель схемотехники PLL, конфигурация входов, и получающиеся выходы. На рисунке VCO это промежуточная тактовая частота, из которой получается частота ядра CCLK и частота системной шины SCLK.

ADSP BF538 PLL block diagram

Рис. 8-1. Блок-диаграмма PLL.

Коэффициенты умножения PLL. Регистр управления PLL (PLL control register, PLL_CTL) обеспечивает управление работой PLL. Подробнее про регистр PLL_CTL см. врезку "PLL_CTL".

Бит деления частоты (divide frequency, DF) и поле коэффициента умножения (multiplier select, MSEL[5:0]) конфигурируют различные делители тактов PLL:

• DF разрешает работу входного делителя (включает деление на 2).
• MSEL[5:0] управляет делителями обратной связи PLL.

Значение MSEL после сброса равно 0xA. Это значение может быть перепрограммировано кодом запуска и загрузки (startup).

В таблице 8-1 показаны коэффициенты умножения VCO для различных настроек MSEL и DF.

Таблица 8-1. Соответствие значений MSEL и коэффициентов умножения.

MSEL[5:0] Частота VCO
DF = 0 DF = 1
0 x 64 x 32
1 x 1 x 0.5
2 x 2 x 1
N = 3..62 x N x 0.5N
63 x 63 x 31.5

Как показано в таблице, различные комбинации MSEL[5:0] и DF могут давать одинаковые частоты VCO. Для имеющегося приложения одна из комбинаций может дать меньшее энергопотребление или удовлетворить максимальной частоте VCO. В обычных условиях установка DF в 1 обычно дает уменьшение энергопотребления. См. даташит на процессор ADSP-BF538/ADSP-BF538F для получения значений максимальных и минимальных частот для CLKIN, CCLK и VCO.

Управление соотношением частот CCLK/SCLK. В таблице 8-2 описана программируемая взаимосвязь между частотой VCO и частотой ядра CCLK. Таблица 8-3 показывает взаимосвязь между частотой VCO и частотой шины SCLK. Обратите внимание, что соотношение делителей должно быть выбрано для ограничения частоты SCLK до предела, допустимого по даташиту на процессор ADSP-BF538/ADSP-BF538F. Частота SCLK обеспечивает синхронность всей логики периферийных устройств на системном уровне.

Биты управления коэффициентами деления CSEL и SSEL находятся в регистре управления делителем PLL (PLL divide register, PLL_DIV). Информацию по этому регистру см. во врезке "PLL_DIV". В приложении B документации [1] "System MMR Assignments" дана привязка регистров к адресному пространству процессора.

Значение сброса CSEL[1:0] равно 0x0 (/1), и значение сброса для SSEL[3:0] равно 0x5. Эти значения можно перепрограммировать в момент старта кода загрузки (startup).

Путем записи соответствующего значения в PLL_DIV можно динамически поменять значения CSEL и SSEL. Имейте в виду, что коэффициент деления для CCLK не может быть больше коэффициента деления для SCLK (т. е. тактовая частота ядра CCLK должна быть больше или равна частоте системной шины SCLK. Обычно частота ядра в несколько раз больше частоты системной шины). Если регистр PLL_DIV был запрограммирован недопустимыми значениями, делитель SCLK автоматически увеличится так, чтобы он был больше или равен делителю тактовой частоты ядра.

Регистр PLL_DIV может быть запрограммирован в любое время для изменения значений коэффициентов деления CCLK и SCLK, без необходимости ввода процессора в состояние ожидания (idle).

Таблица 8-2. Коэффициент деления для тактовой частоты ядра.

CSEL[1:0]
Соотношение
VCO/CCLK
Примеры соотношений частот (МГц)
VCO CCLK
00 1 200 300
01 2 600 300
10 4 600 150
11 8 400 50

Пока управляющие биты MSEL и DF в регистре PLL_CTL остаются неизменными, PLL находится в режиме захвата.

Таблица 8-3. Коэффициент деления для тактовой частоты системной шины.

SSEL[3:0]
Соотношение
VCO/SCLK
Примеры соотношений частот (МГц)
VCO SCLK
0000 Зарезервировано - -
0001 1 100 100
0010 2 200 100
0011 3 400 133
0100 4 500 125
0101 5 600 120
0110 6 600 100
N = 7..15 N 600 600/N

Если изменяется тактовая частота шины записью нового значения поля SSEL в регистре PLL_DIV, позаботьтесь о том, чтобы на разрешенных в работу периферийных устройствах не происходили ответственные процессы передачи данных. В противном случае данные могут быть потеряны из-за процесса изменения частоты SCLK.

[Регистры PLL]

Интерфейс пользователя для программирования PLL состоит из четырех MMR-регистров:

• Регистр делителя PLL (PLL_DIV)
• Регистр управления PLL (PLL_CTL)
• Регистр состояния PLL (PLL_STAT)
• Регистр счетчика захвата PLL (PLL_LOCKCNT)

Все эти 4 регистра MMR являются 16-битными, и к ним должен осуществляться доступ через 16-битные операции чтения/записи.

Регистр управления делителями PLL (PLL divide register, PLL_DIV) управляет делением выходной частоты PLL для создания тактовой частоты ядра (CCLK) и тактовой частоты системной шины (SCLK). Эти значения могут быть изменены независимо, чтобы уменьшить энергопотребление без изменения состояния захвата PLL. Единственными ограничениями для изменения значений CCLK и SCLK это условие, что частота CCLK должна быть равна или больше SCLK, и частота SCLK должна попадать в допустимый диапазон по даташиту на процессор ADSP-BF538/ADSP-BF538F. Если запрограммированные значения коэффициентов деления для получения CCLK и SCLK не удовлетворяют этим условиям, то значение частоты SCLK автоматически подстраивается так, чтобы оказаться меньше или равной частоты CCLK. Рис. 8-2 показывает биты регистра PLL_DIV.

ADSP BF538 PLL DIV

Рис. 8-2. PLL Divide Register (PLL_DIV).

Регистр управления PLL (PLL control register, PLL_CTL) программирует функционирование PLL (см. рис. 8-3). Имейте в виду, что изменения в регистре PLL_CTL не вступают в силу немедленно (из-за того, что требуется некоторое время для захвата PLL). Обычно сначала регистр PLL_CTL программируется новыми значениями, и потом должна быть выполнена специальная последовательность программирования PLL, чтобы изменения вступили в силу. Подробнее см. "Последовательность программирования PLL".

ADSP BF538 PLL CTL

Рис. 8-3. PLL Control Register (PLL_CTL).

Для управления PLL используются следующие поля в регистре PLL_CTL:

MSEL[5:0]. Поле выбора множителя (multiplier select, MSEL) задает множитель, прикладываемый к входной частоту для тактирования VCO (умножение CLKIN для получения VCO).

BYPASS. Этот бит используется для пропуска (bypass) системы PLL. Когда установлен бит BYPASS, CLKIN передается напрямую в ядро и на тактирование периферийных устройств.

OUTDELAY[1:0]. Эти биты используются для подстройки, когда выходные сигналы для подключения внешней памяти (сигналы адреса, записи данных и управления) будут изменяться по отношению к CLKOUT. Значение 00 кодирует нормальную задержку установки выходов. Выходные сигналы памяти могут иметь добавленную к нормальной задержку 200 пс или 400 пс, или могут иметь уменьшенную задержку на 200 пс меньше нормальной. Значение по умолчанию для поля OUTDELAY равно 01, что выбирает задержку 400 пс, добавленную к номинальной выходной задержке.

00: номинальная задержка вызодных сигналов, подаваемых на SDRAM
01: + ~400 пс к номинальной задержке
10: + ~200 пс к номинальной задержке
11: - ~200 пс от номинальной задержки

INDELAY[1:0]. Эти биты используются для подстройки момента времени, когда входные сигналы для подключения к внешней памяти (чтение данных) будут оцифрованы относительно CLKOUT. Значение 00 поля INDELAY кодирует выбор номинальной задержки выборки. Точка выборки входных сигналов может быть либо дополнительно задержана по отношению к номинальной задержке выборки на 200 пс, либо для момента выборки может быть уменьшена задержка на 200 пс или 400 пс по отношению к номинальной задержке. Значение по умолчанию для поля INDELAY равно 00, что определяет выбор номинальной задержки выборки.

00: номинальная задержка входных сигналов, приходящих от SDRAM (данные)
01: + ~200 пс к номинальной задержке
10: - ~200 пс от номинальной задержки
11: - ~400 пс от номинальной задержки

PDWN. Это бит выключения (power down, PDWN), который используется, чтобы перевести процессор в режим глубокого сна (deep sleep operating mode). Подробнее про рабочие режимы см. секцию "Рабочие режимы".

STOPCK. Бит остановки тактов (stop clock, STOPCK) используется для разрешения/запрета тактовой частоты ядра CCLK.

PLL_OFF. Этот бит используется для разрешения/запрета питания для PLL.

DF. Бит деления частоты (divide frequency, DF) управляет входным делителем тактовой частоты PLL, который определяет, какую входную частоту получит блок PLL, CLKIN или CLKIN/2.

Регистр состояния PLL (PLL status register, PLL_STAT) показывает рабочий режим PLL и процессора (см. рис. 8-4). Подробнее см. секцию "Рабочие режимы".

ADSP BF538 PLL STAT

Рис. 8-4. PLL Status Register (PLL_STAT).

В регистре PLL_STAT используются следующие поля:

PLL_LOCKED. Это поле установится в 1, когда внутренний счетчик захвата PLL (PLL lock counter) инкрементируется до значения, установленного в регистре счетчика захвата PLL (PLL lock count register, PLL_LOCKCNT). Подробности см. во врезке PLL_LOCKCNT.

ACTIVE_PLLDISABLED. Это поле устанавливается в 1, когда процессор находится в активном рабочем режиме с выключенным блоком PLL.

FULL_ON. Это поле установлено в 1, когда процессор находится в рабочем режиме полного включения (full on).

ACTIVE_PLLENABLED. Это поле установлено в 1, когда процессор находится в активном рабочем режиме, и блок PLL получает питание.

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

Регистр счетчика захвата PLL (PLL lock count register, PLL_LOCKCNT) определяет количество тактов SCLK, которые должны пройти до того, как процессор установит бит PLL_LOCKED в регистре PLL_STAT. Когда выполняется последовательность программирования PLL, внутренний счетчик захвата PLL начинает последовательное инкрементирование после выполнения инструкции IDLE. Счетчик захвата увеличивается на 1 за каждый такт SCLK. Когда счетчик захвата дойдет до величины, заданной в регистре PLL_LOCKCNT, бит PLL_LOCKED установится.

См. даташит на процессор ADSP-BF538/ADSP-BF538F для получения дополнительной информации по времени стабилизации PLL и значениям для программирования этого регистра. Подробнее про режимы процессора см. секцию "Рабочие режимы". Подробнее про последовательность программирования PLL см. секцию "Последовательность программирования PLL".

ADSP BF538 PLL LOCKCNT

Рис. 8-5. PLL Lock Count Register (PLL_LOCKCNT).

[Онлайн-калькулятор тактовых частот]

Ниже приведен удобный калькулятор, который позволяет выбрать значение полей регистров PLL_DIV и PLL_CTL, и подобрать тактовые частоты процессора CCLK и системной шины SCLK.

Примечание: поля регистров PLL_DIV и PLL_CTL заполнены значениями по умолчанию, которые они получают при сбросе процессора.

Частота кварца: CLKIN =  МГц  
Делитель CLKIN: DF =  (управление делителем на входе PLL)  
Управление множителем CLKIN: MSEL =  (для получения VCO)  
Управление делителем VCO: CSEL =  (для получения CCLK)  
Управление делителем VCO: SSEL =  (для получения SCLK)  
Пропуск PLL: BYPASS =   
Задержка выходных сигналов, подаваемых на SDRAM OUTDELAY =   
Задержка данных от SDRAM INDELAY =   
     
  Частота VCO: МГц  
  Частота CCLK: МГц  
  Частота SCLK: МГц  
  PLL_DIV:  
  PLL_CTL:  

[Контроллер DPM (DMPC)]

Контроллер динамического управления питанием (dynamic power management controller, DPMC) работает совместно с PLL, позволяя пользователю динамически управлять скоростью работы процессора и его энергопотреблением. DPMC предоставляет следующие возможности для этих целей:

• Несколько рабочих режимов – процессор может работать в четырех рабочих режимах, у каждого из которых свои характеристики по скорости и профилям рассеиваемой мощности. Подробнее см. секцию "Рабочие режимы".

• Тактирование периферийных устройств – тактовый сигнал для каждого устройства будет автоматически отключен, когда запрещается работа периферийного устройства.

• Управление напряжением – процессор предоставляет встроенный в кристалл импульсный контроллер регулятора, который, с несколькими внешними добавочными компонентами, может генерировать внутренние уровни напряжения питания, получая питание от внешнего источника питания Vdd (VDDEXT).

В зависимости от потребностей системы, напряжение питания может быть уменьшено (программно!), чтобы экономить питание. Подробнее см. врезку VR_CTL.

Рабочие режимы. Процессор работает в 4 рабочих режимах, у каждого из которых есть уникальное сочетание быстродействия и экономии питания. В таблице 8-4 суммарно показаны рабочие характеристики каждого режима.

Таблица 8-4. Рабочие характеристики режимов процессора ADSP-BF538/ADSP-BF538F.

Режим
Экономия
питания
PLL
CCLK
SCLK
Доступ DMA
Включено Bypass
Full On - да нет разрешено разрешено память L1
Active средняя да1 да разрешено разрешено память L1
Sleep высокая да нет запрещено разрешено -
Deep Sleep максимальная нет - запрещено запрещено -

Примечание 1: в этом режиме PLL также может быть запрещен.

Состояния контроллера DPMC. Состояния управления питанием это синонимы состояния управления PLL. Состояние DPMC/PLL можно определить чтением регистра статуса PLL (PLL status register, см. врезку PLL_STAT). Во всех режимах, кроме sleep и deep sleep, ядро может либо выполнять инструкции, либо находиться у состоянии приостановки ядра (Idle). Если ядро находится в состоянии Idle, то оно может быть разбужено.

Во всех режимах, кроме active, частота SCLK определяется коэффициентом деления частоты VCO, записанным в поле SSEL регистра PLL_DIV. В режиме sleep, несмотря на то, что тактирование ядра запрещено, SCLK продолжает поступать с частотой, заданной в SSEL.

В последующих секциях состояния DPMC/PLL описаны более подробно, поскольку они касаются функций контроллера DPMC.

Full On. Режим Full on дает максимальное быстродействие. В этом режиме блок PLL разрешен и его работа не пропускается (not bypassed). Режим Full on это нормальное состояние процессора для выполнения кода, когда процессор и все его периферийные устройства работают на полной скорости. Доступ DMA может работать с памятью уровня L1. Из режима full on процессор может перейти напрямую в режимы active, sleep или deep sleep, как это показано на рис. 8-6.

Active. В режиме active блок PLL разрешен, но его работа пропущена (bypassed). По этой причине и тактовая частота ядра процессора (CCLK), и тактовая частота системной шины (SCLK) обе равны входной тактовой частоте (CLKIN). Доступ DMA возможен к правильно сконфигурированной памяти L1.

В режиме active можно не только пропускать PLL (bypass), но также запретить PLL. Если PLL запрещен, то он должен быть заново разрешен перед переходом в режимы full on или sleep.

Из режима active процессор может напрямую перейти в режим full on, sleep или deep sleep (см. рис. 8-6).

Sleep. Режим Sleep значительно уменьшает рассеивание мощности, потому что ядро процессора приостанавливается (idle). В этом режиме тактовая частота CCLK запрещена, однако частота SCLK продолжает поступать на скорости, определенной установками битов MSEL и SSEL. Поскольку CCLK запрещена, то доступ DMA в режиме sleep возможен только к внешней памяти. Из режима sleep событие пробуждения (wake-up event) приводит к переходу процессора в один из этих режимов:

• Active, если установлен бит BYPASS в регистре PLL_CTL.
• Full on, если бит BYPASS сброшен.

Процессор возобновит выполнение кода с места, обозначенного программным счетчиком, которое осталось в нем сразу перед входом в режим sleep.

Бит STOPCK не является битом состояния, так что он остается не измененным со стороны аппаратуры, когда происходит пробуждение (wakeup). Программа должна явно сбросить бит STOPCK следующей записью в регистр PLL_CTL, чтобы избежать обратного входа в режим sleep.

Deep Sleep. Режим Deep sleep позволяет достичь максимального снижения потребления энергии путем запрета PLL, CCLK и SCLK. В этом режиме запрещены ядро процессора и все периферийные устройства, кроме часов реального времени (real-time clock, RTC). В этом режиме DMA не поддерживается.

Из режима Deep sleep можно выйти только по событию прерывания от RTC, или от события аппаратного сброса. Прерывание RTC приводит к переходу процессора в режим active; аппаратный сброс инициирует последовательность аппаратного сброса. Для дополнительной информации об аппаратном сбросе см. раздел "Hardware Reset" [1].

Имейте в виду, что прерывание RTC в режиме deep sleep автоматически сбрасывает некоторые поля в регистре управления PLL (PLL control register, PLL_CTL). См. таблицу 8-5.

Когда процессор находится в режиме deep sleep, тактирование SDRAM выключается. Перед входом в режим deep sleep, программное обеспечение должно гарантировать, что важная информация, находящаяся в памяти SDRAM, была сохранена в энергонезависимой памяти.

Таблица 8-5. Значения в регистре PLL_CTL после прерывания RTC Wake-up.

Поле
Значение
PLL_OFF 0
STOPCK 0
PDWN 0
BYPASS 1

Hibernate State. Это состояние с самым низким возможным рассеиванием мощности, оно позволяет включить внутреннее питание (VDDINT), с сохранением питания для узлов ввода вывода (I/O supply, VDDEXT). Несмотря на то, что это состояние не является рабочим режимом как таковым, его все-таки стоит рассмотреть в контексте всех рабочих режимов, описанных ранее (см. рис. 8-6). Поскольку функция Hibernate связана со встроенным контроллером импульсного регулятора напряжения, это подробнее обсуждается в разделе "Выключение ядра (состояние Hibernate)".

[Переходы между рабочими режимами]

Рис. 8-6 графически иллюстрирует рабочие режимы и переходы между ними. На диаграмме эллипсы представляют рабочие режимы. Стрелки между эллипсами показывают допустимые переходы для входа в каждый режим и выхода из него.

ADSP BF538 Operating Mode Transitions

Рис. 8-6. Переходы между рабочими режимами.

Текст возле каждой стрелки перехода показывает поля в регистре управления PLL (PLL_CTL), которые должны быть изменены, чтобы произошел переход. Например, переход из режима full on в режим sleep показывает, что бит STOPCK должен быть установлен в 1 и бит PDWN должен быть сброшен в 0. Информацию по поводу того, как эффективно осуществить переходы между режимами, см. в секции "Программирование переходов между рабочими режимами".

В дополнение к переходам между рабочими режимами, показанными на рис. 8-6, PLL может быть модифицирован, когда процессор работает в режиме active. Питание PLL может быть включено и выключено, и может быть запрограммированы новая входная частота для VCO (CLKIN для VCO) и коэффициенты умножения. Как описано подробнее далее, эти изменения для PLL не могут вступить в силу немедленно. Как с переходами между рабочими режимами, должна быть выполнена последовательность программирования PLL, чтобы можно было получить эффект от этих изменений(см. секцию "Последовательность программирования PLL").

• PLL запрещено: в дополнение к тому, что блок PLL может быть пропущен в активном режиме, также может быть снято питание PLL. Когда питание отключено от PLL, можно еще снизить энергопотребление, хотя экономия от этого получится относительно небольшая. Чтобы снять питание с PLL, установите бит PLL_OFF в регистре PLL_CTL, и после этого выполните последовательность программирования PLL.

• PLL разрешено: когда PLL выключено, на него снова может быть подано питание, когда от процессора потребовалось дополнительное быстродействие.

Питание для PLL должно быть возобновлено перед переходом в режим full или sleep. Чтобы подать питание на PLL, сбросьте бит PLL_OFF в регистре PLL_CTL, и затем выполните последовательность программирования PLL.

• Новые коэффициенты умножения в режиме active: могут быть запрограммированы новая входная частота для VCO и коэффициенты умножения (соотношение CLKIN к VCO) в режиме active.

Хотя эффект от изменения умножения частоты в VCO в активном режиме никак не повлияет на быстродействие процессора, захват PLL с новыми коэффициентами в активном режиме перед переходом в режим full on снижает время перехода в режим полного быстродействия, потому что PLL уже окажется в режиме захвата с новыми коэффициентами. Чтобы запрограммировать новые коэффициенты умножения между CLKIN и VCO, запишите новые значения MSEL[5:0] и/или DF в регистре PLL_CTL; затем выполните последовательность программирования PLL.

• Новые коэффициенты умножения в режиме full on: коэффициенты умножения также могут быть изменены, когда процессор находится в режиме full on.

В этом случае состояние PLL автоматически перейдет в режим active, пока происходит процесс захвата PLL. После захвата PLL вернется в состояние full on. Для программирования новых коэффициентов умножения CLKIN к VCO, запишите новые значения в поля MSEL[5:0] и/или DF регистра PLL_CTL; затем выполните последовательность программирования PLL (see “Последовательность программирования PLL” on page 8-19).

В таблице 8-6 суммарно показаны разрешенные переходы между рабочими режимами.

Попытка применить переходы между режимами, которых нет в таблице 8-6, может привести к непредсказуемому поведению системы.

Таблица 8-6. Разрешенные переходы между режимами.

Новый режим
Текущий режим
Full On Active Sleep Deep Sleep
Full On - разрешено разрешено -
Active разрешено - разрешено разрешено
Sleep разрешено разрешено - -
Deep Sleep разрешено разрешено - -

Программирование переходов между рабочими режимами. Рабочий режим определяется состоянием битов PLL_OFF, BYPASS, STOPCK и PDWN регистра управления PLL (PLL_CTL). Простое изменение битов регистра PLL_CTL не поменяет рабочий режим или поведение PLL. Изменения в регистре PLL_CTL становятся реализуемыми только после выполнения специальной последовательности кода, которая показана в Листинге 8-1. Эта последовательность кода сначала начинается с помещения процессора в известное, приостановленное состояние. Как только применено состояние приостановки, PLL распознает это и активизирует изменения, сделанные в регистре PLL_CTL. После того, как изменения вступили в силу, процессор работает с новыми установками, включая новый рабочий режим, если он был запрограммирован.

Последовательность программирования PLL. Если новые значения были присвоены битам MSEL или DF в регистре управления PLL (PLL_CTL), то последовательность инструкций, показанная в Листинге 8-1, вводит эти изменения в силу. Последовательность программирования PLL также выполняется, когда делаются переходы между рабочими режимами.

Изменения битов коэффициентов деления CSEL и SSEL могут быть выполнены динамически; эти изменения не требуют выполнения последовательности программирования PLL.

; Листинг 8-1. Последовательность программирования PLL.
   CLI R0;  /* запрет прерываний */
   IDLE;    /* опустошить конвейер и перевести ядро в состояние приостановки (IDLE) */
   STI R0;  /* после пробуждения заново разрешить прерывания */

Первые две инструкции в этой последовательности переводят ядро в состояние приостановки с запрещенными прерываниями; маска прерываний (IMASK) сохраняется в регистр R0, и конвейер инструкций останавливается. Затем машина состояний PLL загружает изменения регистра PLL_CTL в блок PLL.

Если изменения регистра PLL_CTL включают новые коэффициенты умножения CLKIN к VCO, или изменения приведут к возобновлению подачи питания на PLL, то система PLL требует повторного захвата петли стабилизации частоты. Чтобы выполнить повторный захват, сначала очищается счетчик захвата PLL (PLL lock counter), и затем он начинает последовательно инкрементироваться с каждым тактом SCLK. После того, как счетчик захвата PLL достигнет значения, запрограммированного в регистре захвата счета PLL (PLL Lock count register, PLL_LOCKCNT), система PLL установит бит PLL_LOCKED в регистре состояния PLL (PLL_STAT), и PLL выставит прерывание пробуждения PLL (PLL wake-up).

В зависимости от того, как был запрограммирован регистр PLL_CTL, процессор пойдет по одному из 4 путей:

• Если регистр PLL_CTL был запрограммирован для входа либо в режим active, либо в режим full on, то PLL генерирует сигнал пробуждения (wake-up), и затем процессор продолжит выполнение кода с инструкции STI последовательности в листинге 8-1 так, как это описано в секции "Продолжение последовательности программирования PLL".

Когда изменение состояния приведет к переходу в режим full on из режима active, или в режим active из режима full on, то PLL само по себе генерирует сигнал wake-up, который может использоваться для вывода ядра из состояния приостановки. Сигнал пробуждения wake-up генерируется самим модулем PLL или другим периферийным устройством - сторожевым таймером (watchdog) или другим таймером, RTC или другим источником. Для дополнительной информации по событиям, которые могут разбудить процессор из состояния приостановки, см. раздел "System Interrupt Wake-Up Enable (SIC_IWRx) Registers" руководства [1].

• Если регистр PLL_CTL запрограммирован для входа в режим sleep, процессор немедленно переходит в режим сна и ждет сигнала пробуждения, чтобы после него продолжить выполнение программы.

Когда выставляется сигнал пробуждения (wake-up) поток инструкций продолжается с инструкции STI, как это описано в секции "Продолжение последовательности программирования PLL", что приведет к переходу процессора в режимы:

- Active, если установлен бит BYPASS в регистре PLL_CTL
- Full on, если бит BYPASS был сброшен   

• Если регистр PLL_CTL был запрограммирован для входа в режим deep sleep, процессор немедленно перейдет в режим глубокого сна, и будет ждать прерывания RTC или аппаратного сигнала сброса:

- Прерывание RTC переведет процессор в активный рабочий режим, и процессор продолжит выполнять код от инструкции STI, как это описано ниже в секции "Продолжение последовательности программирования PLL".
- Аппаратный сброс приведет процессор к последовательности сброса, как это описано в разделе "Reset" руководства [1].

• Если не был запрограммирован переход по рабочим режимам, то PLL генерирует сигнал пробуждения (wake-up), и процессор продолжит выполнение кода с инструкции STI, как это описано в следующей секции.

Продолжение последовательности программирования PLL. Последовательность инструкций, показанная в листинге 8-1, продолжит свое выполнение с инструкции STI. Прерывания снова будут разрешены, содержимое регистра IMASK будет восстановлено инструкцией STI, и возобновится нормальный поток вычислений программы.

Чтобы предотвратить побочную активность, DMA должно быть приостановлено во время выполнения этой последовательности инструкций.

[Примеры]

Следующие примеры кода показывают, как эффективно выполнить различные переходы между режимами. Некоторый код настройки для ясности был удален, и сделаны следующие предположения:

• P0 указывает на регистр управления PLL (PLL_CTL). P1 указывает на регистр делителей PLL (PLL_DIV).
• Прерывание PLL wake-up разрешено как сигнал пробуждения.
• Биты MSEL[5:0] и DF в регистре PLL_CTL установлены в значения (b#011111) и (b#0) соответственно, что соответствует умножению на 31 частоты CLKIN для VCO.

В листинге 8-2 показан переход из активного рабочего режима в режим полного включения.

; Листинг 8-2. Переход из режима Active в режим Full On.
   CLI R2;        /* запрет прерываний, копирование IMASK в регистр R2 */
   R1.L = 0x3E00; /* очистка бита BYPASS */
   W[P0] = R1;    /* и запись в PLL_CTL */
   IDLE;          /* опустошение конвейера, вход в состояние приостановки,
                     ожидание пробуждения от сигнала PLL wakeup */
   STI R2;        /* после того как произойдет событие PLL wakeup,
                     восстанавливаются прерывания и содержимое IMASK */
   ...   /* теперь процессор находится в режиме Full On */

В листинге 8-3 предоставлен код для перехода из режима полного включения в активный режим.

; Листинг 8-3. Переход из режима Full On в режим Active.
   CLI R2;        /* запрет прерываний, копирование IMASK в регистр R2 */
   R1.L = 0x3F00; /* установка бита BYPASS */
   W[P0] = R1;    /* и запись в PLL_CTL */
   IDLE;          /* опустошение конвейера, вход в состояние приостановки,
                     ожидание пробуждения от сигнала PLL wakeup */
   STI R2;        /* после того как произойдет событие PLL wakeup,
                     восстанавливаются прерывания и содержимое IMASK */
   ...   /* теперь процессор находится в режиме Active */

В листинге 8-4 предоставлен код, который меняет умножитель CLKIN к VCO с коэффициента 31x на коэффициент 2x, когда процессор находится в режиме полного включения (full on).

; Листинг 8-4. Изменение коэффициента умножения частоты CLKIN к VCO.
   CLI R2;        /* запрет прерываний, копирование IMASK в регистр R2 */
   R1.L = 0x0400; /* изменение коэффициента умножения для VCO на 2x */
   W[P0] = R1;    /* путем записи в PLL_CTL */
   IDLE;          /* опустошение конвейера, вход в состояние приостановки,
                     ожидание пробуждения от сигнала PLL wakeup */
   STI R2;        /* после того как произойдет событие PLL wakeup,
                     восстанавливаются прерывания и содержимое IMASK */
   ...   /* теперь процессор находится в режиме Full On,
            с установленным коэффициентом 2x умножения CLKIN к VCO */

[Динамическое управление напряжением питания]

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

Процессор использует 3 домена питания. Эти домены питания показаны в таблице 8-7. Каждый домен имеет отдельный источник питания VDD. Обратите внимание, что внутренняя логика процессора и большая часть ввода/вывода процессора может работать в определенном диапазоне напряжений. См. даташит на процессор ADSP-BF538/ADSP-BF538F для получения подробной информации по допустимым диапазонам напряжений для каждого домена питания и данным по рассеиваемой мощности.

Таблица 8-7. Домены питания.

Домен питания
Диапазон VDD
Вся внутренняя логика, кроме RTC изменяется
Ввод/вывод RTC и внутренняя логика изменяется
Все другие сигналы ввода/вывода изменяется

[Управление питанием]

Процессор предоставляет встроенный в кристалл контроллер импульсного регулятора напряжения, который вместе с некоторыми внешними деталями (силовой транзисторный ключ и LC-фильтр) может генерировать уровни напряжения для питания внутренних схем процессора. Энергия для генерации напряжения поступает с внешнего источника VDDEXT через внешний мощный ключевой транзистор, как это показано на рис. 8-7. Генерируемый уровень напряжения может быть снижен для экономии питания, в зависимости от эксплуатационных потребностей работающей системы.

ADSP BF538 Voltage Regulator

Рис. 8-7. Регулятор напряжения процессора.

Когда напряжение VDDINT увеличивается, внешний силовой полевой транзистор external включается на более длительное время по отношению к выключенному состоянию. Источник питания VDDEXT должен иметь соответствующие развязывающие емкости, чтобы предоставить достаточный ток без падения напряжения, когда силовой транзистор регулятора находится во включенном состоянии.

Встроенный в кристалл процессора контроллер импульсного регулятора напряжения обслуживает внутреннюю логику стабилизации напряжения для генерации питания VDDINT. Регистр управления регулятором напряжения (voltage regulator control register, VR_CTL) определяет работу регулятора (см. рис. 8-8). Запись в регистр VR_CTL инициирует последовательность повторного захвата PLL.

ADSP BF538 VR CTL

Рис. 8-8. Voltage Regulator Control Register (VR_CTL).

Следующие поля регистра VR_CTL используются для управления внутренней логикой регулирования напряжения:

SCKELOW. Бит перевода сигнала SCKE в лог. 0 во время сброса (SCKELOW) защищает поведение по умолчанию при состоянии сброса от установки выводов контроллера EBIU в неактивное состояние. Этот бит должен быть установлен, если SDRAM было правильно сконфигурировано и переведено в режим самообновления (self-refresh mode), когда процессор переходит в режим hibernate. Ошибочная не установка этого бита приведет к тому, что вывод SCKE перейдет при сбросе процессора в лог. 1, что выведет SDRAM из режима самообновления, в результате ячейки SDRAM окажутся разряженными из-за потери восстановления заряда, и данные в SDRAM будут испорчены.

Вывод SCKE будет в третьем состоянии в течение состояния hibernate. В дополнение к установке бита SCKELOW в регистре VR_CTL перед входом в состояние hibernate, на выводе SCKE должен быть подключен нижний подтягивающий резистор (pull-down), чтобы уровень на выводе SCKE сохранялся в состоянии лог. 0, когда процессор Blackfin им не управляет.

CANWE. Бит разрешения пробуждения от активности интерфейса CAN (CANWE) позволяет разбудить регулятор напряжения из состояния hibernate (FREQ = b#00), когда был детектирован спад на входном выводе приема CANRX.

GPWE. Бит разрешения пробуждения общего назначения (general-purpose wake-up enable, GPWE) позволяет разбудить регулятор напряжения из состояния hibernate (FREQ = b#00), когда был детектирован спад на выводе GPW.

Вывод GPW является толерантным по входу к уровню логики 5V.

WAKE. Бит разрешения пробуждения (wake-up enable, WAKE) позволяет разбудить регулятор напряжения из состояния hibernate (FREQ = b#00), когда произошло прерывание от RTC.

FREQ[1:0]. Поле управления частотой (FREQ) задает частоту переключения регулятора напряжения. Чем выше частота переключения, тем требуются меньшие номиналы для емкости и индуктивности LC-фильтра импульсного регулятора, хотя повышенная частота потенциально может привести к повышенному уровню радиочастотных помех (electromagnetic interference, EMI).

Чтобы выключить (bypass) встроенное регулирование, запрограммируйте значение b#00 в поле FREQ и оставьте не подключенными выводы VROUT.

GAIN[1:0]. Поле усиления (GAIN) управляет коэффициентом передачи в петле обратной связи импульсного регулятора напряжения; этот бит определяет, насколько быстро установится выходное напряжение к своему конечному значению. Обычно чем больше усиление в петле обратной связи, тем быстрее будет произведена установка, однако это приводит к усилению переходных процессов во время регулирования.

VLEV[3:0]. Поле уровня напряжения (voltage level, VLEV) задает номинальный уровень внутреннего напряжения питания. Обратитесь к даташиту на процессор ADSP-BF538/ADSP-BF538F для информации по допустимым диапазонам напряжений VLEV и информации по связанным с напряжениями допускам.

В таблице 8-8 перечислены кодировки уровней напряжений для значений VLEV[3:0].

Таблица 8-8. Напряжения регулирования для VLEV.

VLEV adi_pwr.h Напряжение
0000-0101 зарезервировано
0110 ADI_PWR_VLEV_085 0.85V
0111 ADI_PWR_VLEV_090 0.90V
1000 ADI_PWR_VLEV_095 0.95V
1001 ADI_PWR_VLEV_100 1.00V
1010 ADI_PWR_VLEV_105 1.05V
1011 ADI_PWR_VLEV_110 1.10V
1100 ADI_PWR_VLEV_115 1.15V
1101 ADI_PWR_VLEV_120 1.20V (по умолчанию)
1110 ADI_PWR_VLEV_125 1.25V
1111 зарезервировано

В таблице 8-9 перечислены частоты переключения импульсного регулятора напряжения, конфигурируемые битами FREQ[1:0].

Таблица 8-9. Частоты переключения, задаваемые битами FREQ.

FREQ Значение
00 Выключение (bypass, пропуск) использования встроенного регулятора напряжения.
01 333 кГц
10 667 кГц
11 1 МГц

В таблице 8-10 перечислены уровни усиления в петле обратной связи, конфигурируемые битами GAIN[1:0].

Таблица 8-10. Настройки усиления петли обратной связи GAIN.

GAIN Значение
00 5
01 10
10 20
11 50

[Онлайн-калькулятор для регистра VR_CTL]

SCKELOW = (по умолчанию 0)
GPWE = (по умолчанию 0)
CANWE = (по умолчанию 0)
WAKE = (по умолчанию 0)
VLEV[3:0] = (по умолчанию 1101: 1.20V)
GAIN[1:0] = (по умолчанию 10: усиление 20)
FREQ[1:0] = (по умолчанию 11: 1 МГц)
VR_CTL =

Примечание: в поля регистра VR_CTL проставлены значения по умолчанию, которые они получают при включении питания.

Изменение напряжения. Незначительные изменения рабочего напряжения могут быть осуществлены без требования соблюдения каких-либо условий или выполнения специальных действий со стороны программного обеспечения. См. даташит на процессор ADSP-BF538/ADSP-BF538F для дополнительной информации по допускам напряжений и допустимым частотам работы для разных напряжений.

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

Рекомендуемая процедура должна следовать за последовательностью программирования PLL, когда изменяется напряжение питания. После изменения напряжения через программирование регистра VR_CTL, блок PLL автоматически войдет в активный режим, когда процессор войдет в состояние приостановки. В этот момент уровень напряжения поменяется, и PLL выполнит повторный захват уже на новом уровне напряжения. Посде истечения времени захвата (которое определяется значением в регистре PLL_LOCKCNT и частотой тактов SCLK), процессор вернется в состояние полного включения (full on). При изменении напряжений может потребоваться запрограммировать значение PLL_LOCKCNT больше, чем обычно, по сравнению с простым изменением частоты PLL. Подробности см. в даташите на процессор ADSP-BF538/ADSP-BF538F.

После того, как напряжение было изменено на новый уровень, процессор может безопасно вернуться в любой рабочий режим, пока рабочие параметры, такие как частота ядра (CCLK), находятся в допустимых пределах, определенных в даташите на процессор ADSP-BF538/ADSP-BF538F для этого нового рабочего напряжения.

Выключение ядра (состояние Hibernate). Внутренний регулятор питания процессора может быть выключен записью 00 в биты поля FREQ регистра VR_CTL. Это запретит обе тактовые частоты - и CCLK, и SCLK. Кроме того, это установит внутреннее напряжение питания (VDDINT) в 0V, устраняя токи, потребляемые процессором. Внутренний регулятор может быть разбужен несколькими выбираемыми пользователем событиями, все из них управляются через регистр VR_CTL:

• Выставление вывода RESET всегда выведет процессор из состояния hibernate, и это не потребует каких-либо модификаций регистра VR_CTL.
• Событие RTC. Установка бита WAKE разрешит пробуждение от прерывания RTC. Это может быть любым прерыванием от RTC (alarm, daily alarm, day, hour, minute, second или stopwatch).
• Активность на выводе CANRX. Установка бита CANWE разрешит пробуждение от сигнала приема CAN. Подробнее см. раздел "CAN Wake-Up From Hibernate State" даташита [1].
• Активность на выводе GPW. Установка бита GPWE разрешит пробуждение при обнаружении перепада от лог. 1 к лог. 0 на выводе GPW. Это позволит внешнему хосту вывести процессор Blackfin из состояния hibernate.

Если встроенный регулятор напряжения не используется (bypassed), так что напряжение VDDINT подается от внешнего источника питания, то выключить питание процессора можно только снятием напряжения VDDINT от внешнего источника.

Когда ядро выключается, уровень VDDINT устанавливается в 0V, и это приведет к потере внутреннего состояния процессора, за исключением содержимого регистра VR_CTL. Таким образом, любая критически важная информация, сохраненная в процессоре (данные в памяти, регистрах и т. д.) должна быть записана в энергонезависимую память перед тем, как будет снято питание. Удостоверьтесь, что установили управляющий бит SCKELOW (который задает вывод лог. 0 на выводе SCKE при сбросе) в регистре VR_CTL, чтобы защитить поведение по умолчанию при сбросе выводов EBIU от перехода в неактивное состояние. Ошибочная в не установка этого бита приведет к тому, что вывод SCKE перейдет в лог. 1 во время сброса процессора, что выведет SDRAM из режима самообновления, данные ячеек SDRAM разрядятся и будут потеряны.

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

Чтобы выключить внутренний источник питания:

1. Запишите 0 в регистры SIC_IWRx, чтобы внутренние периферийные устройства не прервали процесс входа в состояние hibernate.

2. Запишите в регистр VR_CTL значение, где поле FREQ находится в состоянии b#00, и соответствующие биты пробуждения (CANWE, GPWE, WAKE) при необходимости установлены в 1. Опционально установите бит SCKELOW в лог. 1, если оставляете SDRAM в режиме самообновления, когда переводите процессор в состояние hibernate.

Вывод SCKE в состоянии hibernate находится в третьем (отключенном) состоянии. Поэтому в дополнение к установке бита SCKELOW регистра VR_CTL перед входом в состояние hibernate, должен быть подключен внешний нижний подтягивающий резистор на выводе SCKE, как это требуется для удержания этого вывода в состоянии лог. 0, пока процессор Blackfin им не управляет.

3. Выполните следующую последовательность кода:

   CLI R0;
   IDLE;

4. Когда процессор достигнет состояния приостановки, VDDINT перейдет в уровень 0V.

5. Когда процессор пробуждается (либо от RTC, либо от шины CAN, либо от вывода GPW, либо от вывода RESET), блок PLL выполняет повторный захват, и вступает в силу последовательность загрузки процессора, определенная внешними выводами BMODE[1:0].

[Словарик]

CCLK частота, на которой работает ядро процессора Blackfin.

CLKIN вход для подачи внешней тактовой частоты. Эта частота с помощью системы делителей, умножителей и петли PLL используется для получения тактовых частот процессора.

DAB DMA bus, шина DMA.

DF бит регистра PLL_CTL. Если он установлен (DF=1), то блок PLL получит на входе частоту CLKIN (частоту кварца), поделенную на 2. Если сброшен (DF=0), то частота на входе PLL равна полной частоте CLKIN.

DMA прямой доступ к памяти со стороны периферийных устойств процессора Blackfin.

DPM dynamic power management, динамическое управление питанием.

DPMC DMP controller.

EAB external access bus, шина доступа к внешней памяти.

EBIU external bus interface unit, блок интерфейса внешней шины.

MSEL поле регистра PLL_CTL, которое управляет коэффициентом умножения частоты, которая попадает на вход PLL (это частота CLKIN или CLKIN/2, в зависимости от бита DF). От состояния битов DF и MSEL зависит частота работы ядра CCLK.

PAB peripheral access bus, шина доступа к внутренним периферийным устройствам процессора Blackfin.

PLL Phase Locked Loop, фазовая автоподстройка частоты, ФАПЧ.

RTC Real Time Clock, часы реального времени. Работают от отдельного кварцевого резонатора 32768 Гц.

SCLK частота, на которой работают внутренние периферийные устройства процессора Blackfin и внешняя память SDRAM.

SSEL поле бит регистра PLL_DIV, которое задает коэффициент деления частоты VCO для получения частоты системной шины SCLK.

VCO voltage controlled oscillator, генератор, управляемый напряжением. Входит в состав системы PLL, с помощью которой генерируются тактовые частоты. Частота VCO равна частоте CCLK, которой тактируется ядро процессора Blackfin.

[Ссылки]

1. ADSP-BF538/ADSP-BF538F Blackfin® Processor Hardware Reference site:analog.com.
2. Служба управления питанием процессоров Blackfin.