Научная статья на тему 'Быстрое погружение c «Черными плавниками». Часть 3. 2. Первая законченная система. Разрабатываем часы для Blackfin. Энергопотребление. Внутренний таймер ядра'

Быстрое погружение c «Черными плавниками». Часть 3. 2. Первая законченная система. Разрабатываем часы для Blackfin. Энергопотребление. Внутренний таймер ядра Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
145
45
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Савичев Андрей, Романов Олег

В предыдущей статье цикла (см. «Компоненты и Технологии» № 6 '2007) мы подробно рассматривали работу с часами реального времени в процессорах Blackfin, и теперь готовы приступить к написанию программы. Напомним, что инициализировать RTC в ADSP-BF533 EZ-KIT Lite мы предполагаем через написанный ранее драйвер (см. «Компоненты и Технологии» № 3 '2007) по последовательному каналу с хост-компьютера. Часы и календарь на хост-компьютере работают корректно, но при передаче данных по последовательному каналу и обработке могут произойти сбои.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Быстрое погружение c «Черными плавниками». Часть 3. 2. Первая законченная система. Разрабатываем часы для Blackfin. Энергопотребление. Внутренний таймер ядра»

Быстрое погружение c «черными плавниками».

Часть 3.2. Первая законченная система. Разрабатываем часы для Blackfin. Энергопотребление. Внутренний таймер ядра

Андрей САВИЧЕВ

[email protected]

Олег РОМАНОВ

[email protected]

В предыдущей статье цикла (см. «КиТ» № 6'2007) мы подробно рассматривали работу с часами реального времени в процессорах Blackfin, и теперь готовы приступить к написанию программы. Напомним, что инициализировать RTC в ADSP-BF533 EZ-KIT Lite мы предполагаем через написанный ранее драйвер (см. «КиТ» № 3 '2007) по последовательному каналу с хост-компьютера. Часы и календарь на хост-компьютере работают корректно, но при передаче данных по последовательному каналу и обработке могут произойти сбои.

Йля выявления ошибочных значений проинициализируем входными данными вспомогательную структуру-бу-сли ошибки во входных данных отсутствуют, выведем значения для инициализации в регистры ИТС:

Мы уже обсуждали различия в структуре регистров ИТС для разных типов процессоров В1аскйп.

Для Л08Р-БР535:

Для всех остальных процессоров семейства (за исключением ADSP-BF561):

#define DAY_BITS_OFF 24

#define HOUR_BITS_OFF 16

#define MIN_BITS_OFF 8

#define SEC_BITS_OFF О

Для удобства вводится следующее макроопределение:

#define bfin_write_RTC_STAT(val) bfin_write32(RTC_STAT,val)

и далее в def_LPBlackfin.h можно найти определение bfin_write32(addr,val).

Функция wait_for_complete()

static inline void wait_for_complete(void)

{

unsigned long st;

while ((*pRTC_ISTAT& WCOM)==0);

^(volatile unsigned short *)RTC_ISTAT |= 0x8000;

}

необходима для ожидания завершения записи в регистры RTC. Можно воспользоваться другим методом и записывать значения в эти регистры в течение 990 мс сразу после события Seconds Event.

Чтение любого регистра RTC (в отличие от записи) может осуществляться в произвольный момент времени, но полученные значения не всегда соответствуют реальным. Это связано с буферизацией этих регистров с помощью «теневых регистров». Вы получаете либо текущее значение, либо предшествующее, в зависимости от момента обращения к регистру. Можно также сказать, что установленный старший бит регистра RTC_ISTAT гарантирует вам чтение актуальных значений из регистров RTC.

Для облегчения работы воспользуемся готовой процедурой get_rtc_time, а также макро-определением bfin_read_RTC_ISTAT ():

#define bfm_read_RTC_ISTAT() bfin_read16(RTC_ISTAT)

В def_LPBlackfin.h можно найти определение bfin_read16(addr):

static void get_rtc_time(struct rtc_time *rtc_tm)

