Power Management Controller микроконтроллера AT91SAM7X Печать
Добавил(а) microsin   

Контроллер управления питанием (PMC, Power Management Controller) позволяет оптимизировать энергопотребление кристалла AT91SAM7X путем управления тактовыми частотами процессора (системной тактовой частотой, и тактовой частотой периферийных устройств кристалла). PMC разрешает или запрещает тактовые входы многих периферийных устройств процессора ARM.

PMC предоставляет следующие тактовые частоты:

MCK, Master Clock, которая может программироваться от нескольких сотен герц до максимальной тактовой частоты устройства.
PCK, Processor Clock, тактовая частота процессора, которая отключается при переходе процессора в режим ожидания (idle mode).
• Тактовые частоты периферии, Peripheral Clocks, обычно это MCK. Тактовая частота периферии предоставляется различным встроенным периферийным устройствам кристалла (USART, SSC, SPI, TWI, TC, MCI и т. д.), и подача тактовой частоты на каждое периферийное устройство индивидуально контролируется (что позволяет также управлять энергопотреблением кристалла). Для того, чтобы уменьшить количество имён для тактовых частот, в даташите на кристалл тактовые частоты периферии носят имя MCK.
• UDP Clock (UDPCK), тактовая частота, требуемая для работы USB Device Port.
• Программируемые выходы тактовой частоты (Programmable Clock Outputs), которые могут быть выбраны из тактов, предоставляемых тактовым генератором, и поданы на ножки PCKx.

Прим. переводчика: "максимальная тактовая частота для устройства" зависит от того, где работает код (в SRAM или в FLASH). Если код работает в SRAM, то тактовая частота ядра может быть установлена до 200 МГц, если же код работает во FLASH, то максимальная тактовая частота зависит от количества настроенных циклов ожидания при доступе во FLASH (см. далее раздел "Характеристики встроенной FLASH" и таблицу "Embedded Flash Wait States"), и может составлять от 30 до 55 МГц.

[Master Clock Controller]

Контроллер главной тактовой частоты (Master Clock Controller) предоставляет выбор и деление главной тактовой частоты Master Clock (MCK). MCK в виде тактов предоставляется периферии и контроллеру памяти.

MCK выбирается из частот, предоставляемых тактовым генератором (Clock Generator). Выбор медленной тактовой частоты (Slow Clock) предоставляет медленные такты для всего кристалла в целом. Выбор Main Clock экономит потребление мощности узлом PLL.

Master Clock Controller состоит из селектора тактов (по сути управляемый коммутатор) и прескалера (программируемый делитель частоты).

Выбор MCK делается путем записи значения в поле CSS (Clock Source Selection, выбор источника тактов) регистра PMC_MCKR (Master Clock Register). Прескалер поддерживает коэффициенты деления степени 2 выбранной частоты в диапазоне от 1 до 64. Поле PRES в регистре PMC_MCKR программирует коэффициент деления прескалера.

Каждый раз, когда записывается PMC_MCKR для задания новой частоты MCK, в регистре PMC_SR очищается бит the MCKRDY. Этот бит будет читаться как 0, пока не застабилизируется значение частоты MCK. Установка бита MCKRDY может вызвать прерывание процессора. Эта возможность полезна, когда происходит переключение с высокой тактовой частоты не более низкую - чтобы информировать программное обеспечение, что изменение тактовой частоты закончилось.

AT91SAM7X-Master-Clock-Controller-fig25-1

Рис. 25-1. Master Clock Controller.

Пояснения к рисунку:

CSS поле регистра PMC_MCKR, управляющее коммутатором выбора тактовой частоты.
PRES поле регистра PMC_MCKR, управляющее коэффициентом деления прескалера.
SLCK Slow Clock, медленная тактовая частота (частота, вырабатываемая внутренним RC генератором).
MAINCK главная тактовая частота, определяемая частотой кварцевого резонатора.
PLLCK тактовая частота, получаемая с выхода узла PLL. PLL расшифровывается как Phase Locked Loop, т. е. это ФАПЧ, узел генерации тактов с помощью Фазовой АвтоПодстройки Частоты.
Master Clock Prescaler предделитель главной тактовой частоты. 

[Processor Clock Controller]