{

unsigned long cur_rtc_stat;

cur_rtc_stat = bfin_read_RTC_STAT();

rtc_tm->tm_sec = (cur_rtc_stat >> SEC_BITS_OFF) & 0x3f; rtc_tm->tm_min = (cur_rtc_stat >> MIN_BITS_OFF) & 0x3f; rtc_tm->tm_hour = (cur_rtc_stat >> HOUR_BITS_OFF) & 0x1f, rtc_tm->tm_mday = (cur_rtc_stat >> DAY_BITS_OFF) & 0x7fff

}

Проверить эти процедуры проще всего с помощью «будильника». Для этого введем в наш проект еще пару готовых процедур:

static void set_rtc_alm_time(struct rtc_time *alm_tm);

static void get_rtc_alm_time(struct rtc_time *alm_tm);

Их исходные тексты здесь не приводим, но, разумеется, вы их найдете в проекте. Поскольку по структуре регистры часов RTC_STAT и будильника RTC_ALARM идентичны, то и реализация этих процедур мало чем отличается от set_rtc_time и get_rtc_time соответственно.

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

static unsigned long epoch = 2000; // year corresponding to 0x00

struct rtc_time rtc_tm;

unsigned char mon, day, hrs, min, sec, leap_yr;

unsigned int yrs;

//leap_yr — високосный год

static void set_rtc_time(struct rtc_time *rtc_tm)

{

yrs = rtc_tm.tm_year + epoch;

mon = rtc_tm.tm_mon + 1; // tm_mon starts at zero

day = rtc_tm.tm_mday;

hrs = rtc_tm.tm_hour;

min = rtc_tm.tm_min;

sec = rtc_tm.tm_sec;

leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400));

If ((mon > 12) || (day == 0)) return Error; if ((hrs >= 24) || (min >= 60) || (sec >= 60)) return Error;

bfin_write_RTC_STAT(((day << DAY_BITS_OFF) | (hrs << HOUR_BITS_OFF) |

(min << MIN_BITS_OFF) | (sec << SEC_BITS_OFF))); wait_for_complete();

}

#define DAY_BITS_OFF 17

#define HOUR_BITS_OFF 12

#define MIN_BITS_OFF 6

#define SEC_BITS_OFF О

Таймер 0:

OxFFCO 0600 Таймер 1:

OxFFCO 0610 Таймер 0:

OxFFCO 0620

ERR_TYPE[1KI] (тип ошибки)

00 — нет ошибок

15 14 13 12 11 10 9 8 7

|о|о|о|о|о|о|о| 0~|Т

6 5

о о

01 — ошибка переполнения счетчика

10 — ошибка программирования

регистра периода

11 — ошибка программирования

регистра ширины импульса

EMU_RUN (выбор режима эмуляции)------------

0 — остановка счетчика таймера

в процессе эмуляции

1 — запуск счетчика таймера в процессе эмуляции

TOGGLE_HI (PWM_OUT PULSE_HIGH)-------------------

0 — действительное значение PULSE_HIGH

в состоянии «программирование»

1 — действительное значение PULSE_HIGH

выбирается в каждом периоде

CLK_SEL (Timer Clock Select)---------------------

Этот бит должен быть установлен в «1», когда PPI используется в режиме «общецелевых выходов с внутренней синхронизацией кадра»

0 — для счетчика использовать SCLK

1 — для счетчика использовать PWM_CLK

4 3 2 1 0

О I о | о | о |~0~|

Состояние при сбросе = 0x0000

ТМСЮЕ[1:0] (Режим таймера)

00 — не используется

01 — режим «Р\Л/М_01Л» широтно-

импульсной модуляции

10 - режим «У70ТН_САР»

11 - режим «ЕХТ_С1_К»

Р1Л_5Е_Н1

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

0 — «негативный» импульс

1 — «позитивный» ИМПУЛЬС

- PERIOD_CNT

0 — счет до конца WIDTH

1 — счет до конца PERIOD

IRQENA

0 — запрос прерывания запрещен

1 — запрос прерывания разрешен

TIN_SEL

0 — на выводе сигналы Т MRx или PF1

1 — на выводе сигналы

UART RX или PPI_CLK

OUT_DIS

0 — разрешение выхода

в режиме PWM_OUT (выходной сигнал выдается)

1 — блокировка выхода

в режиме PWM_OUT (выходной сигнал не выдается)

Рис. 1. Формат регистра конфигурации таймеров общего назначения TIMERx_CONFIG

OxFFCO 0648

TRUN2

15 14 13 12 11 10 9

І о І о І о І о~рГ

0 0

876543210

о|о|о|о|о|о|о|о|о~|

(Состояние таймера 2) — 1АМС

1 — незамедлительная остановка таймера в режиме РУ7М_01Я

TRUN1 -----------------------

(Состояние таймера 1) — \¥1С

1 — незамедлительная остановка таймера в режиме РМ/М_011Т

TRUN0 --------------------------

(Состояние таймера 0) — 1АПС

1 — незамедлительная остановка таймера в режиме РУУМ_ОиТ

ТОУР_ЕРР2 --------------------------

(Переполнение счетчика таймера 2)

Сигнализирует о том, что произошла

ошибка или переполнение

ТОУР ERR1 --------------------------

L

Состояние при сбросе =

0x0000

Т1М11.0

(Прерывание таймера 0) — ¥ЛС

Когда 1РО_ЕМА установлен, сигнализирует о запросе прерывания

Т1М11.1

(Прерывание таймера 1) — ¥ЛС

Когда 1КО_ЕМА установлен, сигнализирует о запросе прерывания

Т1М11.2

(Прерывание таймера 2) — ¥МС

Когда 1РО_ЕМА установлен, сигнализирует о запросе прерывания

TOVF_ERRO

(Переполнение счетчика таймера 0)

Сигнализирует о том, что произошла ошибка или переполнение

(Переполнение счетчика таймера 1)

Сигнализирует о том, что произошла ошибка или переполнение

Рис. 2. Формат регистра состояний таймера общего назначения TIMER_STATUS

интервал сформируется событие Alarm Event, которое мы можем отметить, например, включением светодиода. Определимся с форматом инициализируемых данных:

static const unsigned char rtc_data[ ] =

{ 7, 5, 29,13, 25, 30 };

static const unsigned char rtc_alarm_data[ ] =

{ 7, 5, 29,13, 25, 35 };

Это представление времени для часов в rtc_data[] «29-мая-2007 13:25:30» и для будильника в rtc_alarm_data[] «29-мая-2007 13:25:35».

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

static unsigned statu;

EX_INTERRUPT_HANDLER(RTC_ISR2)

{

statu=*pRTC_ISTAT; // read IRQ Status if ( statu&AEF != 0 )

{;//действия, связанные с событиями флага Alarm Event Flag *pFlashA_PortB_Data /= 0x20; //включить светодиод

}

*pRTC_ISTAT= AEF;

while ((*pRTC_ISTAT& WC0M)==0);

statu=0;

}

Если вы захотите поэкспериментировать с данной программой при более существенной разнице во времени между будильником и часами, рекомендуем сбросить флаг Prescaler Enable:

*pRTC_PREN = 0x0;

В этом случае и часы, и будильник пойдут в 32 768 раз быстрее, и вам не придется слишком долго ждать результата. Все исходные тексты проекта будут доступны по адресу http://avisv.narod.ru/BlackFin/project2.htm.

Давайте уделим немного внимания другим подсистемам службы времени Blackfin — таким как таймеры общего назначения general-purpose timers и «внутренний таймер ядра» core timer («системный таймер»). Мы не будем рассматривать все возможные режимы работы этих устройств, а просто приведем примеры из работающих программ. Например, в демонстрационной программе от Analog Devices, рассмотренной нами в первой части статьи нашего цикла, есть такой фрагмент:

*pTIMER0_CONFIG =0x0019;

*pTIMER0_PERIOD =0x0001000;

*pTIMER0_WIDTH = 0x0000400;

*pTIMER_ENABLE = 0x0001;