С помощью Processor Clock Controller реализуется режим ожидания процессора (Processor Idle Mode). Тактовая частота PCK может быть запрещена записью в регистр PMC_SCDR (System Clock Disable Register). Текущее состояние этой частоты (может понадобиться как минимум в целях отладки) можно прочитать из регистра состояния PMC_SCSR (System Clock Status Register).

Тактовый сигнал PCK разрешен сразу после сброса, и автоматически заново разрешается при возникновении любого разрешенного прерывания. Режим ожидания Processor Idle Mode включается путем запрета PCK, который автоматически разрешается заново от разрешенного быстрого (fast interrupt) или обычного прерывания (normal interrupt), или от сброса кристалла.

Когда запрещен PCK, текущая инструкция завершается до остановки тактовой частоты, но это не останавливает перемещение данных от других мастеров на системной шине.

[USB Clock Controller]

Тактовой частотой для USB является выход PLL. Если используется USB, то пользователь должен запрограммировать PLL для генерации 48 МГц, 92 МГц или 192 МГц с точностью +-0.25%, в зависимости от бит USBDIV в регистре CKGR_PLLR.

Когда выход PLL становится стабильным, устанавливается бит LOCK: тактовая частота USB может быть разрешена путем установки бита UDP в регистре PMC_SCER. Чтобы экономить энергопотребление, когда USB не используется, пользователь может установить бит UDP в регистре PMC_SCDR. Бит UDP в PMC_SCSR предоставляет активность для этой частоты. Порт устройства USB требует и сигнала 48 МГц, и сигнала MCK. Как уже упоминалось, MCK может управляться через Master Clock Controller. Текущее состояние активности тактов может быть прочитано через регистр PMC_PCSR (Peripheral Clock Status Register).

AT91SAM7X-USB-Clock-Controller-fig25-2

Рис. 25-2. USB Clock Controller.

[Peripheral Clock Controller]

PMC управляет тактами для каждой встроенной периферии через Peripheral Clock Controller. Пользователь может индивидуально разрешать или запрещать MCK для каждой периферии путем записи в регистры PMC_PCER (Peripheral Clock Enable) и PMC_PCDR (Peripheral Clock Disable) соответственно.

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

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

Номер бита в регистрах управления тактами и статуса периферии (PMC_PCER, PMC_PCDR и PMC_PCSR) соответствуют идентификатору периферии (Peripheral Identifier), жестко заданному при производстве кристалла. Обычно номер бита соответствует номеру источника прерывания, назначенному для периферийного устройства.

[Programmable Clock Output Controller]

PMC управляет 4 сигналами, которые можно вывести на внешние ножки кристалла PCKx. Каждый из этих сигналов может быть независимо запрограммирован через регистры PMC_PCKx.

PCKx может быть независимо установлен в медленную тактовую частоту (Slow clock), подключен к выходу PLL или к выходу главного генератора тактов путем записи поля CSS в регистре PMC_PCKx. Каждый выходной сигнал может быть также поделен на коэффициент 1 .. 64 (из этого ряда берутся только те числа, которые равны степени 2) путем записи в поле PRES (Prescaler) регистра PMC_PCKx.

Каждый выходной сигнал может быть разрешен или запрещен путем записи 1 в соответствующий бит PCKx регистров PMC_SCER и PMC_SCDR. Текущее состояние активных программируемых тактовых выходов можно получить чтением битов PCKx регистра PMC_SCSR (System Clock Status Register).

Кроме того, как и PCK, бит статуса в регистре PMC_SR показывает, запрограммированы ли в действительности биты тактовой частоты в регистрах Programmable Clock.

Поскольку Programmable Clock Controller не обрабатывает скачки фазы при переключении тактовых частот, то весьма рекомендуется запретить Programmable Clock перед любыми изменениями конфигурации, и затем заново разрешить их после окончания всех действий реконфигурирования.

[Последовательность программирования]

1. Разрешение работы Main Oscillator:

Главный генератор будет разрешен путем установки поля MOSCEN в регистре CKGR_MOR. В некоторых случаях может быть полезно определить время запуска (start-up time). Это можно сделать путем записи значения в поле OSCOUNT регистра CKGR_MOR.

Как только регистр был корректно сконфигурирован, программист должен ждать, пока установится поле MOSCS в регистре PMC_SR. Это можно сделать путем опроса регистра статуса или путем получения прерывания, связанного с MOSCS, что можно разрешить в регистре PMC_IER. Пример кода:

write_register(CKGR_MOR,0x00000701)

Время запуска составит: Start Up Time = 8 * OSCOUNT / SLCK = 56 циклов медленной тактовой частоты (Slow Clock).

Таким образом, главный генератор будет разрешен (бит MOSCS установится) после 56 циклов Slow Clock.

2. Проверка частоты Main Oscillator (опциональная процедура):

В некоторых ситуациях программисту нужно точно измерить частоту главного генератора. Это измерение можно осуществить через регистр CKGR_MCFR.

Как только поле MAINRDY в регистре CKGR_MCFR будет установлено, пользователь может прочитать поле MAINF в регистре CKGR_MCFR. Это поле предоставит количество циклов основной частоты за 16 циклов медленной тактовой частоты.

3. Установка PLL и делителя частоты:

Все параметры, которые нужны для конфигурирования PLL и делителя размещены в регистре CKGR_PLLR.

Поле DIV используется для управления делителем, сюда можно запрограммировать Значение от 0 до 255. Выход делителя получит частоту входа поделенную на значение поля DIV. По умолчанию DIV установлен в 0, что соответствует выключенному делителю.

Поле OUT используется для выбора частотного диапазона PLL B.

Поле MUL задает множитель частоты PLL. Этот параметр может быть запрограммирован в диапазоне от 0 до 2047. Если MUL установлен в 0, то PLL выключена, иначе выходная частота PLL равна входной частоте PLL, умноженной на (MUL+1).

Поле PLLCOUNT указывает количество циклов медленных тактов перед тем, как установится бит LOCK в регистре PMC_SR, после того как будет записан регистр CKGR_PLLR.

Как только записан регистр PMC_PLL, пользователь должен в программе ожидать установки бита LOCK в регистре PMC_SR. Это можно сделать либо циклами опроса, либо ожиданием прерывания, если разрешено прерывание по установке бита LOCK (разрешение этого прерывания делается в регистре PMC_IER). Все параметры в CKGR_PLLR могут быть запрограммированы одиночной операцией записи. Если на некотором этапе изменены поля MUL и/или DIV, бит LOCK перейдет в состояние лог. 0, что покажет неготовность PLL. Когда захват PLL произошел, бит LOCK снова установится. Пользователь ограничен ожидать установки бита LOCK, перед тем как он может использовать выход тактов PLL.

Поле USBDIV используется для управления дополнительным делителем на 1, 2 или 4 для генерации тактов USB.

Пример кода:

write_register(CKGR_PLLR,0x00040805)

Если PLL и делитель разрешены, то входная частота PLL равна главной частоте (main clock). Выходная частота PLL равна входной частоте, умноженной на 5. Как только записан регистр CKGR_PLLR, бит LOCK установится после 8 циклов медленной тактовой частоты.

4. Выбор частот Master Clock (MCK) и Processor Clock (PCK)

Частоты MCK и PCK конфигурируются через регистр PMC_MCKR.

Поле CSS используется для выбора источника делителя для MCK. По умолчанию выбрана в качестве источника медленная тактовая частота.

Поле PRES используется для управления прескалером MCK. Программист может выбрать одно из ряда значений коэффициента деления (1, 2, 4, 8, 16, 32, 64). Выходная частота MCK равна входной частоте прескалера, деленной на коэффициент в параметре PRES. По умолчанию PRES равен 1, что означает отсутствие деления, и главная частота будет равна медленной тактовой частоте.

Как только записан регистр PMC_MCKR, пользователь должен в программе ожидать установки бита MCKRDY в регистре PMC_SR. Это можно сделать либо циклами опроса, либо ожиданием прерывания, если разрешено прерывание по установке бита MCKRDY (разрешение этого прерывания делается в регистре PMC_IER). Регистр PMC_MCKR должен быть запрограммирован одной операцией записи. Вот рекомендуемая последовательность для регистра PMC_MCKR:

• Если новое значение для поля CSS соответствует тактам PLL,
– запрограммировать поле PRES в регистре PMC_MCKR.
– ждать установки бита MCKRDY в регистре PMC_SR.
– запрограммировать поле CSS в регистре PMC_MCKR.
– ждать установки бита MCKRDY в регистре PMC_SR.
• Если новое значение для поля CSS соответствует тактам Main Clock или Slow Clock,
– запрограммировать поле CSS в регистре PMC_MCKR.
– ждать установки бита MCKRDY в регистре PMC_SR.
– запрограммировать поле PRES в регистре PMC_MCKR.
– ждать установки бита MCKRDY в регистре PMC_SR.

Если на некотором шаге один из параметров CSS или PRES будет изменен, бит MCKRDY перейдет в значение лог. 0, что покажет текущую неготовность MCK и PCK. Пользователь должен ждать, пока бит MCKRDY снова не установится в лог. 1, перед тем как использовать такты MCK и PCK.

Примечание: если тактовый выход PLLx был выбран как MCK, и пользователь решил модифицировать это путем записи в регистр CKGR_PLLR, то флаг MCKRDY перейдет в состояние лог. 0, на время, пока цепь PLL разорвана. Как только PLL снова засинхронизировалась, установятся биты LOCK и MCKRDY. Когда PLL не синхронизирована, выбор MCK автоматически переходит на частоту Main Clock. Для дополнительной информации см. секцию 25.8.2. даташита "Clock Switching Waveforms".

Пример кода:

write_register(PMC_MCKR,0x00000001)
wait (MCKRDY=1)
write_register(PMC_MCKR,0x00000011)
wait (MCKRDY=1)

После этих операций частота MCK равна главной тактовой частоте (main clock), поделенной на 16. Частота PCK равна частоте MCK.

5. Выбор программируемых тактов (Programmable clocks)

Как уже упоминалось, программируемые тактовые частоты управляются регистрами PMC_SCER, PMC_SCDR и PMC_SCSR. Программируемые такты могут быть разрешены и/или запрещены регистрами PMC_SCER и PMC_SCDR соответственно. В зависимости от используемой системы, могут быть разрешены или запрещены 4 программируемых тактовых выхода. Регистр PMC_SCSR предоставляет ясную индикацию, какая из программируемых частот разрешена. По умолчанию запрещены все программируемые такты. Регистры PMC_PCKx используются для конфигурирования программируемых тактов.

Поле CSS используется для выбора источника тактовой частоты для делителя. Доступно 4 варианта тактов: выключено, main clock, slow clock, PLLCK. По умолчанию задан выбор медленных тактов (slow clock).

Поле PRES используется для управления прескалером. Можно выбрать одно из значений делителя (1, 2, 4, 8, 16, 32, 64). Тактовая частота для программируемых выходов тактов равна входной частоте прескалера, поделенной на параметр PRES. По умолчанию параметр PRES установлен в 1, что означает, что главная частота равна медленной тактовой частоте.

Как только регистр PMC_PCKx запрограммирован, соответствующая программируемая тактовая частота должна быть разрешена, и пользователь должен ожидать установки бита PCKRDYx в регистре PMC_SR. Как обычно, это можно сделать циклами опроса, либо ожиданием прерывания, связанного с битом PCKRDYx (что разрешается в через регистр PMC_IER). Все параметры в PMC_PCKx могут быть запрограммированы за одну операцию записи.

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

Пример кода:

write_register(PMC_PCK0,0x00000015)

Программируемый выход 0 выдает главную тактовую частоту (main clock), поделенную на 32.

6. Разрешение тактирования периферийных устройств

Как только завершены все предыдущие шаги по настройке тактовой частоты, могут быть разрешены и/или запрещены тактовые частоты для периферийных устройств кристалла через регистры PMC_PCER и PMC_PCDR соответственно.

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

Примечание: каждая разрешенная тактовая частота периферии соответствует MCK.

Пример кода:

//Разрешение тактирования периферийных устройств 4 и 8:
write_register(PMC_PCER,0x00000110)//Запрет тактирования периферии 4:
write_register(PMC_PCDR,0x00000010)

Временные диаграммы переключения тактовых частот и их параметры см. в разделе 25.8 "Clock Switching Details" даташита на микроконтроллер. адреса регистров PMC и подробное описание их битов см. в разделе 25.9 "Power Management Controller (PMC) User Interface".

[Ссылки]

1. IAR EW ARM: где задаются циклы ожидания (wait state) при работе с flash.
2. Питание AT91SAM7X, режимы пониженного энергопотребления.