Для каждого таймера, независимо от типа процессора АБ8Р В1аскйп, существует регистр

конфигурации ТІМЕИх_СООТЮ (рис. 1), в котором определены режимы его работы, параметры цифрового сигнала на выходе (если он формируется), источник тактирования, разрешение прерывания. Запись в регистр конфигурации возможна только тогда, когда таймер остановлен. Проверить это можно, анализируя соответствующий бит ТИиЫх в регистре ТІМЕК_8ТАТШ (рис. 2). Вы можете дать команду на остановку таймера, установив соответствующий бит ТІМББх в регистре ТІМЕ^БВАБЬЕ (рис. 3). При этом таймер остановится не сразу, а по завершении формирования импульса, как если бы вы работали в режиме PWM_OUT с РЕШОО_СЭТ=0. Чтобы добиться мгновенной остановки таймера, запишите дополнительно «1» в соответствующий бит ТИиЫх.

В нашем примере в качестве режима работы выбран широтно-импульсный модулятор с первоначально нулевым уровнем сигнала (PULSE_HI=0) и режимом счета до конца периода.

В этом режиме сигнал на выводах таймеров формируется в соответствии со значениями в регистрах Timerx_WIDTH и Timerx_PERIOD, битовых полей Pulse_HIGH, Period_CNT, TOGGLE_HI и в зависимости от выбранного источника тактовых сигналов CLK_SEL регистра TIMERx_CONFIG. Но если, как в нашем случае, состояние выхода несущественно, то ситуация с инициализацией регистров general-purpose timers несколько упрощается. Сейчас нас интересует только прерывание, которое возникает через строго определенные интервалы времени, поэтому и другие

режимы работы таймеров общего назначения, системного таймера или рассмотренных выше часов реального времени вполне решали бы задачу. Подробнее о работе таймера общего назначения в режиме PWM_OUT можно посмотреть в справочнике [1] или в его русском переводе на сайте представительства Analog Devices в СНГ и Балтии http://www.analog.spb.ru/pub_dsp.htm в файле chapter15.pdf.

Блок-схема таймера общего назначения представлена на рис. 5

Как программировать системные тики (system tick — прерывания от таймера) — основу нашей системы реального времени? Прежде всего, нужно выбрать их периодичность в зависимости от производительности системы (процессора) и желаемого времени отклика на события. Если снизить эту величину до минимально возможной, то процессор вместо полезной загрузки приложениями будет слишком часто «отвлекаться» на обслуживание системных тиков и связанные с их обслуживанием процедуры. С другой стороны, если сделать их чрезмерно редкими, система окажется слишком медлительной, и события будут отслеживаться с большим запаздыванием. В таких системах иногда для получения быстрого отклика на определенные события прибегают к грубым «внесистемным» решениям, обходя «системный диспетчер» (как раз те самые процедуры, которые обслуживаются при возникновении очередного системного тика), а то и просто глобально блокируя все остальные события до завершения обработки. Именно в этом случае эффективны «часы реального времени», так как с их помощью можно оценить временной интервал, в течение которого система находилась в режиме монопольного обслуживания определенного события. Для двухъядерного ADSP-BF561 в этих целях можно использовать более тонкий механизм, но это тема для отдельной статьи. Итак, крайне желательно ввести именованную константу, чтобы затем можно было подобрать ее величину в процессе «тонкой настройки» системы.

static const unsigned char our_system_tick = 20; // system tick in mks

Производительность процессора и потребление энергии в процессорах ADSP-Blackfin может регулироваться программно. Важно знать, какая частота присутствует на входе CLKIN. На плате ADSP-BF533 EZ-KIT Lite на этот вход заведена частота 27 МГц. Это кроме всего прочего объясняется еще и тем, что ФАПЧ лучше всего работает при не слишком больших коэффициентах DIVIDER, и минимально допустимая частота на входе CLOCK DIVIDE AND MUX — 50 МГц (рис. 6).

Комбинации значений в MSEL и SSEL для SCLK, и MSEL и CSEL для CCLK определяют тактовые частоты для периферии и ядра соответственно. При этом если бит Divide

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0_ „

OxFFCO 0644 |о|о|о|о|о|о|о|о|о|о|о|о|о|о|о|Т| Состояние ПРИ сбросе -

L

0x0000

ТІМОІЗО (Выключение таймера 0)

1 — выключение таймера.

Когда таймер включен, при чтении возвращается единица.

Т1М0181 (Выключение таймера 1)

1 — выключение таймера.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Когда таймер включен, при чтении возвращается единица.

Т1М0182 (Выключение таймера 2)

1 —ы ключей ие таймера.

Когда таймер включен, при чтении возвращается единица.

Рис. 3. Формат регистра запрещения таймеров общего назначения TIMER_DISABLE

OxFFCO 0640

15 14 13 12 11 10 9 8 7

|о|о|о|о|о|о|о|о|Т

6 5 4 3 2

о | о

0 0

1 о

о о

L

Состояние при сбросе = 0x0000

ТІМЕМ0 (Включение таймера 0)

1 — включение таймера. Когда таймер включен, при чтении возвращается единица.

Т1МЕЫ1 (Включение таймера 1) 1 — включение таймера. Когда таймер включен, при чтении возвращается единица.

ТІМЕМ2 (Включение таймера 2) 1 —включение таймера. Когда таймер включен, при чтении возвращается единица.

Рис. 4. Формат регистра разрешения таймеров общего назначения TIMER_ENABLE

/1 или /2

Фазовый

детектор

Петлевой

фильтр

VCO -

Делитель

Деление тактовых сигналов и мультипле- . ксирвоание

► SCLK

MSEL[5:0]

BYPASS

SSEL[3:0]

CSEL[3:0]

Рис. 6. Блок-схема фазовой автоподстройки частоты ФАПЧ процессора В1аск!т с умножителем частоты

Таблица. Величина напряжения питания процессорного ядра в зависимости от значения поля Voltage Level (VLEV), VR_CTL[7:4] регистра управления регулятором напряжения VR_CTL

VLEV Напряжение, В

0000-0101 Не используется

0110 0,85

0111 0,90

1000 0,95

1001 1,00

1010 1,05

1011 1,10

1100 1,15

1101 1,20

1110 1,25

1111 1,30

ADSP-BF531/2/3 Idd базовые динамические характеристики

Тактовая частота ядра процессора, МГц

Рис. 7. Допустимые рабочие частоты ядра процессора и потребляемый ток в зависимости от питающего напряжения

15 14 13 12 11 10 9 8 7 6 OxFFCO0008 |0|0|0|0|0|0|0|0|1|1 I I WAKE 1 (Разрешение вывода из ожидания) 0 — вывод из ожидания по прерыванию RTC или при сбросе запрещен 1 — вывод из ожидания по прерыванию RTC или при сбросе разрешен VLEV[3:0] (Уровень внутреннего напряжения) Значение битов см. в таблице 8—8. 5 4 3 01111 I L 2 1 0 п I 1 I 1 1 Состояние при сбросе — " 1 1 1 ОхООРВ 1- Н1ЕО[1:0] (Частота напряжения) Управляет частотой импульсного генератора стабилизатора напряжения, значения битов см. в таблице 8-10. СА1Ы[1:0] (Усиление напряжения) Управляет быстротой достижения выходным напряжением установившегося значения, значения битов см. в таблице 8—9.

Рис. S. Формат регистра управления регулятором напряжения VR_CTL

CCLK

TSCALE

SZ.

Шина регистров ядра

TCNTL

Логика включения таймера и предварительного деления

ту

1Z.

TPERIOD

Логика загрузки

регистра счетчика

Декре- TCOUNT Ноль

мент

Прерывание

таймера

Рис. 9. Блок-схема таймера ядра core timer

Frequency (DF) установлен, частота CLKIN умножается на 2. Например, если в MSEL[5:0] записан код 111111 — 63, то при DF=1 частота на входе CLOCK DIVIDE AND MUX будет 850 МГц, а при DF=0 — 1700 МГц. Обратите особое внимание на то, что при нулевом значении поля MSEL[5:0] входная частота возрастает соответственно в 32 или 64 раза! Делители частоты различаются по разрядности. Если тактовый сигнал для CCLK можно разделить максимум на 8 (2-битное поле CSEL[1:0]), то сигнал для SCLK — на 15 (4-битное поле SSEL[3:0]).

Это вполне логично, ведь входная тактовая частота у них одинаковая, а периферия, как правило, должна работать медленнее, чем процессорное ядро. На более низких рабочих частотах ядра можно снижать тактовую частоту работы с периферией (с внешней памятью в том числе) в значительно меньшей степени. Если внешняя шина в вашей системе стандартна, то перед вами стоит задача более точного подбора коэффициентов: DIVIDER, VCO, DF. Есть ограничение и на тактирование ядра процессора в зависимости от исполнения и типа корпуса, а периферии — в зависимости от числа используемых выводов GPIO и электрических параметров подключаемых устройств.

Каждый тип корпуса при определенном количестве выводов характеризуется вполне определенным коэффициентом теплоотдачи, который, в свою очередь, определяет полное тепловое сопротивление. Для корпуса LQFP со 176 выводами, в котором выпускаются некоторые процессоры ADSP-BF531/2/3, оно составляет приблизительно 21 °С/Вт при естественном воздушном охлаждении. Ядро процессоров Blackfin обладает малым энергопотреблением. Так, на рабочей частоте 600 M^ при питающем напряжении ядра 1,2 В это составляет порядка 330 мВт. При этом вклад ядра в повышение температуры корпуса составляет не более 9 °С. При выполнении различных последовательностей инструкций потребляемый ток (и выделяемая мощность) могут отличаться от базовых параметров, приведенных на рис. 7, на 27% как в большую, так и в меньшую сторону. Более сложной является оценка вклада в выделяемую

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 OxFFEO 3000 |х|х|х|х|х|х|х|х|х|х|х|х|х|х|х|х|

Состояние при сбросе = не определено

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 |х|х|х|х|х|х|х|х|х|х|х|х|0|0|0|0|

ТШТ-УЇІС --------------------------------------

Залипающий бит состояния 1 — прерывание таймера не генерировалось

0 — прерывание таймера генерировалось ТАЦТСЖІ-О -------------------------------------

0 — запрещение автоматической загрузки. Когда ТСОиМТ достигает нуля, таймер генерирует прерывание и останавливает работу

1 — разрешение автоматической загрузки. Когда ТСОиМТ достигает нуля, счетчик снова инициализируется значением содержимого ТРЕМОО и счет возобновляется

ТМРМГН

0 — перевод таймера в режим

пониженного потребления мощности

1 — активное состояние.

Таймер может быть включен при помощи битаТМ1?ЕМ

ТМРЕЫ

Имеет значение только при ТМРУУ!* =1

0 — выключение таймера

1 — включение таймера

Рис. 10. Формат регистра управления таймера ядра TCNTL

кристаллом тепловую мощность периферии. На сайте Analog Devices в разделе Blackfin Technical Library http://www.analog.com/ processors/blackfin/technicalLibrary/mdex.html

выложены специальные XLS-файлы. С их помощью вы можете произвести оценочный расчет выделяемой при работе на заданной частоте определенного периферийного устройства тепловой мощности. Заметим, что это будет весьма грубая оценка, так как при этих расчетах не учитывается ни топология печатной платы, ни электрические параметры подсоединяемых к процессору устройств. Поэтому необходим запас по суммарной выделяемой тепловой мощности и току источника питания. На рис. 7 изображены динамические характеристики для процессоров ADSP-BF531/2/3, из которых видно, что при низких напряжениях питания ядра предельная рабочая частота существенно снижается. Так, при 0,8 В рабочая частота процессорного ядра не превышает 250 МГц.

У процессоров ADSP Blackfin питающее напряжение ядра изменяется программированием значения поля VLEV[3:0] в регистре VR_CTL (рис. 8).

В таблице приведены значения этого 4-битового поля.

В реальной системе (особенно в опытных образцах) можно установить на корпусе процессора LQFP-176 (26x24 мм) температурный датчик, например ADI TMP05 в корпусе SOT23(2,9x1,6 мм) с ШИМ-выходом, и написать процедуру, управляющую выбором рабочей частоты и питающего напряжения ядра. Подобранные таким методом оптимальные значения коэффициентов можно включить в процедуру инициализации.

Различные режимы энергосбережения процессоров Blackfin рассмотрим чуть позже, а теперь вернемся к службе времени. Рассмотрим работу с внутренним таймером ядра. Его можно использовать для различных сервисных процедур в основном при отладке и «тонкой настройке» системы, либо когда вам катастрофически не хватает тайме-

ров общего назначения (хотя в этом случае можно выбрать кристалл семейства, где их не 3, а 4, 8 или даже 12). Но все же основная функция таймера ядра — генерировать прерывания через определенные пользователем

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

Как видим на рис. 9, этот таймер декре-ментный. Значение, которое вы записываете в регистр TCOUNT счетчика таймера ядра, через интервал TSCALE+1 тактов CCLK декрементируется. При достижении нулевого значения в регистре TCOUNT устанавливается TINT в регистре TCNTL (рис. 10). Если прерывания от таймера ядра не были разрешены, то этот бит не устанавливается. Дальнейшие действия зависят от того, была ли предварительно записана в бит TAUTORLD «1». Если да, значение регистра счетчика TCOUNT (рис. 11) инициализируется содержимым регистра TPERIOD (рис. 12) и декре-ментный счет автоматически продолжается.

Он может быть прерван записью «0» и вновь запущен записью «1». Вы можете использовать 8-битное значение TSCALE (рис. 13) для

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

п сссп 1ЛПГ I-1-1--1-1-1-1-1-1--1-1-1-1--1-1-1-1 Состояние при сбросе =

ОхРРЕО 300С 1хххх|хххх1хххх1хххх1

I—|—I-1-1-1-1-1-1-1111111^1 не определено

Значение периода [31:16]

15 14 13 12 11 10 9876543210 |х|х|х|х|х|х|х|х|х|х|х|х|х|х|х|х|

1---------------1----------------1

1------------------ Значение периода [15:0]

Рис. 11. Биты регистра счетчика таймера ядра ТСОШТ

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

п сссп ОЛЛЛ I—I—I—I—I—I—I—I—I—I—I—I—I—I—I—I—I Состояние при сбросе =

ОхРгЕО 3004 Іх х х хІх х х хІх х х хІх х х хІ

1-|—1-1-1-1-1-1-----1-1 I I I I I I I | I не определено

Значение периода [31:16]

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 |х|х|х|х|х|х|х|х|х|х|х|х|х|х|х|х|

'-----------------1------------------'

'-------------------- Значение периода [15:0]

Рис. 12. Биты регистра периода таймера ядра ТРЕМОР

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

OxFFEO 3008 ГГ X X X X X X X X X X * X X X х| Состояние при сбросе =

1 L—-I I— L—-I I— і——1 1-І —I1 не определено

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Е X X * * X X * * X X *1 * X X *1

- Значение коэффициента

масштабирования

Рис. 13. Биты регистра масштабирования таймера ядра TSCALE

изменения периодичности возникновения прерываний в 256 раз при отладке программы. Это актуально, например, для систем на основе ADSP-BF561, в котором отсутствуют RTC.

Готовый проект для процессора ADSP-BF561, использующий прерывания от таймера ядра, можно посмотреть на сайте http://www.eltech.spb.ru/techinfo.html.

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

Литература

1. ADSP-BF533 Blackfin Processor Hardware Reference.

2. Engineer-to-Engineer Note. Estimating Power for ADSP-BF531/BF532/BF533 Blackfin Processors

3. Руководство пользователя по цифровым сигнальным процессорам семейства Blackfin.

i Надоели баннеры? Вы всегда можете отключить рекламу.