Вы находитесь на странице: 1из 259

О. М.

Кочуров

ПРОГРАММИРОВАНИЕ ВСТРАИВАЕМЫХ
СИСТЕМ НА ОСНОВЕ МИКРОКОНТРОЛЛЕРОВ
LPC214X
Учебное пособие
Министерство образования и науки РФ

Владимирский государственный университет

Кафедра управления и информатики в технических


и экономических системах

Учебное пособие

ПРОГРАММИРОВАНИЕ ВСТРАИВАЕМЫХ СИСТЕМ


НА ОСНОВЕ МИКРОКОНТРОЛЛЕРОВ LPC214X

О. М. Кочуров

Владимир 2011
УДК 004.31
УДК 004.031.6

ББК 32.973–04
К75

Кочуров О. М., Программирование встраиваемых систем на основе


микроконтроллеров LPC214x. — Владимир: ВлГУ — 2011, 258 с.

Настоящее учебное пособие, состоящее из трех частей, предназначено


для изучения архитектуры и основных приемов программирования микро-
контроллеров LPC214x (производства NXP) семейства ARM7TDMI. В первой
части изложен справочный материал по аппаратным средствам микро-
контроллера. Вторая часть посвящена средствам разработки и отладки про-
грамм, прежде всего, среде Keil µVision на основе языка Си. Третья часть со-
держит описание решения типовых задач, представляющих интерес в прак-
тике разработки микропроцессорных систем.
Учебное пособие предназначено для широкого круга специалистов в
области электроники и микропроцессорной техники. Также может быть ре-
комендовано студентам бакалавриата и магистратуры, изучающим дисци-
плину «Микропроцессорная техника» и родственные дисциплины.
Перечень сокращений
АЛУ — арифметико-логическое устройство
АЦП — аналого-цифровой преобразователь
ЖК(И) — жидкокристаллический (индикатор)
МК — микроконтроллер
МП — микропроцессор
МПС — микропроцессорная система
МПУ — микропроцессорное устройство
ОЗУ — оперативное запоминающее устройство
ПД — память данных
ПЗУ — постоянное запоминающее устройство
ПК — персональный компьютер
ПП — память программ
ПУ — периферийное устройство
РОН — регистр общего назначения
РСФ — регистр специальных функций
СИФУ — система импульсно-фазового управления
УУ — устройство управления
ФАПЧ — фазовая автоподстройка частоты
ЦАП — цифро-аналоговый преобразователь
ШИМ — широтно-импульсный модулятор

3
Предисловие
Настоящее учебное пособие предназначено для изучения архитектуры
и основных приемов программирования встраиваемых однокристальных
микроконтроллеров серии LPC214x фирмы NXP. Материал изложен в трех
частях.
Первая часть преимущественно содержит материал справочного ха-
рактера — описание архитектуры и аппаратных средств микроконтроллера.
Предложенное описание, затрагивая важнейшие узлы LPC2148, не является
полным. Некоторые из аппаратных средств не рассмотрены. Изучив материал
настоящего учебного пособия читатель без труда дополнит свои знания с по-
мощью известных книг [1, 2] а также официальной документации компаний
ARM и NXP, ссылки на которые приведены в приложении.
Отметим, что первая часть не повторяет перевода официальной до-
кументации, а представляет собой авторское изложение материала. Каждый
раздел начинается с краткого описания основных возможностей одного из
узлов микроконтроллера, после чего следует основная справочная часть. В
конце разделов приводятся методические указания по настройке рассмотрен-
ных узлов и управлению ими.
Вторая часть посвящена программным и аппаратным средствам, кото-
рые необходимы для разработки программ. Здесь читатель найдет основы
представления числовой информации в памяти вычислительных устройств, а
также экскурс в программирование на языке Си. Привнести что-либо новое в
описание самого распространенного языка программирования трудно, кроме
краткости. Поэтому авторы касаются лишь наиболее важных вопросов, без
знания которых невозможна разработка ни одной программы. Авторы стре-
мились не обойти вниманием некоторые приемы программирования и кон-
струкции, которые часто возникают при программировании микроконтрол-
леров и редко в практике программирования для персональных ЭВМ. Для
углубленного изучения языка рекомендуем иметь под рукой один из извест-
ных учебников [3, 4]. Значительное внимание уделено описанию популярной
среды программирования Keil µVision 4. Авторы предложили методику от-
ладки программ.
Третья часть представляет собой методические указания по решению
практических задач. В каждом разделе дано описание алгоритмического ре-
шения очередной элементарной задачи. Аппаратной основой авторам послу-
жили учебные платы EA-EDU-001 и EA-EDU-011 фирмы Embedded Artists.
Схемотехнические узлы этих плат вполне могут считаться классическими и
легко заимствуются с помощью принципиальных схем, приведенных в при-
ложении. Тематика практических занятий охватывает весьма широкий круг
задач, возникающих в практике разработки микропроцессорных средств, та-
ких как ввод-вывод аналоговых и цифровых сигналов, опрос аналоговых,
дискретных и цифровых датчиков, индикация, обмен данными с другими
компонентами микропроцессорной системы и персональным компьютером.

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

5
Введение
Исторически первый четырехразрядный микропроцессор был разра-
ботан фирмой Intel в 1971 году для применения в настольных микрокальку-
ляторах. Микросхема i4004 выпускалась в корпусе PDIP16, выполняла
92,6 тысяч действий в секунду и адресовала всего 640 байт памяти. Система
команд первого процессора включала 46 инструкций. Давно известные прин-
ципы программного управления впервые были применены в интегральной
микросхеме. Это положило начало новому направлению микросхемотехники.
На протяжении сорока лет микропроцессорная техника может по пра-
ву считаться наиболее динамично развивающимся направлением микросхе-
мотехники. Постоянно повышаются тактовые частоты микропроцессоров,
увеличивается число полупроводниковых элементов на кристалле, усложня-
ются операционные узлы и система команд.
Универсальные микропроцессоры, предназначенные для решения ши-
рокого круга задач, связанных с обработкой цифровой информации, стали
основой для построения персональных компьютеров. Благодаря высокому
быстродействию, разрядности и объему адресуемой памяти такие микропро-
цессоры отличаются способностью выполнять громоздкие алгоритмы за при-
емлемое время.
Чрезвычайная гибкость микропроцессоров сделала их привлекатель-
ными для применения в составе разнообразных технических изделий от бы-
товых приборов до промышленных установок. По мере широкого распро-
странения микропроцессоров возникла необходимость в разработке эконо-
мичных, компактных и исключительно надежных микропроцессорных си-
стемы, причем, в кратчайшие сроки.
Высокопроизводительные универсальные микропроцессоры не удо-
влетворяют таким потребностям. Их ядро представляет собой набор взаимо-
действующих интегральных микросхем высокой степени интеграции с боль-
шим числом выводов. При этом требуется изготовление печатных плат высо-
кого класса плотности монтажа. Передача цифровых сигналов в микропро-
цессорных системах осуществляется в диапазоне высоких и ультравысоких
частот, что также выдвигает жесткие требования к технологии изготовления
аппаратуры. Кроме того, универсальные микропроцессоры не приспособле-
ны для непосредственного взаимодействия со средой, требуя еще и сложных
средств сопряжения.
Разрешить возникшие противоречия позволило создание микро-
контроллеров. Эти устройства представляют собой совмещение всех элемен-
тов микропроцессорной системы на одном кристалле.
Микроконтроллеры предназначены для решения задач управления
объектом в реальном времени. Помимо микропроцессорного ядра содержат
встроенные память для программы и данных, а также периферийные устрой-
ства для сопряжения с объектом. Как правило, микроконтроллеры обладают
меньшим быстродействием, разрядностью и объемом памяти, чем универ-

6
сальные микропроцессоры, но выделяются развитыми средствами для ввода
и вывода дискретных и аналоговых сигналов.
Первый микроконтроллер i8051 также был разработан фирмой Intel в
1980 году. Это был 8-разрядный микроконтроллер, выполненный в виде мик-
росхемы в корпусе PDIP40. Архитектура 8051 (или ее развитие 8052), реали-
зованная во множестве модификаций микроконтроллеров, чрезвычайно по-
пулярна до настоящего времени и будет оставаться популярной еще, по
меньшей мере, десять лет.
Число семейств микроконтроллеров, разработанных за тридцатилет-
нюю историю, по всей видимости, исчисляется сотнями, а в каждом семей-
стве насчитывается до нескольких десятков микросхем. Разнообразие дей-
ствительно огромно: от очень простых микросхем всего с шестью выводами
до сложных однокристальных систем ввода, вывода и обработки сигналов.
Сегодня микроконтроллеры чрезвычайно распространены, составляя
основу для построения так называемых встраиваемым систем, то есть микро-
процессорных систем, встроенных в какое либо изделие и управляющее им
или его узлами. С использованием микроконтроллеров конструируется со-
временное промышленное оборудование, контрольно-измерительные прибо-
ры, бортовые устройства транспортных средств, медицинские и бытовые
приборы. Знание архитектур распространенных микропроцессоров и микро-
контроллеров, владение приемами их программирования и отладки программ
необходимы инженеру, работающему в этих областях техники.

7
Часть 1. Архитектура и аппаратные средства
микроконтроллера LPC214x

1.1 Общие сведения о микроконтроллерах LPC214x


Рассматриваемый в настоящем учебном пособии микроконтроллер
LPC214x фирмы NXP построен на основе архитектуры ARM7. Архитектура
ARM7 создана в 1994 году компанией ARM (Advanced RISC Machines), спе-
циализирующейся на разработке процессорных ядер. ARM7 стоит в ряду
других разработок этой компании, среди которых наиболее известны ARM9,
Cortex-M0/M3/M4. Компания ARM предоставляет лицензии на использова-
ние архитектур процессоров ведущим мировым производителям, таким как
Atmel, NXP, STMicroelectronics, Texas Instruments, Analog Devices.
Микроконтроллеры на базе архитектуры ARM7 сегодня входят в чис-
ло лидеров по популярности среди 32-разрядных микроконтроллеров. Можно
ожидать, что в ближайшие годы архитектура ARM7 и родственные ей Cortex
будут постепенно заменять архитектуру 8051/8052, сохраняющую популяр-
ность на протяжении 30 лет. Об этом свидетельствует пример компании Ana-
log Devices, многие годы выпускавшей микроконтроллеры ADUC8xx со
встроенными прецизионными аналоговыми устройствами только на базе яд-
ра 8052. Сравнительно недавно (с 2004 г) Analog Devices начала выпуск мик-
роконтроллеров ADUC7xxx на базе ядра ARM7.
В данном учебном пособии рассматривается модификация
ARM7TDMI, отличающаяся поддержкой 16-разрядного режима Thumb,
наличием встроенного умножителя и поддержкой внутрисхемной отладки
через интерфейс JTAG. Перечислим основные характеристики ядра
ARM7TDMI:
а) 32-разрядный RISC процессор;
б) фон-неймановская архитектура; единое адресное пространство для
памяти программ и данных объемом 4 Гбайта;
в) 16 регистров общего назначения (в основном режиме);
г) обработка исключительных ситуаций;
д) устройство циклического сдвига и умножитель;
е) система команд, включающая 44 инструкции;
ж) поддержка 11 методов адресации;
е) 16-разрядный режим, позволяющий сократить объем программы.
Могут быть названы следующие основания для выбора микро-
контроллеров с архитектурой ARM7.
а) Открытая архитектура становится общепринятым стандартом.
Имеются исчерпывающие описания, в том числе на русском языке.
б) Поддержка ядра многими ведущими производителями гарантирует
широкую номенклатуру микроконтроллеров, облегчая выбор микросхемы,
удовлетворяющей заданным техническим требованиям.
в) Совместимость средств разработки и отладки со всеми микро-
контроллерами семейств ARM (в том числе Cortex) дает свободу выбора как
самих средств отладки, так и микроконтроллеров. Наиболее известны среды
8
разработки с интегрированным Си-компилятором: µVision фирмы Keil и Em-
bedded Workbench фирмы IAR. Внутрисхемная отладка обеспечивается таки-
ми средствами, как U-Link2 (фирмы Keil), J-Link (фирмы Segger), а также их
многочисленными дешевые аналогами.
В дальнейшем будем рассматривать микроконтроллер LPC2148 фир-
мы NXP (старший из серии LPC214x), который можно назвать типичным
представителем семейства ARM7. Приведем основные параметры и перечис-
лим наиболее важные встроенные аппаратные средства этой микросхемы.
а) Максимальная тактовая частота 60 МГц.
б) ПЗУ (FLASH-память) объемом 512 кбайт.
в) ОЗУ объемом 40 кбайт.
г) Два 32-разрядных таймера-счетчика, модуль ШИМ с отдельным
таймером, сторожевой таймер, часы реального времени с автономным пита-
нием и тактированием.
д) Два десятиразрядных АЦП с временем преобразования 2,44 мкс.
е) Десятиразрядный ЦАП с временем установления 1 мкс.
ж) Приемопередатчики интерфейсов: два UART, два I2C, SPI, SSP,
USB 2.0 в режиме Full Speed (12 МГц) с прямым доступом к памяти.
и) Гибкая система управления энергопотреблением.
Следующие разделы первой части настоящего учебного пособия по-
священы описанию архитектуры ARM7TDMI и аппаратных узлов микро-
контроллера LPC2148.

1.2 Программистская модель процессорного ядра ARM7TDMI


Составляя программу, программист в основном абстрагируется от
устройства аппаратных средств микропроцессора и имеет дело лишь с реги-
страми общего назначения, регистрами специальных функций и набором
ячеек памяти. Эти ресурсы будем называть программистской моделью мик-
ропроцессора или микроконтроллера. Схема программистской модели и ор-
ганизации памяти приведена на рисунке 1.2.1.
1.2.1 Режимы работы ядра ARM7
Процессорное ядро ARM7 имеет шесть режимов работы. От выбран-
ного режима зависит доступный набор регистров общего назначения. Смена
режима может происходить аппаратно или выполняться программно путем
записи кода в регистр состояния программы СPSR (раздел 1.2.2) командой
MSR. Ниже перечислены все режимы и даны краткие пояснения по поводу
назначения каждого из них (см. также раздел 1.6).
а) Режимы User и System предназначены для выполнения программы
пользователя или операционной системы; это основной режим работы ядра.
б) Supervisor — режим программного прерывания. Приход в этот ре-
жим происходит при сбросе, выполнении инструкции SWI или переполнении
счетчика команды.
в) Переход в режим Abort происходит при обращении к недопусти-
мому адресу памяти (исключительные ситуации PAbort и DAbort).

9
г) Переход в режим Undefined производится в случае попытки вы-
полнения неопределенной команды (исключительная ситуация Undefined).
д) IRQ — режим прерывания, классифицированного как IRQ.
е) FIQ — режим прерывания, классифицированного как FIQ (быстрое
прерывание).
Все режимы кроме User называются привилегированными. В этих ре-
жимах доступны некоторые функции управления ядром, которые не доступ-
ны в режиме User.
1.2.2 Система регистров
Арифметико-логическое устройство МК взаимодействует с 16 реги-
страми общего назначения, обозначаемыми R0–R15 (рисунок 1.2.1). Реги-
стры R0–R12 доступны для размещения данных. Регистр R13 (SP) служит
указателем стека; в нем хранится адрес вершины стека, организованного в
памяти данных. R14 (LR) — регистр связи, предназначенный для хранения
адреса возврата при вызове прерываний и подпрограмм. R15 (PC) — счетчик
команд, содержащий адрес следующей команды.
В каждом привилегированном (то есть кроме User/System) режиме
имеется своя пара регистров R13, R14. На схеме (рисунок 1.2.1) они обозна-
чены R13_xxx, R14_xxx, где xxx — идентификатор режима. При смене ре-
жима используются эти копии, а оригинальное содержимое R13, R14 основ-
ного режима User/System сохраняется неизменным. Это необходимо для пол-
ного восстановления состояния ядра при возврате в режим User/System.
Вполне очевидно, что счетчик команд R15 не должен ни сохраняться, ни вос-
станавливаться при смене режима, поэтому он не имеет копий. Для режима
быстрого прерывания FIQ предусмотрен второй набор регистров R8–R12.
Эти «дублеры» R8–R12 можно использовать в процедуре обработки быстро-
го прерывания, не затрачивая времени на сохранение в стек оригинальных
регистров режима User/System и на последующее их восстановление.
Регистр состояния программы CPSR содержит флаги результатов
арифметических операций и биты управления режимом ядра (раздел 1.2.3).
Изменение регистра CPSR программным путем возможно только в привиле-
гированных режимах. Для сохранения слова состояния программы имеются
регистры SPSR_xxx, где xxx — идентификатор режима.
1.2.3 Слово состояния программы
Схема флагов и управляющих битов слова состояния программы
CPSR показана на рисунке 1.2.1 (внизу).
Флаги результата арифметических операций, устанавливаются авто-
матически при обработке данных в АЛУ инструкциями, вызванными с моди-
фикатором {S} (раздел 1.4 и таблица 1.4.2). В таблице 1.2.1 даны примеры
влияния на флаги операции сложения. Рассмотрим назначение флагов слова
состояния программы CPSR.
● Бит 31 (N) — флаг устанавливается в единицу, если результат вы-
числений в АЛУ отрицательный, то есть если старший (31-ый) разряд ре-
зультата равен единице.
10
User/System FIQ Supervisor Abort IRQ Undefined 0xFFFFFFFF
Режимы: Выполнение Быстрое Программное Ошибка Прерывание Неопределен- Устройства AHB
0xF0000000
программы прерывание прерывание адреса ная команда 0xEFFFFFFF
R0 R0 Устройства VPB
R0 R0 R0 R0 0xE0000000
R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2 Загрузчик 0x7FFFFFFF

R3 R3 R3 R3 R3 R3 12 кбайт 0x7FFFD000
R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5 Буфер USB 0x7FD01FFF
Регистры
общего R6 R6 R6 R6 R6 R6 8 кбайт 0x7FD00000
назначения R7 R7 R7 R7 R7 R7
0x40007FFF
R8 R8_fiq R8 R8 R8 R8 Память данных
R9 R9_fiq R9 R9 R9 R9 ОЗУ
32 кбайта 0x40000000
R10 R10_fiq R10 R10 R10 R10
Порты 0x3FFFFFFF
R11 R11_fiq R11 R11 R11 R11
ввода-вывода 0x3FFF8000
R12 R12_fiq R12 R12 R12 R12
Указатель стека R13 (SP) R13_fiq R13_svc R13_abt R13_irq R13_und
0x0007FFFF
Адрес возврата R14 (LR) R14_fiq R14_svc R14_abt R14_irq R14_und Память программ
Счетчик команд R15 (PC) R15 R15 R15 R15 R15 Flash-ПЗУ
512 кбайт 0x00000040
Регистр состояния CPSR CPSR CPSR CPSR CPSR CPSR 0x0000003F
Резерв

(на примере микроконтроллера LPC2148)


Регистры сохраненного состояния SPSR_fiq SPSR_svc SPSR_abt SPSR_irq SPSR_und 0x00000020
Fast Int. Request 0x0000001C
Int. Request 0x00000018
31 30 29 28 27 8 7 6 5 4 3 0
Checksum 0x00000014
CPSR N Z C V I F T MODE Data Abort 0x00000010
Prefetch Abort 0x0000000C
Переполнение Разрешить прерывания IRQ Sowftware Int. 0x00000008
Thumb Режим
векторов прерываний
Отображаемая область

Перенос Разрешить прерывания FIQ

Рисунок 1.2.1 – Программистская модель и организация памяти ядра ARM7


Отрицатель- Undefined 0x00000004
ный результат Нулевой результат Reset 0x00000000

11
Таблица 1.2.1 – Примеры влияния операции сложения на флаги результата
Операция Результат C V N Z
1 0 0 0
0 1 0 0
0 0 1 0
1 1 0 0
1 0 0 1
0 1 1 0
1 0 1 0
● Бит 30 (Z) — флаг устанавливается в единицу, если результат вы-
числений в АЛУ равен нулю.
● Бит 29 (С) — флаг переноса, инверсный влаг заема. При сложении
беззнаковых чисел флаг устанавливается в единицу, если произошел перенос
из 31-го разряда, то есть если результат вычислений в АЛУ больше .
При вычитании беззнаковых чисел флаг сбрасывается в ноль, если произо-
шел заем из несуществующего 32-го разряда, то есть если результат вычис-
лений в АЛУ меньше нуля.
● Бит 28 (V) — флаг арифметического переполнения. При сложении и
вычитании чисел со знаком флаг устанавливается в единицу, если результат
вычислений в АЛУ больше или меньше . Такой результат приво-
дит к потере знака. Иными словами, флаг устанавливается в единицу, если
знаковый (31-ый) разряд обоих операндов одинаков и отличается от знаково-
го разряда результата.
● Бит 7 (I) — бит запрета прерываний IRQ. Устанавливается аппарат-
но в единицу в исключительных ситуациях Reset, SWI, IRQ, FIQ. Равенство
единице запрещает прерывания IRQ при сбросе и в одноименных режимах.
● Бит 6 (F) — бит запрета прерываний FIQ. Устанавливается в едини-
цу аппаратно в исключительных ситуациях Reset, FIQ. Равенство единицы
запрещает прерывания FIQ при сбросе и в режиме FIQ.
● Бит 5 (T) — бит перевода ядра в 16-разрядный режим Thumb ( ).
В режиме Thumb меняется программистская модель и система команд мик-
роконтроллера. Производительность в режиме Thumb снижается, но благода-
ря коротким 16-разрядным командам сокращается расход памяти программ.
Режим Thumb в настоящем учебном пособии не рассматривается.
Таблица 1.2.2 – Управление режимом работы ядра через регистр CPSR
Режим Mode (двоичные и шестнадцатеричные значения)
User 10000 (0x10)
FIQ 10001 (0x11)
Привилегир.

Исключ.

IRQ 10010 (0x12)


Supervisor 10011 (0x13)
Abort 10111 (0x17)
Undefined 11011 (0x1B)
System 11111 (0x1F)

12
● Биты 0–4 (Mode) — код управления режимом работы микро-
контроллера (раздел 1.2.1) в соответствии с таблицей 1.2.2.
1.2.4 Организация памяти
В состав системы памяти входит память программ, память данных и
массив управляющих регистров.
Ядро ARM7 основано на фон-неймановской архитектуре. Это значит,
что одна и та же шина используется для передачи команд и данных. Имеется
единое адресное пространство для памяти программ, данных и управляющих
регистров; обращение к этим областям памяти выполняется одними и теми
же командами (в основном LDR и STR). Шина адреса имеет разрядность
32 бита, соответственно объем адресного пространства составляет 4 Гбайта.
Единое адресное пространство и возможность размещения частей
программы в памяти данных делают неточными термины «память программ»
и «память данных». Поэтому далее будем чаще называть их ПЗУ и ОЗУ.
Схема распределения памяти показана на рисунке 1.2.1. На схеме вы-
делены области памяти данных, памяти программ, а также области портов
ввода-вывода и устройств AHB и APB.
Память программ предназначена для постоянного хранения про-
граммы и используемых ей констант. Память программ представляет собой
электрически перепрограммируемое ПЗУ (FLASH) объемом 512 кбайт. К
этой области относятся адреса 0x00000000–0x3FFF7FFF и 0x7FFFD000–
0x7FFFFFFF (загрузчик).
Адреса 0x00000000–0x0000003F в начальной области памяти (отделе-
ны пунктирной линией) принадлежат векторам исключительных ситуаций и
прерываний. В LPC2148 из них используются первые восемь 32-разрядных
ячеек с адресами 0x00000000–0x0000001С. При возникновении исключи-
тельной ситуации или прерывания управление передается команде, располо-
женной по одному из этих адресов. Подробнее вопросы обработки исключе-
ний рассматриваются в разделах 1.6 и 1.11. Здесь коснемся лишь ячейки с ад-
ресом 0x00000014 (Checksum). Ячейка предназначена для хранения
32-разрядной контрольной суммы остальных семи ячеек. Контрольная сумма
используется процедурой начальной загрузки (раздел 1.5).
Основное назначение памяти данных — хранение переменных, со-
здаваемых программой. Встроенная память данных является статическим
ОЗУ объемом 40 кбайт, из которых 8 кбайт служат буфером для приемопере-
датчика USB, хотя могут использоваться и для общих целей. ОЗУ занимает
адреса выше 0x40000000.
Управляющие регистры предназначенных для взаимодействия ядра
с периферийными устройствами микроконтроллера и системой прерываний.
Обмен данными с управляющими регистрами осуществляется через две
внутренние шины: шину высокого быстродействия (AHB — Advanced High-
performance Bus) и шину периферийных устройств (APB — ARM Peripheral
Bus). Через шину AHB ведется управление системой прерываний; остальные
регистры подключены к шине APB. Управляющим регистрам отведены адре-

13
са выше 0xE0000000. Отдельная область памяти 0x3FFF8000–0x3FFFFFFF
предназначена для регистров управления портами в быстром режиме.
Организация памяти в ARM7 байтовая. Это значит, что каждый адрес
указывает на ячейку размером 1 байт. В то же время хранимые в памяти дан-
ные выравниваются соответственно их разрядности. Поэтому при обращении
к 16-разрядному слову адрес должен быть четным; для 32-разрядного слова
адрес должен быть кратным четырем (закачиваться на шестнадцатеричные
цифры 0, 4, 8, С). Обращение в байтовом режиме возможно к любому адресу.
Данные, занимающие более одного байта, хранятся с обратным по-
рядком байт. Младший байт размещается по адресу с меньшим номером;
старший байт — по адресу с большим номером.

1.3 Система команд


Cведения системе команд и методах адресации (раздел 1.4) необходи-
мы программисту в ходе отладки, так как время от времени приходится при-
бегать к чтению дизассемблированной программы. Основы программирова-
ния на ассемблере рассмотрены в разделе 2.5. Там же читатель найдет при-
мер простой программы.
Система команд ядра ARM7 включает всего 44 инструкции (не считая
NOP). Отличительная особенность в том, что все инструкции являются услов-
ными. Каждая команда может быть выполнена или пропущена в зависимости
от флагов состояния программы. Для этого в коде команды предусмотрено
поле условия. На языке ассемблера условие обозначается двумя буквами
непосредственно после мнемоники команды (сливается с командой в одно
слово). Допустимые условия приведены в таблице 1.3.1.
Таблица 1.3.1 – Обозначения условных полей
Обознач. Условие Описание
EQ Равенство. Флаг нуля установлен
NE Неравенство. Флаг нуля сброшен
CS/HS Больше или равно (без знака). Перенос
CC/LO Меньше (без знака). Флаг переноса сброшен
MI Отрицательный результат
PL Положительный или нулевой результат
VS Флаг переполнения установлен
VС Флаг переполнения сброшен
HI Больше (без знака)
LS Меньше или равно (без знака)
GE Больше или равно (со знаком)
LT Меньше (со знаком)
GT Больше (со знаком)
LE Меньше или равно (со знаком)
AL Всегда (безусловное выполнение)
NV Никогда

14
Перечень команд, сгруппированных по выполняемым функциям, при-
веден в таблице 1.3.2 (см. также о псевдокомандах в разделе 2.5). Кратко рас-
смотрим каждую из групп.
1.3.1 Команды арифметической и логической обработки
Команды этой группы предназначены для выполнения арифметиче-
ских действий (сложение, вычитание) с целыми числами, а также логических
операций (конъюнкция, дизъюнкция, исключающее «ИЛИ»). Команды явля-
ются трехадресными и все имеют общий синтаксис:
Операция{Усл}{S} , ,
При этом Операция, определяемая мнемоническим обозначением, выполня-
ется над операндами и . Результат операции помещается в .
Здесь , любые регистры общего назначения (R0–R15). ,
занимающий 12 разрядов в коде команды, может быть адресован непосред-
ственным или регистровым методом (раздел 1.4.1 и таблица 1.4.1).
Операнд может отсутствовать или совпадать с . Эти случаи ин-
терпретируются одинаково — служит и первым операндом, и приемником.
Имеется необязательный модификатор «S», который указывает на
необходимость обновления флагов состояния программы. Без этого модифи-
катора обновление не происходит. Независимо от результата выполнения
команды флаги результат остаются неизменными.
Примеры:
ADD R0, R1, R2 ; R0 = R1 + R2
AND R0, R1, #0x80 ; R0 = R1 & 0x80
ADD R0, R1 ; R0 += R1
ADDEQ R0, R1, R2 ; if (Z) R0 = R1 + R2
1.3.2 Команды умножения
Команды выполняют умножение 32-разрядных целых чисел. Операн-
дами и приемником результата могут служат регистры общего назначения.
Имеются команды для умножения с накоплением. Результат может
быть 32- или 64-разрадным. Команды с 32-разрядным результатом отбрасы-
вают старшую часть. 64-разрядный результат размещается в паре регистров
общего назначения.
Примеры:
MUL R0, R1, R2 ; R0 = (long)(R1 * R2)
MLA R0, R1, R2, R3 ; R0 = (long)(R1 * R2 + R3)
Влияние команд на флаги состояния включается модификатором «S».
1.3.3 Команды регистровой пересылки
Команды пересылки предназначены для загрузки регистра короткой
константой или для копирования содержимого одного регистра в другой.
Команды двухадресные; второй операнд может быть задан непосредственно
(константа) или адресован регистровым способом. При копировании воз-
можна инверсия (команда MVN) или сдвиг.

15
Таблица 1.3.2 – Система команд процессорного ядра ARM7
Мнемоническое обозначение Операция Краткое описание
Команды арифметической обработки
ADD{Усл}{S} , , Арифметическое сложение
ADC{Усл}{S} , , Арифметическое сложение с переносом
SUB{Усл}{S} , , Вычитание
SBC{Усл}{S} , , Вычитание с учетом заема
RSB{Усл}{S} , , Обратное вычитание
RSС{Усл}{S} , , Обратное вычитание с учетом заема
Команды логической обработки
AND{Усл}{S} , , Логическое умножение (И)
ORR{Усл}{S} , , Логическое сложение (ИЛИ)
EOR{Усл}{S} , , Исключающее ИЛИ (сложение по модулю 2)
BIC{Усл}{S} , , Сброс битов в ноль
Команды регистровой пересылки
MOV{Усл}{S} , Копирование регистра или загрузка константы
Копирование регистра или загрузка константы
MVN{Усл}{S} ,
с инверсией
Команды сравнения и тестирования
CMN{Усл} , Сравнение с отрицательным числом
CMP{Усл} , Сравнение с положительным числом
TEQ{Усл} , Проверка равенства
TST{Усл} , Тестирование
Команды умножения c 32-разрядным результатом
MUL{Усл}{S} , , Умножение (с учетом знаков)
MLA{Усл}{S} , , , Умножение с накоплением (с учетом знаков)

16
Таблица 1.3.2 – Продолжение
Мнемоническое обозначение Операция Краткое описание
Команды умножения с 64-разрядным результатом
SMULL{Усл}{S} , , , Умножение учетом знака
SMLAL{Усл}{S} , , , Умножение с накопл. (с учетом знака)
UMULL{Усл}{S} , , , Умножение положительных чисел
UMLAL{Усл}{S} , , , Умножение полож. чисел с накоплением
Команды загрузки регистров из памяти
LDR{Усл} , Загрузка регистра
LDR{Усл}B , ; Загрузка регистра байтом
Загрузка регистра байтом
LDR{Усл}BT , ;
c эмуляцией режима User
LDR{Усл}H , ; Загрузка регистра двухбайтным словом
; Загрузка регистра байтом
LDR{Усл}SB ,
c дополнением знака
Загрузка регистра двухбайтовым словом
LDR{Усл}SH ,
c дополнением знака
Загрузка регистра
LDR{Усл}T ,
c эмуляцией режима User
Команды сохранения регистров в память
STR{Усл} , Сохранение регистра в память
STR{Усл}B , Сохранение в память мл. байта регистра
Сохранение в память младшего байта
STR{Усл}BT ,
регистра с эмуляцией режима User
STR{Усл}H , Сохранение в память мл. слова регистра
Сохранение регистра в память с эмуля-
STR{Усл}T ,
цией режима User
17
Таблица 1.3.2 – Продолжение
Мнемоническое обозначение Операция Краткое описание
Команды перестановки регистров и ячеек памяти
SWP{Усл} , ,[ ] ; Обмен между регистрами и памятью
SWP{Усл}B , ,[ ] Обмен байтов между регистрами и памятью
Команды пакетной пересылки
LDM{Усл}IA {!},
Загрузить блок памяти Методы адресации:
LDM{Усл}IB {!},
с базовым адресом равным IA (FD) — постинкрементный;
LDM{Усл}DA {!},
в список Регистров IB (ED) — преинкрементный;
LDM{Усл}DB {!},
DA (FA) — постдекрементный;
STM{Усл}IA {!},
Сохранить список Регистров DB (EA) — предекрементный.
STM{Усл}IB {!},
в блок памяти, Список регистров задается в фигурных скобах через
STM{Усл}DA {!}, запятую или тире, например, {R0–R3, R5}
начиная с адреса в
STM{Усл}DB {!},
Команды передачи управления
B{Усл} Передача управления по непосредственному адресу
BL{Усл} ; Передача управления с сохранением адреса возврата
Передача управления по адресу в регистре
BX{Усл}
со сменой режима ARM/Thumb
SWI{Усл} Вызов прерывания Software Interrupt; перевод процессора в режим ARM Supervisor
Команды обращения к слову состояния программы
MRS{Усл}{S} , CPSR
Сохранение или в регистр
MRS{Усл}{S} , SPSR
MSR{Усл} CPSR_Поля, #
MSR{Усл} SPSR_Поля, # Запись константы или регистра в разряды флагов в или .
MSR{Усл} CPSR_Поля, Поля задают копируемые байты: c — 0, x — 1, s — 2, f — 3
MSR{Усл} SPSR_Поля,
18
Ограниченная разрядность поля операнда не позволяет загружать
произвольную 32-разрядную константу. Непосредственно в коде команды
могут размещаться только 8-разрядные константы с 4-разрядным смещением
(раздел 1.4.1). Для загрузки 32-разрядных констант используются команды
обмена с памятью. Влияние команд пересылки на флаги состояния разреша-
ется или запрещается модификатором «S». Формат команд:
MOV{Усл}{S} ,
MVN{Усл}{S} ,
Операнд12 копируется в регистр-приемник (R0–R15).
Примеры:
MOV R0, #0x80 ; R0 = 0x80
MVN R0, R1, LSR #2 ; R0 = ~(R1 << 2)
Для загрузки «полноценных» 32-разрядных констант служит псевдо-
команда
LDR{Усл} ,=
При этом константа размещается в отдельной ячейке памяти программ, адрес
которой задается 12-разрядным кодом, обычно в виде смещения по отноше-
нию к счетчику команд.
1.3.4 Команды загрузки и сохранения регистров
Эти команды предназначены для загрузки в регистры общего назна-
чения содержимого ячеек памяти и сохранения в память содержимого реги-
стров. Команды двухадресные, имею общий формат
Команда{Усл} , /
Поддерживается косвенная или индексная адресация (раздел 1.4.2). Имеется
несколько модификаций команд этой группы (таблица 1.3.2) для пересылки
байтов и двухбайтных слов. Как указывалось выше, при передаче 16-
разрядного слова адрес обязательно должен быть четным, а при передаче 32-
разрядного слова — кратным четырем. На флаги состояния программы ко-
манды эти команды не влияют.
Примеры:
STR R1, [R2] ; *R2 = R1
LDR R1, [PC, #0x58] ; R1 = *(PC + 0x58)
К этой же группе относится команды SWP одновременно загружаю-
щую и сохраняющую регистры. С помощью SWP можно «перестановить ме-
стами» содержимое регистра и ячейки памяти.
1.3.5 Команды пакетного обмена с памятью
Основное назначение таких команд — сохранение регистров в стек и
последующем их восстановлении. В адресной части команды указывается ре-
гистр, содержащий базовый адрес блока памяти, перечень регистров общего
назначения, содержимое которых требуется сохранить в блок памяти или за-
грузить этим блоком, а также метод адресации. Поддерживается автоинкре-
ментный и автодекрементный виды адресации.

19
Пример:
STMDB SP!, {R1-R2} ; *(SP-=4) = R1; *(SP-=4) = R2
LDMIA SP!, {R3} ; *SP = R3; SP += 4
1.3.6 Команды передачи управления
Команды служат для безусловных и условных переходов (ветвлений)
и вызова подпрограмм. Поскольку все команды ARM7 являются условными,
достаточно всего трех команд B (перехода по непосредственному адресу) BL
(переход с сохранением адреса возврата в LR) и BX (переход по адресу в ре-
гистре).
Адрес перехода, заданный непосредственно, кодируется как 24-
разрядное смещение (включая знак), которое умножается на 4 и прибавляется
к текущему значению счетчика команд. Фактически реализуется операция

В мнемонической записи команды на ассемблере указывается абсолютный


адрес, который при ассемблировании заменяется относительным.
Примеры:
BNE 0x380 ; if (Z == 0) PC = 0x380
BL 0x380 ; LR = PC + 4; PC = 0x380
1.3.7 Команды обращения к слову состояния программы
Команды этой группы предназначены для загрузки и сохранения сло-
ва состояния программы CPSR и его копии SPSP для текущего режима ядра.
Возможно загрузка 8-разрядной константой с 4-разрядным смещением ( )
или содержимым регистра общего назначения ( ). Копирование выполня-
ется с наложением маски. Примеры:
MRS CPSR, R0 ; R0 = CPSR
MSR CPSR_c, #0x10 ; Загрузить 0x10 в младший байт
MSR SPSR_cxsf, R0 ; SPSR = R0
Сюда же отнесем команду вызова программного прерывания SWI. Эта
команда переводит ядро в режим Supervisor и в режим ARM (если ядро нахо-
дилось в 16-разрядном режиме Thumb), после чего передает управление по
вектору программного прерывания.

1.4 Методы адресации


Адрес ячейки памяти или регистра общего назначения, к которым
производится фактическое обращение, называется исполнительным адресом.
Методом адресации называется способ формирования исполнительного ад-
реса. Методы адресации различаются в зависимости от того, где расположе-
ны операнды и каким образом их расположение задано в коде операции.
Ядро ARM7 поддерживает все наиболее распространенные в микро-
процессорной технике методы адресации кроме прямой. Прямая адресация,
предполагающая хранение адреса операнда в коде операции, не может быть
реализована. Длина всех команд ARM7 одинакова и составляет 32 бита. По-

20
этому длинные 32-разрядные адресе не могут размещаться в коде операции.
Ниже рассмотрены поддерживаемые методы адресации.
Важный материал далее представлен в форме таблиц (1.4.1–1.4.3). В
таблицах использованы следующие обозначения: текст, набранный шрифтом
Consolas, не допускает изменения, так как является мнемоническим обозна-
чением или элементами синтаксиса. Текст, оформленный наклонным шриф-
том Times, представляет собой операнды. Вместо него подставляются кон-
станты, адреса или имена регистров, содержащих обрабатываемые данные.
Элементы в фигурных скобках «{ }» не обязательны и могут быть опущены.
1.4.1 Непосредственная адресация
Непосредственная адресация наряду с регистровой применяется в ко-
мандах арифметической и логической обработки. Непосредственная адреса-
ция наиболее проста. Операндом является числовая константа располо-
женная непосредственно в коде операции.
Пример (третий операнд адресован непосредственно):
SUB R2, R0, #0x80000001 ; R2 = R0 - 0x80000001
Разрядность поля операнда ограничена 12 битами. Это поле состоит
из двух частей: восьмиразрядной , и четырехразрядной . Операнд фор-
мируется путем циклического сдвига вправо константы на разряда.
Допустимыми являются только числа, которые могут быть представлены та-
ким способом. Характерный пример — число 0x80000001 (шестнадцатерич-
ное), которое получается путем сдвига числа 6 (двоичная запись ) на два
разряда вправо. В то же время число , для записи которого в обычном
прямом двоичном коде требуется всего девять разрядов, недопустимо, так
как все эти разряды содержат единицы. Определить множество допустимых
чисел с помощью удобной математической формулы вряд ли возможно.
1.4.2 Регистровая адресация
Регистровая адресация (короткая прямая) — вторая разновидность ад-
ресации в арифметико-логических командах. При регистровой адресации
операнд расположен в одном из регистров .
Пример (все три операнда адресованы регистровым способом):
ORR R3, R3, R2 ; R3 = R3 | R2
Здесь примеры сопровождаются комментариями (через «;»), поясняющими
выполняемые командой действия. При этом использован синтаксис языка Си.
В коде команды номер регистра обозначается коротким 4-разрядным
полем. Это позволяет включить три адресных поля в сравнительно длинные
32-разрядные команды ARM7.
Кроме базового варианта поддерживается несколько видов сдвига ре-
гистрового операнда. Способ сдвига обозначается специальным ключевым
словом. Число разрядов сдвига обозначается непосредственно константой
или хранится в регистре общего назначения. Примеры:
ADD R0, R0, R1, LSR #4 ; R0 = R0 + R1 >> 4
ADD R0, R0, R1, LSR R2 ; R0 = R0 + R1 >> R2

21
Сдвиг применим только к последнему третьему операнду (в примере
это регистр R1). В таблице 1.4.1 приведены допустимые варианты регистро-
вой адресации со сдвигом.
Таблица 1.4.1 – Непосредств. и регистровая адресация (операнд типа )
Метод адресации Сдвиг операнда
Непосредственная # —
Регистровая —
, LSL # Логический влево на разрядов
Регистровая с , LSR # Логический вправо на разряд
непосредственным , ASL # Арифм. вправо на разряд
сдвигом , ROR # Циклич. вправо на разряд
, RRX Цикл. вправо через перенос на 1 разр.
, LSL Логический влево на разрядов
Регистровая с
, LSR Логический вправо на разрядов
регистровым
, ASL Арифм. вправо на разрядов
сдвигом
, ROR Циклический вправо на разрядов
1.4.3 Косвенная адресация
Косвенная адресация применяется только в командах обмена с памя-
тью. Предполагается, что 32-разрядный исполнительный адрес хранится в
одном из регистров общего назначения, в то время как в коде операции хра-
нится лишь короткая 4-разрядная ссылка на этот регистр, играющий роль
указателя. Пример:
LDR R0, [R1] ; R0 = *R1
Разумеется, регистр-указатель должен быть предварительно загружен нуж-
ным адресом.
1.4.4 Индексная адресация
Индексная адресация является развитием косвенной и так же как кос-
венная применяется в командах сохранения, загрузки и обмена с памятью.
При индексной адресации исполнительный адрес вычисляется как сумма или
разность базового адреса и смещения. Базовый адрес хранится в регистре
общего назначения ( ). Смещение может быть задано непо-
средственно числовой константой или тоже храниться в одном из регистров
общего назначения.
После выполнения операции исполнительный адрес может быть поте-
рян, либо сохранен. В последнем случае регистр, хранящий базовый адрес,
модифицируется, то есть увеличивается на величину смещения. Причем ба-
зовый адрес может модифицироваться на величину смещения до обращения
к памяти или после. По этому признаку различают преиндексную адресацию
и постиндексную.
Кроме того смещение, прибавляемое к базовому адресу или вычитае-
мое из него, может быть подвергнуто сдвигу. Поддерживается несколько ви-
дов сдвига (таблица 1.3.2).

22
Таблица 1.4.2 – Косвенная и индексная адресация (операнд типа )
Метод Исполн. Содержимое
Вид сдвига
адресации адрес после операции
Косвенная [ ] — — —
Непоср.
[ ], #± —
Постиндексная

смещ.
[ ], ± — —
Регистровое

со сдвигом
смещение

[ ], ± , LSL # Логический влево на разрядов


[ ], ± , LSR # Логический вправо на разрядов
[ ], ± , ASR # Арифметич. право на разрядов
[ ], ± , ROR # Циклический вправо на разрядов
Непоср.
[ , #± ]{!} —

модификатора {!}
Rn не меняется без
смещ.
Преиндексная

[ ,± ]{!} — —
Регистровое

Логический влево на разрядов


со сдвигом

[ ,± , LSL # ]{!}
смещение

[ ,± , LSR # ]{!} Логический вправо на разрядов


[ ,± , ASR # ]{!} Арифметич. вправо на разрядов
[ ,± , ROR # ]{!} Циклический вправо на разрядов
[ ,± , RRX]{!} — Цикл. вправо через перенос на 1 разр.
Таблица 1.4.3 – Косвенная и индексная адресация (операнд типа )
Метод адресации Исполн. адрес Содержимое после операции
Косвенная [ ] —
Постиндексная с непосредств. смещением [ ], #±
Постиндексная с регистровым смещением [ ], ±
Преиндексная с непосредств. смещением [ , #± ]{!} (с модификатором {!})
Преиндексная с регистровым смещением [ , #± ]{!} (с модификатором {!})
23
Преиндексная адресация с непосредственным смещением. Испол-
нительный адрес — сумма или разность содержимого регистра
и константы ( или ). В случае использовании модифи-
катора {!} вычисленный исполнительный адрес сохраняется в регистре
до обращения к памяти.
Примеры:
LDR R0, [R1, #32] ; R0 = *( R1 + 32 )
LDR R0, [R1, #32]! ; R0 = *( R1 += 32 )
Преиндексная адресация с регистровым смещением. Исполни-
тельный адрес — сумма или разность базового адреса в регистре
и смешения в регистре , которое может под-
вергаться сдвигу. В случае использования модификатора «!» вычисленный
исполнительный адрес сохраняется в регистре до обращения к памяти.
Примеры:
LDR R0, [R1, R2] ; R0 = *( R1 + R2 )
LDR R0, [R1, R2]! ; R0 = *( R1 += R2 )
LDR R0, [R1, –R2, LSL #4] ; R0 = *(R1 – (R2 << 4))
LDR R0, [R1, –R2, LSL #4]! ; R0 = *(R1 –= R2 << 4)
Постиндексная адресация с непосредственным смещением. Ис-
полнительный адрес хранится в регистре . После обращения
к памяти содержимое регистра изменяется путем прибавления или вычи-
тания 8- или 12-разрядной константы / .
LDR R0, [R1], #32 ; R0 = *R1; R1 + = 32
Постиндексная адресация с регистровым смещением. Исполни-
тельный адрес хранится в регистре . После обращения к па-
мяти содержимое регистра изменяется путем прибавления или вычитания
смещения , которое может подвергаться сдвигу.
LDR R0, [R1], #R2 ; R0 = *R1; R1 + = R2
LDR R0, [R1], #R2, LSR #2 ; R0 = *R1
; R1 + = ( R2 >> 2 )

1.5 Процедура начальной загрузки и режимы отображения памяти


Микроконтроллер LPC2148 имеет встроенную программу начальной
загрузки (загрузчик), которая размещается во встроенном ПЗУ. Запись кода
загрузчика производится при изготовлении микросхемы. Функции загрузчи-
ка: «прошивка» основной программы в ПЗУ через последовательный интер-
фейс, запуск основной программы, защита кода программы от несанкциони-
рованного считывания.
Размер области памяти, выделяемой загрузчику, составляет 12 кбайт.
Эта область расположена, начиная с адреса 0x7FFFD000 (рисунок 1.2.1).
Непосредственно после сброса область векторов прерываний (адреса
памяти 0x00000000–0x0000003F) отображается на начало области загрузчика
0x7FFFD000–0x7FFFD03F. Поэтому при сбросе управление передается на
физический адрес 0x7FFFD000, то есть запускается загрузчик.
24
Загрузчик проверяет контрольную сумму векторов прерываний. Вы-
числяется сумма содержимого первых восьми 32-разрядных ячеек памяти с
адресами 0x00000000–0x0000001C. Если сумма дает ноль (разряды старше
31-го отбрасываются), то контрольная сумма считается верной. Как правило,
для совпадения контрольной суммы в ячейку 0x00000014 следует записать
код 0xB9205F80. В общем случае для расчета этой величина программисту
необходимо сложить содержимое всех остальных семи ячеек памяти; выде-
лить младшие 32 разряда; поразрядно инвертировать и прибавить единицу.
Верная контрольная сумма служит признаком того, что память про-
грамм не пуста и содержит программу. В этом случае переотображение век-
торов прерываний прекращается, управление передается на команду по адре-
су 0x00000000, то есть первой команде основной программы.
При несовпадении контрольной суммы считается, что память не со-
держит программы. Загрузчик переходит в режим ожидания потока данных с
последовательного порта UART0 для загрузки кода программы.
Отметим, что имеется еще один режим отображения векторов преры-
ваний, в котором адресам 0x00000000–0x0000003F ставятся в соответствие
физические адреса оперативной памяти 0x40000000–0x4000003F.
При необходимости режим отображение памяти может быть изменен
программным путем с помощью регистра MEMMAP. Значения управляющих
кодов приведены в таблице 1.5.1.
Таблица 1.5.1 – Управление режимами отображения векторов прерываний
Физические адреса, на которые
MEMMAP Режим
отображаются вектора прерываний
0x00 0x7FFFD000–0x7FFFD03F Режим загрузчика
0x01 0x00000000–0x0000003F Режим программы
0x02 0x40000000–0x4000003F Режим ОЗУ

1.6 Обработка исключительных ситуаций


Исключительные ситуации или просто «исключения» — это события,
которые требуют немедленной реакции со стороны программы. Частным
случаем исключений являются прерывания, запрашиваемые периферийными
устройствами микроконтроллера. Другие исключения возникают в случае
ошибочных действий программы. Прерывания являются одним из основных
приемов программного управления вычислительным процессом. Обработка
исключений, вызванных ошибкой, направлена на повышение надежности
микропроцессорной системы.
Ядро ARM7 предоставляет возможность аппаратного диагностирова-
ния исключительных ситуаций. Возникновение исключения сопровождается
автоматическим переводом процессора из режима User в один из привилеги-
рованных режимов соответственно возникшему исключению (раздел 1.2.1).
Выполнение программы приостанавливается, и управление передается про-
цедуре обработки прерывания или исключения. Обработчик заканчивается

25
командой возврата в основную программу. При этом состояние программы
восстанавливается таким, каким оно было до возникновения исключения.
Исключения характеризуются разными приоритетами. Обработка ис-
ключения с меньшим приоритетом может быть приостановлена возникшим
исключением с более высоким приоритетом.
Исключительные ситуации, обработка которых предусмотрена аппа-
ратурой контроллера LPC2148, перечислены ниже (см. также раздел 2.4.1).
Reset — сброс. Исключение возникает в следующих случаях:
а) включение питания микроконтроллера или восстановление напря-
жения питания после провала до 1 В;
б) нарастающий перепад напряжения на контакте ;
в) сигнал сброса от сторожевого таймера;
г) сигнал от супервизора питания, свидетельствующий о снижении
напряжения до 2,6 В.
Undefined — неопределенная команда. Исключение возникает, если
на конвейер поступил код нераспознанной команды
Software interrupt (SWI) — программное прерывание. Вызывается
командой SWI.
Prefetch abort (PAbort) — ошибка адреса команды. Исключение возни-
кает при передаче управления по адресу памяти, не реализованному физически.
Data abort (DAbort) — ошибка адреса данных. Исключение возника-
ет при попытке обращения к ячейке памяти, не реализованной физически.
Interrupt request (IRQ) — прерывание. Поступил запрос прерывания,
разрешенного и классифицированного как zIRQ.
Fast interrupt request (FIQ) — быстрое прерывание. Поступил запрос
прерывания, разрешенного и классифицированного как FIQ.
В таблице 1.6.1 для каждого исключения указан приоритет, закреп-
ленный адрес памяти программ для передачи управления, режим, в который
будет переведен процессор на время обработки исключения, и инструкция,
завершающая обработку.
Общий порядок действий, выполняемых при возникновении исклю-
чения таков:
1. Cодержимое счетчика команд R15 (PC), указывающее на следую-
щую команду, сохраняется в регистр R14_xxx (LR), где xxx — идентификатор
Таблица 1.6.1 – Исключения, поддерживаемые ядром ARM7TDMI
Исключение Приор. Вектор I/F Режим Инструкция выхода
Reset 1 0x00000000 1/1 Supervisor —
Undefined 6 0x00000004 –/– Undefined MOVS PC, R14
SWI 6 0x00000008 1/– Supervisor MOVS PC, R14
PAbort 5 0x0000000C –/– Abort SUBS PC, R14, #4
SUBS PC, R14, #4
DAbort 2 0x00000010 –/– Abort
SUBS PC, R14, #8
IRQ 4 0x00000018 1/– IRQ SUBS PC, R14, #4
FIQ 3 0x0000001C 1/1 FIQ SUBS PC, R14, #4
26
режима, соответствующего возникшему исключению. Например, при воз-
никновении исключения Data Abort счетчик команд сохраняется в R14_abt.
Для Data Abort в R14_xxx помещается значение для остальных —
.
2. Содержимое слова состояния программы CPSR сохраняется в ре-
гистр SPSR_xxx режима, соответствующего исключению.
3. Изменяется режим работы процессора, а также устанавливаются
биты запрета прерываний (I и F) в слове состояния программы CPSR в соот-
ветствии с таблицей 1.6.1.
4. В счетчик команд R15 (PC) записывается адрес вектора исключения
в соответствии с таблицей 1.6.1, что приводит к немедленной передаче
управления команде, расположенной по этому адресу.
Общий порядок действий, производимых ядром ARM7 при возврате
из обработчика исключения:
1. Восстанавливается содержимое счетчика команд R15 (PC) путем
вычитания из R15_xxx смещения. Команды возврата приведены в таблице
1.6.1. Для Data Abort может использоваться возврат к команде, вызвавшей
исключение, а может к следующей ща ней команде (то есть с пропуском ко-
манды, приведшей к ошибке). Это достигается вычитанием смещения 8 или 4.
2. При выполнении команды возврата автоматически восстанавлива-
ется слово состояния программы CPSR из SPSR_xxx. При этом режим ядра
меняется на исходный, сбрасываются флаги запрета прерывания I и F, уста-
новленные в ходе обработки исключения.
Частный случай обработки прерываний IRQ и FIQ рассмотрен по-
дробней в разделе 1.11.2.

1.7 Система тактирования


1.7.1 Выбор тактовой частоты микроконтроллера
Основным источником тактирования микроконтроллера LPC2148 яв-
ляется встроенный тактовый генератор. Тактовая частота чаще всего задается
кварцевым резонаторам, подключенным к выводам XTAL1, XTAL2. Допу-
стимый диапазон частот резонатора МГц. Микроконтроллер
оснащен встроенным умножителем тактовой частота на основе ФАПЧ. До-
ступна сетка целочисленных множителей — . Частота ядра после
умножения не должна превышать 60 МГц.
В обратной связи системы ФАПЧ имеется управляемый током генера-
тор, работающий в диапазоне частот МГц. Эта частота за-
дается делителем, который может принимать значения .
На этапе настройки ФАПЧ тактового генератора выбирается множи-
тель , обеспечивающий требуемую тактовую частоту
МГц, (1.7.1)
а также делитель , так чтобы величина
(1.7.2)
принадлежала диапазону

27
(МГц). (1.7.3)
Например, при частоте кварцевого резонатора МГц значения
, дают МГц и МГц. Такие параметры си-
стемы тактирования можно рекомендовать разработчикам.
Имеется второй умножитель, предназначенный для тактирования при-
емопередатчика USB. Его настройка осуществляется аналогичным образом с
поправкой — выходная частота должна быть равна 48 МГц.
Значения и для ФАПЧ 0 и 1 задаются через регистры PLL0CON
и PLL1CON соответственно. Для выполнения настройки необходимо обра-
щаться еще к нескольким регистрам.
В учебном пособии настройка ФАПЧ через регистры специальных
функций не рассматривается. В большинстве случаев настройка системы так-
тирования выполняется однократно, ее не приходится выполнять повторно
во время выполнения программы. Поэтому предлагается воспользоваться ин-
струментом Configuration Wizard, среды Keil µVision 4. Инструмент автома-
тически генерирует необходимые команды настройки и внедряет их в файл
инициализации Startup.s, являющийся частью разрабатываемого проекта.
Значение выбирается в поле PLL Multiplier Selection, значение —
в поле PLL Divider Selection (рисунок 1.7.1).

Рисунок 1.7.1 – Настройка системы тактирования


с помощью инструмента Configuration Wizard
Заметим, что уменьшение тактовой частоты — одна из основных мер
по снижению энергопотребления микроконтроллера.
1.7.2 Настройка тактирования периферийных устройств
Внутренняя шина периферийных устройств APB (ARM Peripheral Bus)
работает при тактовой частоте , которая получается путем деления си-
стемной тактовой частоты
. (1.7.4)
Возможные значения делителя .

28
Особенно важно контролировать частоту при использовании
таймеров, поскольку именно этот сигнал поступает на их счетные входы.
Частота шины периферийных устройств APB, так же как и частота яд-
ра, связана с потребляемой микроконтроллером мощностью.
Делитель частоты периферийных устройств задается двумя младшими
разрядами регистра APBDIV (таблица 1.7.1).
Рассмотрим настройку делителя шины APB с помощью Configuration
Wizard (рисунок 1.7.1). По умолчанию флажок VPBDIV Setup снят и исполь-
зуется делитель 1:4. Установка флажка позволяет выбрать значение делителя
шины APB (опция VPBDIB: VPB Clock) согласно таблице 1.7.1.
Таблица 1.7.1 – Управление тактовой частотой шины APB
Двоичный код в регистре APBDIV Делителя частоты шины APB
00 (по умолчанию) 4 (по умолчанию)
01 2
10 1
11 зарезервировано

1.8 Модуль ускорения памяти


Быстродействие МК LPC2148, при тактовой частоте несколько десят-
ков мегагерц, ограничено временем доступа к Flash-памяти программ. Для
МК LPC2148 это время составляет 50 нс, что втрое превышает длительность
такта при частоте 60 МГц (16,67 нс). Для преодоления этого препятствия
служит модуль ускорения памяти (MAM — Memory Acceleration Module).
Модуль MAM представляет собой два буфера емкостью 16 байт. Каж-
дый буфер вмещает коды четырех команд. Логика управления обеспечивает
опережающую загрузку в буферы команд, которые предстоит выполнить в
следующих тактах. В то время как один буфер используется для чтения и ис-
полнения команд, во второй загружается очередной блок из Flash-памяти.
Это обеспечивает непрерывный поток команд без задержек.
Непрерывность нарушается при появлении команд передачи управле-
ния, как следствие появляются простои. Практически снижение производи-
тельности невелико (не превышает 5–10%).
Настройка модуля MAM осуществляется с помощью регистров спе-
циальных функций MAMCR и MAMTIM. Поскольку, как правило, настройка
выполняется однократно и в процессе выполнения программы не возникает
необходимость ее изменения, имеет смысл использовать инструмент Configu-
ration Wizard. Здесь ограничимся рассмотрением такого способа настройки.
Режим работы модуля MAM задается в поле MAM Control (рисунок
1.8.1). Модуль может быть полностью включен (опция Fully Enabled), вклю-
чен только для последовательно расположенных команд (Partially Enabled)
или полностью отключен (Disabled).
Эффективность работы модуля MAM зависит от числа тактов, выде-
ляемых для считывания команд из памяти (поле MAM Timing). Чем выше
тактовая частота, тем больше требуется тактов на обращение к памяти.
29
Рисунок 1.8.1 – Настройка модуля ускорения памяти (MAM)
с помощью инструмента Configuration Wizard
В техническом описании производителя утверждается, что длитель-
ность цикла обращения к памяти не должна быть меньше 50 нс. Соответ-
ственно при тактовых частотах до 20 МГц для обращения к памяти программ
рекомендуется выделять 1 такт; при тактовой частоте 20–40 МГц — 2 такта;
40–60 МГц — 3 такта. Однако авторы считают, что в большинстве случаев
следует выделять один такт при тактовых частотах до 40 МГц и два такта при
тактовых частотах 40 МГц и выше.
Можно рекомендовать подбирать настройку модуля MAM, опираясь
на экспериментально измеренное время выполнения фрагмента программы.
Для этого в начале и конце фрагмента следует включить отладочные коман-
ды, формирующие логический сигнал на одном из свободных выводов МК.
Для измерений необходим цифровой осциллограф.
В заключение отметим, что возможно выполнение фрагмента про-
граммы абсолютно без потерь производительности, если его разместить в
оперативной памяти (см. раздел 2.3.8).

1.9 Внешние выводы микроконтроллера


1.9.1 Служебные контакты
Микроконтроллер LPC2148 выпускается в корпусе LQFP размером
10×10 мм с 64 контактами (шаг 0,5 мм). Контакты микроконтроллера можно
разделить на две группы: служебного назначения, например, для подключе-
ния источника питания, и программно-управляемые линии ввода-вывода,
предназначенные для обмена цифровыми и аналоговыми сигналами с внеш-
ней средой. Краткое описание служебных контактов микроконтроллера
LPC214x приведено в таблице 1.9.1.
1.9.2 Программно-управляемые линии ввода-вывода
Контакты, не включенные в таблицу 1.9.1, предназначены для ввода и
вывода цифровых и аналоговых сигналов. Каждый из них может работать в
режиме двунаправленного цифрового входа-выхода. В связи с этим контакты
сгруппированы в два 32-разрядных параллельных порта, называемых

30
«порт 0» и «порт 1». В них не все разряды реализованы физически. Принято
порты обозначать «P0» и «P1», а номера линий порта указывать через точку,
например «P0.14» или «P1.23». Цифровые сигналы могут формироваться или
считываться с портов под управлением программы (раздел 1.10). Основные
электрические характеристики портовых линий приведены в таблице 1.9.2.
Таблица 1.9.1 – Назначение служебных контактов МК LPC2148
Обознач. Контакт Назначение
Vdd 23, 43, 51 Питание цифровой части (3,0–3,6 В)
Vdda 7 Питание аналоговой части (3,0–3,6 В)
Vss 6, 18, 25, 42, 50 Общая точка цифровой части
Vssa 59 Общая точка аналоговой части
Вход сброса. Низкий лог. уровень переводит
57 микроконтроллер в режим сброса. В рабочем
режиме должен быть подан высокий уровень
XTAL1 62 Контакты для подключения основного кварцево-
го резонатора. На контакт XTAL1 может быть
XTAL2 61 подан внешний тактовый сигнал
RTCX1 3 Контакты для подключения кварцевого резона-
RTCX2 5 тора для тактирования часов реального времени
D+ 10 Двунаправленная линия передачи данных ин-
D– 11 терфейса USB
Vref 63 Опорное напряжение АЦП и ЦАП (2,5–3,6 В)
Vbat 49 Питание часов реального времени (2,0–3,6 В)
Отметим, что реальные логические уровни, существенно отличаются
от предельных. Так в условиях, близких к нормальным, экспериментально
можно установить, что: В, В.
Таблица 1.9.2 – Электрические параметры цифровых портовых линий
Параметр Значение
Предельно допустимое напряжение в режиме входа, В
Выходной уровень логической единицы, В, не менее
Выходной уровень логического нуля, В, не более 0,4
Входной уровень логической единицы, В, не менее 2,0
Входной уровень логического нуля, В, не более 0,8
Ток в режиме входа, мкА, не более 3
Предельный выходной ток, мА 50
Предельный ток через каждый контакт Vdd и Vss, мА 100
1.9.3 Альтернативные функции линий ввода вывода
Портовые линии совмещают основную функцию (цифровой ввод-
вывод) с несколькими альтернативными функциями. Они служат входами
или выходами многочисленных периферийных устройств, встроенных в мик-
роконтроллер, таких как счетчики, АЦП и ЦАП.

31
PINSEL1 – настройка входов внешних прерыыаний
31 P0.30 27 24 23 20 19 16 15 12 11 P0.20 7 4 3 P0.16

0 1 1 1 0 1
EINT3 EINT3 EINT0

PINSEL0 – настройка входов внешних прерыыаний


P0.15 P0.14 27 24 23 20 P0.9 16 P0.7 12 11 8 P0.3 4 P0.1 0

1 0 1 0 1 1 1 1 1 1 1 1
EINT2 EINT1 EINT2 EINT2 EINT1 EINT0

PINSEL1 – настройка входов таймеров-счетчиков


31 P0.30 P0.29 P0.28 23 20 19 16 15 P0.22 P0.21 P0.20 P0.19 P0.18 P0.17 P0.16
1 0 1 0 1 0 0 1 0 1 0 1 1 0
1 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1 1 1
CAP0.0 CAP0.3 CAP0.2 CAP0.0 CAP1.3 MAT1.3 MAT1.2 CAP1.3 CAP1.2 MAT0.2
MAT0.3 MAT0.2 MAT0.0 CAP1.2 MAT1.3 MAT1.2 CAP0.2
PINSEL0 – настройка входов таймеров-счетчиков
31 28 P0.13 P0.12 P0.11 P0.10 19 16 15 P0.6 P0.5 P0.4 P0.3 P0.2 3 0

1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
MAT1.1 MAT1.0 CAP1.1 CAP1.0 CAP0.2 MAT0.1 CAP0.1 MAT0.0 CAP0.0

PINSEL1 – настройка выходов ШИМ


31 28 27 24 23 20 19 16 15 12 P0.21 8 7 4 3 0

0 1
PWM5

PINSEL0 – настройка выходов ШИМ


31 28 27 24 23 20 P0.9 P0.8 P0.7 12 11 8 7 4 P0.1 P0.0

1 0 1 0 1 0 1 0 1 0
PWM6 PWM4 PWM2 PWM3 PWM1

Рисуноук1.9.1 – Схема регистров управления альтернативными функциями портов ввода-вывода

32
PINSEL1 – настройка входов АЦП
31 P0.30 P0.29 P0.28 23 20 P0.25 16 15 P0.22 P0.21 8 7 4 3 0

0 1 0 1 0 1 0 1 0 1 1 0
AD0.3 AD0.2 AD0.1 AD0.4 AD1.7 AD1.6

PINSEL0 – настройка входов АЦП


P0.15 28 P0.13 P0.12 23 P0.10 19 P0.8 15 P0.6 P0.5 P0.4 7 4 3 0

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
AD1.5 AD1.4 AD1.3 AD1.2 AD1.1 AD1.0 AD0.7 AD0.6

PINSEL1 – настройка линий SPI


31 28 27 24 23 20 19 16 15 12 11 P0.20 P0.19 P0.18 P0.17 0

1 0 1 0 1 0 1 0
SSEL1 MOSI1 MISO1 SCK1

PINSEL0 – настройка линий SPI


31 28 27 24 23 20 19 16 P0.7 P0.6 P0.5 P0.4 7 4 3 0

0 1 0 1 0 1 0 1
SSEL0 MOSI0 MISO0 SCK0

PINSEL0 – настройка линий UART


P0.15 P0.14 P0.13 P0.12 P0.11 P0.10 P0.9 P0.8 15 12 11 8 7 4 P0.1 P0.0

0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
RI DCD DTR DSR CTS RTS RxD1 TxD1 RxD0 TxD0

PINSEL0 – настройка линий I2С


31 P0.11 27 24 P0.11 20 19 16 15 12 11 8 P0.3 P0.2 3 0

1 1 1 1 0 1 0 1
SDA1 SCL1 SDA0 SCL0

Рисунок 1.9.2 – Схема регистров управления альтернативными функциями портов ввода-вывода

33
Выбор основной или альтернативной функции линий порта 0 осу-
ществляется путем записи управляющего кода в регистры PINSEL0 и PIN-
SEL1. Имеется также регистр PINSEL2, предназначенный для переключения
линий порта 1 в отладочный режим, который здесь не рассматривается.
Управляющие коды и соответствующие им альтернативные функции
портовых линий приведены в таблицах 1.9.3, 1.9.4. На рисунках 1.9.1 и 1.9.2
показаны схемы регистров PINSEL0 и PINSEL1, сгруппированы по перифе-
рийным устройствам.
Прежде чем использовать какое-либо встроенное периферийное
устройство, требующее взаимодействия с внешней средой, необходимо с по-
мощью таблиц 1.9.3, 1.9.4 или рисунков 1.9.1, 1.9.2 определить, какие кон-
такты МК могут использоваться для обмена сигналами с данным устрой-
ством и внедрить в программу команды перевода выбранных линий в аль-
тернативный режим.
Таблица 1.9.3 – Управление функциями внешних выводов через PINSEL0
Биты Конт. Код Функция Описание
0–1 19 00 Port 0.0
01 TxD0 (UART0) Выход передатчика UART0
10 PWM1 Выход 1 ШИМ
11 —
2–3 21 00 Port 0.1
01 RxD0 (UART0) Вход приемника UART0
10 PWM3 Выход 3 ШИМ
11 EINT0 Вход 0 внешнего прерывания
4–5 22 00 Port 0.2
01 SCL0 (I2C0) Тактовый сигнал I2C0
10 CAP0.0 (Timer 0) Вход 0 устр. захвата таймера 0
11 —
6–7 26 00 Port 0.3
01 SDA0 (I2C0) Линия передачи данных I2C0
10 MAT0.0 (Timer 0) Выход 0 устр. сравнения таймера 0
11 EINT1 Вход 1 внешнего прерывания
8–9 27 00 Port 0.4
01 SCK0 (SPI0) Тактовый сигнал SPI0
10 CAP0.1 (Timer 0) Выход 1 устр. сравнения таймера 0
11 AD0.6 Вход 6 АЦП 0
10–11 29 00 Port 0.5
01 MISO0 (SPI0) Вход ведущего, выход ведомого SPI0
10 MAT0.1 (Timer 0) Выход 1 устр. сравнения таймера 0
11 AD0.7 Вход 7 АЦП 0

34
Таблица 1.9.3 – Продолжение
Биты Конт. Код Функция Описание
12–13 30 00 Port 0.6
01 MOSI0 (SPI0) Выход ведущего, вход ведомого SPI0
10 CAP0.2 (Timer 0) Выход 2 устр. сравнения таймера 0
11 AD1.0 Вход 0 АЦП 1
14–15 31 00 Port 0.7
01 SSEL0 (SPI0) Выбор режима ведущий/ведомый SPI0
10 PWM2 Выход 2 ШИМ
11 EINT2 Вход 2 внешнего прерывания
16–17 33 00 Port 0.8
01 TxD1 (UART1) Выход передатчика UART1
10 PWM4 Выход 4 ШИМ
11 AD1.1 Вход 1 АЦП 1
18–19 34 00 Port 0.9
01 RxD1 (UART1) Вход приемника UART1
10 PWM6 Выход 6 ШИМ
11 EINT3 Вход 3 внешнего прерывания
20–21 35 00 Port 0.10
01 RTS (UART1) Выход запроса передачу (UART1)
10 CAP1.0 (Timer 1) Вход 0 устр. сравнения таймера 1
11 AD1.2 Вход 2 АЦП 1
22–23 37 00 Port 0.11
01 CTS (UART1) Вход готовности к передаче UART1
10 CAP1.1 (Timer 1) Выход 1 устр. сравнения таймера 1
11 SCL1 (I2C1) Тактовый сигнал I2C1
24–25 38 00 Port 0.12
01 DSR (UART1) Вход готовности к обмену UART1
10 MAT1.0 (Timer 1) Выход 0 устр. сравнения таймера 1
11 AD1.3 Вход 3 АЦП 1
26–27 39 00 Port 0.13
01 DTR (UART1) Выход готовности к обмену UART1
10 MAT1.1 (Timer 1) Выход 1 устр. сравнения таймера 1
11 AD1.4 Вход 4 АЦП 1
28–29 41 00 Port 0.14
01 DCD (UART1) Вход «связь установлена» UART1
10 EINT1 Вход 1 внешнего прерывания
11 SDA1 (I2C1) Линия данных (I2C1)
30–31 45 00 Port 0.15
01 RI (UART1) Вход входящего вызова UART1
10 EINT2 Вход 2 внешнего прерывания
11 AD1.5 Вход 5 АЦП 1

35
Таблица 1.9.4 – Управление функциями внешних выводов через PINSEL1
Биты Конт. Код Функция Описание
0–1 46 00 Port 0.16
01 EINT0 Вход 0 внешнего прерывания
10 MAT0.2 (Timer 0) Выход 2 устр. совпадения таймера 0
11 CAP0.2 (Timer 0) Вход 2 устр. захвата таймера 0
2–3 47 00 Port 0.17
01 CAP1.2 (Timer 1) Вход 2 устр. захвата таймера 1
10 SCK1 (SSP) Тактовый синел интерфейса SSP
11 MAT1.2 (Timer 1) Выход 2 устр. совпадения таймера 1
4–5 53 00 Port 0.18
01 CAP1.3 (Timer 1) Вход 3 устр. захвата таймера 1
10 MISO1 (SSP) Вход ведущего, выход ведомого SSP
11 MAT1.3 Выход 2 устр. совпадения таймера 3
6–7 54 00 Port 0.19
01 MAT1.2 Выход 2 устр. совпадения таймера 1
10 MOSI1 (SSP) Выход ведущего, вход ведомого SSP
11 CAP1.2 (Timer 1) Вход 2 устр. захвата таймера 1
8–9 55 00 Port 0.20
01 MAT1.3 (Timer 1) Выход 2 устр. совпадения таймера 3
10 SSEL1 (SSP) Выбор режима ведущий/ведомый SSP
11 EINT3 Вход 3 внешнего прерывания
10–11 1 00 Port 0.21
01 PWM5 Выход 5 ШИМ0
10 AD1.6 Вход 6 АЦП 1
11 CAP1.3 (Timer 1) Вход 3 устр. захвата таймера 1
12–13 2 00 Port 0.22
01 AD1.7 Вход 7 АЦП 1
10 CAP0.0 (Timer 0) Вход 0 устр. захвата таймера 0
11 MAT0.0 (Timer 0) Выход 0 устр. совпадения таймера 0
14–15 58 00 Port 0.23
01 Vbus Вход обнаружения питания USB
10,11 —
16–17 — — —
18–19 9 00 Port 0.25
01 AD0.4 Вход 4 АЦП 0
10 Aout (DAC) Выход ЦАП
11 —
20–23 — — —
24–25 13 00 Port 0.28
01 AD0.1 Вход 1 АЦП 0
10 CAP0.2 (Timer 0) Вход 2 устр. захвата таймера 0
11 MAT0.2 (Timer 0) Выход 2 устр. совпадения таймера 0

36
Таблица 1.9.4 – Продолжение
Биты Конт. Код Функция Описание
26–27 14 00 Port 0.29
01 AD0.2 Вход 2 АЦП 0
10 CAP0.3 (Timer 0) Вход 3 устр. захвата таймера 0
11 MAT0.3 (Timer 0) Выход 3 устр. совпадения таймера 0
28–29 15 00 Port 0.30
01 AD0.3 Вход 3 АЦП 0
10 EINT3 Вход 3 внешнего прерывания
11 CAP0.0 (Timer 0) Вход 0 устр. захвата таймера 0
30–31 17 00 Port 0.31 Только выход
01 UP_LED (USB) Выход индикатора связи через USB
10 CONNECT (USB) Вых. программного подключения USB
11 —

1.10 Цифровые порты ввода-вывода


В данном разделе рассматривается основная функция портов —
цифровой ввод-вывод. Для выбора основной функции достаточно оставить
без изменений нулевой управляющий код, которой содержится в PINSEL0–
PINSEL2 (раздел 1.9.3) по умолчанию.
Микроконтроллер поддерживает два режима управления портовыми
линиями: низкоскоростной и высокоскоростной. Последний отличается со-
кращенным временем реакции на команду и расширенными возможностями
управления. Осциллограммы сигнала на линии P0.9, управляемой в низко-
скоростном и высокоскоростном режиме (рисунок 1.10.1) позволяют оценить
разницу во времени реакции.

Рисунок 1.10.1 – Осциллограммы сигнала на линии P0.9, управляемой


в высокоскоростном и в низкоскоростном режимах
37
Осциллограммы записаны при тактовой частоте МГц.
Верхняя осциллограмма получена командами
FIO0SET=0x200; FIO0CLR=0x200;
А две нижние командами
IO0SET=0x200; IO0CLR=0x200;
Видно, что в низкоскоростном режиме задержки реакции при вводе-
выводе через порт зависят от делителя шины периферийных устройств: 1:1
или 1:4 ( МГц или МГц).
1.10.1 Управление портом через низкоскоростную шину
Направление ввода-вывода задается с помощью регистров IOxDIR,
где x — номер порта (0 или 1). Линии, соответствующие единицам двоично-
го кода, записанного в IOxDIR, переводятся в режим вывода. Нулям соответ-
ствуют линии в режиме ввода. По умолчанию регистр содержит нулевое зна-
чение, и все порты находятся в режиме ввода.
Установка в единицу одной выходной линии порта или нескольких
одновременно выполняется путем записи управляющего кода в регистр
IOxSET. На линиях, соответствующих единицам двоичного кода IOxSET,
установится уровень логической единицы. Линии порта, соответствующие
двоичным нулям, не меняют состояния. Аналогично сброс в ноль линий пор-
та осуществляется путем записи единиц в регистр IOxCLR. Такой способ
удобен, если требуется изменить уровень нескольких линий, не меняя уро-
вень остальных. Однако каждая такая операция установит на заданных лини-
ях только высокий или только низкий уровень. Невозможно одной командой
установить произвольное сочетание нулей и единиц.
Для вывода в порт произвольного двоичного кода одной командой
служит регистр IOxPIN. После записи этого регистра на выходных линиях,
соответствующих единицам установится высокий уровень, на линиях, соот-
ветствующих нулям — низкий. Для выборочного изменения нескольких ли-
ний применяют так называемое наложение маски (маскирование). Сначала
выполняют логическое умножение регистра IOxPIN на число, содержащее
нули в разрядах, соответствующих низкому логическому уровню. Затем при-
меняют логическое сложение. Рассмотрим несколько примеров.
Пример 1. Вывод 8-разрядной константы в порт. Команда
IO0PIN=(IO0PIN & 0xFFFF00FF) | 0x0000A500;
дает результат
,

где x — неизменившиеся разряды.


Пример 2. Вывод 8-разрядной переменной в порт. Команда
IO0PIN=(IO0PIN & 0xFFFFС03F) | Port << 6;
дает результат
,
где P — 8-разрядное содержимое переменной Port.

38
Пример 3. Вывод одного бита в порт. Команда
IO0PIN=(IO0PIN & 0xFFFFFFBF) | Bit << 6;
дает результат
.
Имеется в виду, что переменная Bit принимает только два значения: 0 или 1,
содержащееся в младшем разряде B.
Пример 4. Вывод произвольного бита переменной в порт. Команда
IO0PIN=(IO0PIN & 0xFFFFFFFD) | (Word & 0x1000) >> 11;
скопирует 12-ый разряд переменной Word в 1-ый разряд порта:
.
Фактически логика управления портом через регистры IOxPIN,
IOxSET, IOxCLR соответствует работе D-триггера, включенного так, как по-
казано на рисунке 1.10.2, а).
Чтение регистра IOxPIN дает двоичный код, соответствующий логи-
ческим уровням на контактах микроконтроллера (причем независимо от того,
настроены они на ввод или на вывод). Выборочное считывание одного или
нескольких бит выполняется с помощью логического умножения на маску.
Пример 5. Чтение состояния одной портовой линии
Bit=IO0PIN & 0x00000040;
дает результат
,
где бит равен 0 или 1 в зависимости от электрических уровнях на линии.
Пример 6. Чтение байта из порта
Byte=IO0PIN & 0x0000FF00;
дает результат:
,
где x — нули или единицы в зависимости от электрических уровней.
IOxSET.x S Q Px.x FIOxSET.x S Q Px.x
T FIOxMASK.x T
&
IOxPIN.x D D
FIOxPIN.x
IOxCLR.x R FIOxCLR.x R

а) б)
Рисунок 1.10.2 – Структурная схема выхода портовой линии:
а) в низкоскоростном режиме, б) в высокоскоростном режиме
Перечислим регистры управления портами в низкоскоростном режиме.
Регистр IOxDIR (IO0DIR, IO1DIR) устанавливает режим ввода или
вывода через порт. Единица в разряде IOxDIR переводит соответствующую
линию порта в режим цифрового выхода, ноль соответствует режиму входа.
Регистры IOxPIN (IO0PIN, IO1PIN) управляют электрическими
уровнями на портовых линиях, а также используются для чтения уровней,
действующих на линиях. Запись числа в эти регистры приводит к установке
уровней, советующих двоичному коду числа. Чтение регистров дает код, со-
ответствующий логическим уровням на портовых линиях.

39
Регистр IOxSET (IO0SET, IO1SET). Запись числа в эти регистры
приводит к установке высоких логических уровней на выходных линиях, со-
ответствующих двоичным единицам в IOxSET. Портовые линии, соответ-
ствующие логическим нулям не меняют состояния.
Регистр IOxCLR (IO0CLR, IO1CLR). Запись числа в эти регистры
приводит к установке низких логических уровней на выходных линиях, соот-
ветствующих двоичным единицам в IOxCLR. Портовые линии, соответству-
ющие логическим нулям не меняют состояния.
1.10.2 Управление портом через высокоскоростную шину
Высокоскоростной режим включается установкой единиц в нулевом и
первом разряде регистра SCS (рисунок 1.10.3). Нулевой разряд отвечает за
режим порта 0, первый — за режим порта 1.
SCS – режим управления цифровыми портами ввода-вывода
15 8 7 4 3 2 1 0

1M

0M
O

O
PI

PI
G

G
Порт 1 Порт 0

Рисунок 1.10.3 – Схема регистра управления высокоскоростным обменом


с цифровыми портами ввода-вывода
Логика управления портом в высокоскоростном режиме соответствует
схеме на рисунке 1.10.2 б).
Регистры управления портом в высокоскоростном режиме подключе-
ны к шине данных ядра МК. Помимо сокращения времени реакции на коман-
ду в этом режиме доступно маскирование, а также обращение в формате бай-
та и слова.
Использование регистров FIOxDIR, FIOxSET, FIOxCLR и FIOxPIN
полностью аналогично регистрам IOxDIR, IOxSET, IOxCLR и IOxPIN низко-
скоростного режима.
К 32-разрядным регистрам FIOxDIR, FIOxSET, FIOxCLR и FIOxPIN,
можно обращаться в формате 16-разрядного слова и в байтовом формате. В
таком случае к именам регистров добавляется еще один символ. Младшее
слово обозначается буквой «L», старшее — буквой «U». Байты нумеруются
цифрами от 0 до 3: FIOxSETL, FIOxCLRU, FIOxPIN0–FIOxDIR3.
Аппаратно поддерживается маскирование через регистр FIOxMASK, к
которому также можно обращаться в формате байта и слова. Запись двоич-
ных единиц в FIOxMASK блокирует изменение соответствующих портовых
линий любыми командами (логический элемент «И» на рисунке 1.10.1, б).
Пример 1 из предыдущего раздела (вывод 8-разрядной константы) в
режиме байтового доступа реализуется так:
FIO0PIN1=0xA5;
Пример 2 (вывод байтовой переменной):
FIO0MASKL=0xC03F;
FIO0PINL=(Port << 6);
Пример 3 (вывод младшего бита переменной в 6-ой бит порта):
40
FIO0MASK0=0xBF;
FIO0PIN0=Bit << 6;
Пример 4 (вывод 12-го бита переменной в 1-ый бит порта):
FIO0MASK0=0xFD;
FIO0PIN0=(Word & 0x1000) >> 11;
Регистры FIOxDIR, FIOxPIN, FIOxSET, FIOxCLR полностью ана-
логичны соответствующим регистрам для низкоскоростного режима.
Регистры FIOxPINL, FIOxPINU (FIO0PINL, FIO0PINU,
FIO1PINL, FIO1PINU) предназначены для чтения и записи порта в формате
16-разрядного слова. FIOxPINL связан с портовыми линиями Px.0–Px.15,
FIOxPINU — с линиями Px.16–Px.31 (рисунок 1.10.2).
Регистры FIOxPIN0–FIOxPIN3 (FIO0PIN0–FIO0PIN3, FIO1PIN0–
FIO1PIN3) предназначены для чтения и записи порта в байтовом формате.
FIOxPIN0 связан с портовыми линиями Px.0–Px.7, FIOxPIN1 — с линиями
Px.8–Px.15 и т. д. (рисунок 1.10.4).
Регистры FIOxMASK (FIO0MASK, FIO1MASK) предназначены для
наложения маски при всех операциях с портами. Установка единиц в некото-
рые разряды приводит к блокировке любых изменений соответствующих
портовых линий через FIOxPIN, FIOxSET и FIOxCLR.
31 0

FIOxPIN

15 0 15 0

FIOxPINU FIOxPINL

7 0 7 0 7 0 7 0

FIOxPIN3 FIOxPIN2 FIOxPIN1 FIOxPIN0

Рисунок 1.10.4 – Схема регистров управления портами в режимах


четырехбайтного слова, двухбайтного слова и в байтовом режиме
Примечание. Для управления портами в формате байта и 16-
разрядного слова кроме FIOxPINL/U и FIOxPIN0–3, все другие регистры
(FIOxDIR, FIOxSET, FIOxCLR, FIOxMASK) допускают использование в кон-
це имени номеров 0–3 и обозначений «L/U».

1.11 Система прерываний


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

41
Событие, требующее немедленной реакции и программной обработки,
называется прерывающим событием. Возникновение такого события сопро-
вождается специальным сигналом — запросом прерывания. Устройство, ге-
нерирующее этот сигнал, будем называть источником прерывания.
Упрощенно процесс обработки прерывания можно описать так:
а) источник прерывания формирует запрос прерывания;
б) система прерываний приостанавливает выполнение основной про-
граммы и передает управление процедуре обработки прерывания;
в) после завершения процедуры обработки прерывания управление
возвращается в основную программу.
Перечисленные действия могут быть организованы алгоритмически
(программным путем) без использования специальных аппаратных средств.
Однако для этого потребуется периодически опрашивать потенциальные ис-
точники прерываний в ожидании появления запросов. Программный опрос
приведет к усложнению алгоритма и неизбежным запаздываниям в реакциях
на прерывающие события. В то время как система прерываний обеспечит не-
прерывное слежение за всеми источниками и в случае появления запроса за-
пустит процедуру обработки прерывания с минимальной задержкой.
Архитектура ARM7 поддерживает три вида прерываний: векторное
IRQ, невекторное IRQ и быстрое FIQ. Одновременно поддерживается обра-
ботка не более 16 источников векторных прерываний, каждому из которых
может быть назначен произвольный адрес обработчика. Если необходимо
обеспечить поддержку более 16 источников прерываний, то используют не-
векторные прерывания с общим адресом обработчика. Процесс реакции на
векторные и невекторные прерывания один и тот же. Быстрое прерывание
FIQ имеет приоритет выше, чем IRQ и может прерывать обработку IRQ.
Предусмотрен только один обработчик всех запросов FIQ с единственным
адресом. Запрос от каждого источника может быть классифицирован как IRQ
или FIQ через регистр VICIntSelect (раздел 1.11.4).
1.11.2 Процесс обработки прерываний IRQ
Прерывания IRQ и FIQ являются частным случаем исключительных
ситуаций. Процесс обработки прерывания подчинен общему порядку для ис-
ключений, рассмотренному в разделе 1.6.
При возникновении прерывания, классифицированного как IRQ, вы-
полняются следующие действия:
1) содержимое счетчика команд , указывающее на следующую
команду, сохраняется в R14_irq (LR);
2) слово состояния программы CPSR сохраняется в SPSR_irq;
3) режим меняется на IRQ;
4) бит I в слове состояния программы CPSR устанавливается в едини-
цу, что запрещает все прерывания IRQ;
5) регистр VICVectAddr загружается адресом процедуры обработки
прерывания из регистра VICVectAddr0–15, где 0–15 — номер слота, c кото-
рым связан данный источник прерывания;

42
6) в счетчик команд R15 (PC) записывается адрес 0x00000018, что
приводит к немедленной передаче управления по этому адресу;
7) выполняется инструкция
LDR PC, [PC, #-0x0FF0]
расположенная по адресу 0x00000018, что приводит к записи в счетчик ко-
манд содержимого регистра VICVectAddr с адресом
;
8) управление получает процедура обработки прерываний, адрес ко-
торой был задан в регистре VICVectAddr.
Процедура обработки прерываний начинается с команды STM, сохра-
няющей в стек все используемые регистры общего назначения (R0–R12).
1.11.3 Процесс обработки быстрых прерываний FIQ
При возникновении прерывания, классифицированного как FIQ, вы-
полняются следующие действия:
1) счетчик команд , сохраняется в R14_fiq (LR);
2) слово состояния программы CPSR сохраняется в SPSR_fiq;
3) режим меняется на FIQ;
4) биты I, F в слове состояния программы CPSR устанавливается в
единицу, что запрещает все прерывания IRQ и FIQ;
5) управление передается команде по адресу 0x0000001С путем запи-
си этой константы в счетчик команд R15 (PC);
6) выполняется инструкция
LDR PC, [PC, #Смещение]
что приводит к загрузке в счетчик команд адреса обработчика быстрого пре-
рывания;
7) управление получает процедура обработки быстрого прерывания.
1.11.4 Регистры управления системой прерываний
Большинство регистров, предназначенных для управления системой
прерываний или слежения за ее состоянием, имеют структуру, схематично
показанную на рисунке 1.11.1. Каждый бит регистра соответствует одному из
источников прерываний.
Регистр VICRAWStatus. Единица в любом из разрядов информирует
о получении запроса прерывания от соответствующего источника, причем
независимо от того разрешено ли прерывание (см. также VICIntEnable).
Регистр VICIRQStatus. То же, что VICRAWStatus, но единицами от-
мечаются только источники, прерывания от которых разрешены и классифи-
цированы как IRQ (см. также VICIntSelect).
Регистр VICFIQStatus. То же, что VICIRQStatus, но для прерываний,
классифицированных как FIQ.
Регистр VICIntEnable. Установка единицы в любой из разрядов раз-
решает обработку запросов прерывания от соответствующего источника.
Сброс в ноль не имеет значения. Запрет обработки прерываний осуществля-
ется через регистр VICIntEnClear.

43
Регистр VICIntEnClear. Установка единицы в любой из разрядов за-
прещает обработку запросов прерывания от соответствующего источника.
Регистр VICIntSelect. Сброс в ноль любого из разрядов классифици-
рует соответствующий источник как IRQ. Адрес обработчика прерывания
должен храниться в одном из регистров VICVectAddr0–15 в зависимости от
слота, назначенного данному источнику. Установка единицы классифициру-
ет соответствующий источник как FIQ. Тогда адрес обработчика прерывания
задается инструкцией по вектору 0x0000001C.
Регистр VICSoftInt. Установка единицы в любой из разрядов вызы-
вает обработку прерывания от соответствующего обработчика программным
путем. Прерывание будет возникать циклически, пока данный регистр со-
держит единицы в разрядах, соответствующих разрешенным прерываниям.
Регистр VICSoftIntClear. Установка единицы в любой из разрядов
снимает программный запрос прерывания, выполненный через VICSoftInt.
Регистры VICVectCntl0–15 предназначены для того, чтобы распре-
делить используемые источники прерываний по 16 слотам. Структура реги-
стра показана на рисунке 1.11.1.
● Бит 5 (SlotEN) должен быть установлен в единицу.
● Биты 0–4 (IntRequest) назначают данному слоту номер источника
прерывания. Номера источников прерываний соответствуют номерам битов

VICVecCntl0-15 – управление слотами векторных прерываний


15 8 7 6 5 4 0
N

IntRequest
otE
Sl

Номер запроса прерывания


Включить слот

VICProtection – защита слотов


15 8 7 4 3 1 0
ac VIC
ss
ce

Запретить управление из режима User

Маска регистров управления системой прерываний


31 24 23 22 21 20 19 18 17 16
T3

T2
D

1
SB

0
C
AD

AD
BO

N
I2
U

EI

EI

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

C RM
SS PI1

T1

T0

0
0
T1

T0

T
I0

0
TC

er

er
M
L

e1

e0

D
C

AR

AR
P
PL
N

SP
S

A
PW

W
I2
R

or

or
EI

EI

Ti

Ti
U

22 – USB ― приемопередатчик USB 9, 19 – I2C0/1 ― приемопередатчики I2C


20 – BOD ― монитор питания 8 – PWM0 ― широтно-импульсный модулятор
18, 21 – AD0/1 ― аналого-цифровой преобразователь 6, 7 – UART0/1 ― приемопередатчики UART
14–17 – EINT0–EINT3 ― запрос внешним сигналом 4, 5 – Timer0/1 ― таймеры-счетчики
13 – RTC ― часы реального времени 2, 3 – ARM Core0/1 ― резерв
12 – PLL ― умножитель тактовой частоты 0 – WDT ― сторожевой таймер
10, 11 – SPI0/1 ― приемопередатчики SPI

Рисунок 1.11.1 – Структура основных регистров управления системой прерываний

44
на рисунке 1.11.1. Назначать один и тот же источник прерывания нескольким
слотам не рекомендуется, хотя практически это возможно и допустимо. Если
такое произошло, то использоваться будет слот с меньшим номером.
Регистры VICVectAddr0–15 задают адрес обработчика прерывания
для каждого слота.
Регистр VICVectAddr автоматически загружается адресом обработ-
чика из VICVectAddr0–15 при запросе прерывания. Содержимое регистра ис-
пользуется командой LDR по адресу 0x00000018 для передачи управления об-
работчику прерывания.
Регистр VICDefVectAddr — адрес обработчика невекторных преры-
ваний. Если прерывание разрешено через VICIntEnable, не классифицировано
как FIQ через VICIntSelect, но не ассоциировано ни с одним из 16 слотов че-
рез VICVectCntl0–15, оно считается невекторным. В этом случае управление
будет передано по адресу, записанному в VICDefVectAddr. Невекторные
прерывания используют, если все слоты заняты. При обработке невекторного
прерывания его источник идентифицируется через регистр VICIRQStatus.
Регистр VICProtection содержит единственный управляющий бит
(рисунок 1.11.1). Установка единицы разрешает управление прерываниями
только в привилегированных режимах. В режиме User управление прерыва-
ниями становится запрещено.
1.11.5 Порядок настройки прерывания IRQ
В ходе настройки системы прерываний рекомендуется придерживать-
ся следующего порядка действий.
1. Принять решение о том, какой из свободных слотов (0–15) будет
использоваться для данного источника прерывания.
2. Записать адрес обработчика прерывания в регистр VICVectAddr0–
15, соответствующий выбранному слоту, например для слота 0
VICVectAddr0 = (unsigned) Имя процедуры-обработчика ;
3. Назначить выбранному слоту источник прерывания
VICVectCntl0 = 0x20 | Номер источника ;
Под номером понимается десятичное число (номер источника или номер раз-
ряда на рисунке 1.11.1).
4. Настройка по пунктам 1–3 повторяется для каждого источника.
5. Включить прерывание от данного источника
VICIntEnable = Маска источника ;
Под маской понимается двоичный код с единицами в разрядах, соответству-
ющих разрешенным прерываниям (рисунок 1.11.1).
Отметим, что каждому из регистров может быть
поставлен в соответствие единственный источник прерывания, поэтому ука-
зывается его номер. В то же время через могут быть разрешены
несколько прерываний, поэтому каждому из них соответствует один бит.
Порядок настройки невекторного прерывания IRQ:
1. Аналогично пункту 2 для векторного прерывания поместить адрес
обработчика в регистр VICDefVectAddr.
45
2. Аналогично пункту 5 для векторного прерывания разрешить обра-
ботку прерывания от данного источника через регистр VICIntEnable.
1.11.6 Порядок настройки быстрого прерывания FIQ
1. Классифицировать прерывание от данного источника, как быстрое
прерывание FIQ. Установить единицу в разряд регистра VICIntSelect, соот-
ветствующий данному источнику
VICIntEnable = Маска источника ;
2. Включить прерывание от данного источника
VICIntEnable = Номер источника ;
3. Внести изменения в код инициализации Startup.s. Заменить строку
FIQ_Handler B FIQ_Handler
на
IMPORT FIQ_Handler
В дальнейшем использовать имя FIQ_Handler для процедуры-обработчика
прерывания. Заголовок процедуры-обработчика должен быть таким:
irq void FIQ_Handler ()
Имя подпрограммы может быть произвольным, но должно совпадать c име-
нем после директивы IMPORT.
1.11.7 Процедура обработки прерывания
Процедура обработки прерывания на языке Си, ориентированном на
использование компилятора RealView 4 создается по шаблону:
irq void Имя_функции()
{
...
Регистр = Код ; // Сброс флага запроса прерывания
VICVectAddr=0;
}
Строка «Сброс флага запроса прерывания» обращается к регистру
управления периферийным устройством, вызвавшим прерывание. Например,
для таймера 0 это
T0IR=1;
Если сброс флага не произвести, запрос прерывания останется активным и
обработка прерывания начнет повторяться циклически.
1.11.8 Задержка обработки прерывания
В микроконтроллерах семейства LPC21xx задержка при передаче
управления обработчику прерывания сравнительно велика. Минимальное
время от появления запроса прерывания до выполнения первой команды об-
работчика составляет 12 тактов для FIQ и 13 тактов для IRQ. Максимальное
время реакции на запрос на 20 тактов больше минимального. Дополнитель-
ные 20 тактов определяются временем, необходимым для завершения коман-
ды, с выполнением которой совпал запрос прерывания, такой как

46
LDMFA R0, {R0-R15}
Выполнение первой эффективной команды будет отложено еще на не-
сколько тактов, необходимых для сохранения в стек регистров общего назна-
чения такой командой, как
STMDB R13!, { ... }
Затраты времени на сохранение регистров зависят от их числа. На 13 реги-
стров R0–R13 уходит 14 тактов.
Таким образом, задержка обработки прерывания IRQ может варьиро-
вать от 13 до тактов; для FIQ задержка варьирует от 12 до
46 тактов.
В качестве подтверждения приведем результат простого эксперимен-
та. На вход запроса прерывания EINT3 поступают периодические импульсы
от генератора. Обработчик прерывания по внешнему сигналу в ответ форми-
рует короткий одиночный импульс. Интервал времени между фронтами им-
пульсов от генератора и ответного, формируемого микроконтроллером, соот-
ветствует задержке обработки прерывания.
Листинг программы приведен в приложении А. Отметим, что тактовая
частота микроконтроллера равна 12 МГц, умножитель отсутствует, обраще-
ние к портам выполняется через высокоскоростную шину.
На рисунке 1.11.2 приведено семейство осциллограмм, записанных
многократно в случайные моменты времени. Жирным пунктиром выделены
импульсы, соответствующие самой короткой и самой длинной задержкам.
Задержка в 21 такт для IRQ складывается из тринадцати базовых,
трех, затраченных на сохранение регистров R0–R1 и пяти на вывод в порт.

Рисунок 1.11.2 – Осциллограммы импульсов, показывающих


временную задержку обработки прерывания IRQ (вверху) и FIQ (внизу)

47
Вместе с тем можно предположить, что команда LDM, выполняемая до
20 тактов не встречается в программе, а самая «медленная» команда в про-
грамме выполняется 3 такта; команда STM сохраняет не все регистры и вы-
полняется 4–7 тактов. Основываясь на этих предположениях, можно считать,
что задержка от появления запроса IRQ до первой эффективной команды об-
работчика ориентировочно составляет от до так-
тов. Для FIQ задержка на 1 такт меньше.
Время реакции на прерывание FIQ можно существенно уменьшить,
приняв следующие меры:
а) В процедуре обработки прерывания использовать только регистры
R8–R12, отдельные для режима FIQ. Это даст возможность не сохранять и не
восстанавливать их командами LDM, STM.
б) Не оформлять обработчик быстрого прерывания как процедуру, а
размещать его команды, начиная с адреса 0x0000001С. Этот адрес последний
в таблице векторов исключительных ситуаций, поэтому все последующие
адреса свободны.
Компилятор RealView не содержит необходимых для этого средств,
поэтому потребуется для случая а) обработчик прерывания создавать с ис-
пользованием ассемблера (директива asm), а для случая б) включать код
обработчика прерывания непосредственно в стартовый код Startup.s.

1.12 Внешние прерывания


Запрос внешнего прерывания инициируется электрическим сигналом
на портовых линиях микроконтроллера. Входы внешних прерываний обозна-
чаются EINT0–EINT3. Внешнее прерывание способно вывести микроконтрол-
лер из режима отключения, когда почти все периферийные устройства не ра-
ботают и запросы прерываний от большинства источников невозможны.
1.12.1 Регистры управления блоком внешних прерываний
Схема управляющих регистров показана на рисунке 1.12.1.
Регистр EXTINT
● Биты 0–3 (EINT0–EINT3). Флаги запроса внешних прерываний.
Каждый из этих разрядов устанавливается в единицу при обнаружении за-
проса внешнего прерывания. Флаг сбрасывается путем записи в него единицы.
Регистр INTWAKE
● Биты 0–3 (EXTWAKE0–EXTWAKE3). Единица в каждом из разря-
дов разрешает вывод МК из режима отключения запросом внешнего преры-
вания с соответствующим номером.
● Биты 5 (USBWAKE). Установка бита в единицу разрешает вывод
МК из состояния отключения при появлении активности на шине USB.
● Биты 14 (BODWAKE). Установка бита в единицу разрешает вывод
МК из состояния отключения сигналом монитора питания (при падении
напряжения питания до 2,6 В).
● Биты 15 (RTCWAKE). Установка бита в единицу разрешает вывод
МК из состояния отключения сигналом от часов реального времени.

48
EXTINT – флаги запроса внешних прерываний
15 8 7 4 3 2 1 0
T3 T2 T1 T0
N N N N
EI EI EI EI
Флаги прерываний

INTWAKE – Разрешение выхода из отключенного режима


15 8 7 6 5 4 3 2 1 0
D T 3 T 2 T 1 T 0
TC SB EX KE EX KE EX KE EX KE
BO AKE R AKE U AKE A A A A
W W W W W W W
Монитор USB Внешние прерывания
Часы реального времени
питания
EXTMODE – Режим: перепад/уровень
15 8 7 4 3 2 1 0
T 3 T 2 T 1 T 0
EX DE EX DE EX DE EX DE
O O O O
M M M M
Уровень/перепад

EXTPOLAR – фронт/срез, низкий/высокий уровень


15 8 7 4 3 2 1 0
T 3 T 2 T 1 T 0
EX AR EX AR EX AR EX AR
L L L L
PO PO PO PO

Полярность/выбор фронта

Рисунок 1.12.1 – Схема регистров управления реакциями на внешние прерывания


Регистр EXTMODE
● Биты 0–3 (EXTMODE0–EXTMODE3). Установка единицы в каждый
разряд включает реакцию соответствующего входа прерывания на перепад
сигнала. Регистр EXTPOLAR (см. ниже) определяет спадающий или нарас-
тающий фронт. Сброс в ноль этих битов заставляет соответствующую линию
реагировать на статический логический уровень. Запрос прерывания посто-
янно вырабатывается, пока фиксируется активный логический уровень. Низ-
кий или высокий активный уровень определяется регистром EXTPOLAR.
Регистр EXTPOLAR
● Биты 0–3 (EXTPOLAR0–EXTPOLAR3). Сброс в ноль каждого раз-
ряда делает активным, спадающий фронт сигнала или на низкий логический
уровень в зависимости от значения EXTMODE. Установка единицы застав-
ляет линию прерывания реагировать на нарастающий перепад или высокий
логический уровень.
1.12.2 Порядок настройки блока внешних прерываний
1. Перевести в соответствующий режим портовые линии, которые ис-
пользуются для запроса внешних прерываний. Настройка производится через
регистры PINSEL0–PINSEL1 (раздел 1.9.3).
2. Выбрать реакцию на перепад напряжения или статический уровень
через регистр EXTMODE. По умолчанию выбрана реакция на уровень.
3. Выбрать активный уровень или фронт сигнала внешнего прерыва-
ния через регистр EXTPOLAR. По умолчанию выбран активный логический
ноль или спадающий фронт.

49
4. Если необходимо, разрешить «пробуждение» микроконтроллера по
запросу внешнего прерывания через регистр INTWAKE. Если режим отклю-
чения питания не используется, то настройка не производится.
5. Разрешить внешнее прерывание через регистры VICVectAddr0–15,
VICVectCntl0–15 и VICIntEnable.
Процедура обработки прерывания должна содержать команду сброса
флага путем записи единицы в соответствующий разряд регистра EXTINT.

1.13 Таймеры-счетчики
Таймеры-счетчики применяются для формирования и измерения ин-
тервалов времени или для подсчета числа внешних импульсов. Таймер-
счетчик представляет собой программируемый суммирующий счетчик с воз-
можностью выбора источника счетных импульсов. Микроконтроллер
LPC2148 оснащен двумя абсолютно идентичными по функциональным воз-
можностям 32-разрядными таймерами-счетчиками. Содержимое таймеров-
счетчиков доступно для чтения и записи через регистры TC0 и TC1.
1.13.1 Режим таймера и схема совпадения
В зависимости от источника счетных импульсов различают режим
таймера или счетчика. В режиме таймера ведется счет внутренних тактовых
импульсов микроконтроллера . При максимальной тактовой частоте
60 МГц разрядность позволяет продолжать счет без переполнения в течение
с. Формирования или измерение бóльших интервалов
времени возможно с использованием 32-разрядных предварительных счетчи-
ков-делителей c произвольным модулем счета в пределах разрядности (реги-
стры TxPC). Каскадное соединение таймера и предварительного делителя
практически бесконечно расширяет диапазон временных интервалов. При
тактовой частоте 60 МГц переполнение произойдет почти через 10 тысяч лет.
Временные интервалы формируются схемой совпадения, которая
сравнивает содержимое таймера с пороговыми регистрами TxMR0–TxMR3.
В момент равенства возможно выполнение следующих действий: сброс тай-
мера в ноль, остановка таймера, запрос прерывания, изменение логического
уровня на портовой линии. Четыре схемы совпадения позволяют выполнять
разные действия при достижении таймером каждого из четырех пороговых
значений.
Длительность временного интервала при увеличении таймера от 0 до
TxMRx без предварительно делителя ( ) составляет
. (1.13.1)
С предварительным делителем ( )
. (1.13.2)
Следовательно, значение порогового регистра, обеспечивающего за-
держку (без предварительного делителя) определяется выражением
. (1.13.3)
50
Здесь — ближайшее к целое, не превосходящее , а —
округленная до ближайшего целого величина .
1.13.2 Режим счетчика
В режиме счетчика подсчитываются импульсы напряжения, поступа-
ющие на портовые линии CAPx.0–CAPx.3. Максимальная частота на счетном
входе составляет 30 МГц.
1.13.3 Схема захвата
Схема захвата позволяет «запомнить» в регистрах TxCR0–TxCR3 те-
кущее состояние таймера-счетчика в момент появления сигнала на входных
портовых линиях CAPx.0–CAPx.3. Захват состояния осуществляется с мини-
мально возможной временной задержкой в один машинный цикл.
1.13.4 Управляющие регистры
Схема регистров управления таймерами-счетчиками приведена на ри-
сунке 1.13.1.
Регистры TxIR (T0TCR, T1TCR) содержат флаги прерываний от
схем совпадения и захвата. Установленный флаг должен сбрасываться в про-
цедуре обработки прерывания путем записи единицы в соответствующий
разряд. Запись нуля не оказывает влияния.
● Биты 0–3 (MR0I–MR3I) — флаги прерываний от выходов схемы
совпадения MAT0–MAT3.
● Биты 4–7 (CR0I–CR3I) — флаги прерываний от выходов схемы за-
хвата CAP0–CAP3. Регистры TxTCR (T0TCR, T1TCR) предназначены для
запуска и сброса таймеров-счетчиков МК. Каждый из них содержит только
два управляющих бита.
● Бит 0 (ENABLE). Установка единицы разрешает счет, сброс в ноль
запрещает счет.
● Бит 1 (RESET). Установка единицы приводит к сбросу таймера-
счетчика в ноль. Счет будет продолжен после сброса бита RESET в ноль.
Регистры TxCTCR (T0CTCR, T1CTCR) предназначены для
настройки режимов работы встроенных таймеров-счетчиков.
● Биты 0–1 (MODE). Отвечают за выбор режима работы таймера-
счетчика (таблица 1.13.1).
● Биты 2–3 (InputSelect). Отвечают за выбор линии CAPx.0–CAPx.3,
которая служит счетным входом или входом захвата. Номер линии (0–3) сов-
падает с двоичным кодом в InputSelect (00–11). Значение этих битов не важно
в режиме таймера ( ), когда внешние сигналы не используются.
Таблица 1.13.1 – Режимы работы таймеров-счетчиков МК LPC2148
MODE Режим таймера-счетчика
00 Режим таймера. Инкремент по фронту внутреннего сигнала PCLK
01 Режим счетчика. Инкремент по фронту внешнего сигнала CAP.
10 Режим счетчика. Инкремент по срезу внешнего сигнала CAP.
11 Режим счетчика. Инкремент по фронту и срезу сигнала CAP.

51
TxTCR – настройка таймеров-счетчиков
15 11 8 7 2 1 0
ET
ES EN
R
ВКЛ
Сброс

TxCTCR – настройка режима счета


15 8 7 4 3 2 1 0
Input
Select MODE
Режим
Выбор входа

TxMCR – настройка схемы совпадения


15 12 11 10 9 8 7 6 5 4 3 2 1 0
3S 3R 3I 2S 2R 2I 1S 1R 1I 0S 0R 0I
R R R R R R R R R R R R
M M M M M M M M M M M M

3 2 1 Сброс
Прерывание
Остановка
TxCCR – настройка схемы захвата
15 12 11 10 9 8 7 6 5 4 3 2 1 0
3 3 3 2 2 2 1 1 1 0 0 0
AP AP AP AP AP AP AP AP AP AP AP AP
C I C FE C RE C I C FE C RE C I C FE C RE C I C FE C RE

3 2 1 Срез
Фронт
Прерывание
TxEMR – настройка сигналов совпадения
15 12 11 10 9 8 7 6 5 4 3 2 1 0

EMC3 EMC2 EMC1 EMC0 EM3 EM2 EM1 EM0


Режим Режим Режим Режим Состояние

TxIR – флаги прерываний


15 8 7 6 5 4 3 2 1 0
3I 2I 1I 0I 3I 2I 1I 0I
R R R R R R R R
C C C C M M M M
Флаги прерываний Флаги прерываний
от схемы захвата от схемы совпадения

Рисунок 1.13.1 – Схема регистров управления таймерами-счетчиками


Регистры TxPR (T0PR, T1PR) содержат предельные 32-разрядные
значения предварительных счетчиков-делителей.
Регистры TxTC (T0TC, T1TC) содержат 32-х разрядный код, накоп-
ленный в таймере-счетчике.
Регистры TxPС (T0PС, T1PС) — содержимое 32-разрядных предва-
рительных счетчиков-делителей. Таймер-счетчик увеличивается на единицу
при достижении счетчиком-делителем TxPС предельного значения, заданно-
го в TxPR. Если , то в режиме таймера инкремент будет происхо-
дить каждый такт PCLK; если , каждый второй такт и т. д. (1.13.2).
Регистры TxMRx (T0MR0–T0MR3, T1MR0–T1MR3) — пороговые
регистры, с которыми сравнивается содержимое таймеров счетчиков. При
совпадении генерируются события, заданные регистром TxMCR.
Регистры TxMCR (T0MCR, T1MCR).

52
● Биты 0–11 (MR0I–MR3I, MR0R–MR3R, MR0S–MR3S) задают реак-
ции на совпадение таймера с каждым из пороговых регистров TxMR0–
TxMR3 (см. таблицу 1.13.2).
Таблица 1.13.2 – Реакции на совпадение таймера-счетчика с TxMR0–TxMR3
Управляющие биты Назначение
MR0I–MR3I Разрешить/запретить запрос прерывания
MR0R–MR3R Разрешить/запретить сброс таймера-счетчика в ноль
MR0S–MR3S Разрешить/запретить остановку счета
Регистры TxCRx (T0CR0–T0CR3, T1CR0–T1CR3) содержат состоя-
ния таймеров счетчиков, захваченные при событии CAP0–CAP3.
Регистры TxCCR (T0CCR, T1CCR) — настройка схемы захвата.
● Биты 0–3 (CAP0RE–CAP3RE, CAP0FE–CAP3FE, CAP0I–CAP3I) за-
дают событие, на которое реагирует каждая из четырех схем захвата, а также
указывают на необходимость прерывания по захвату (таблица 1.13.3).
Таблица 1.13.3 – Реакции на сигнал захвата CAPx.0–CAPx.3
Управляющие биты Назначение
CAP0RE–CAP3RE Захват по фронту сигнала CAPx.0–CAPx.3
CAP0FE–CAP3FE Захват по срезу сигнала CAPx.0–CAPx.3
CAP0I–CAP3I Запрос прерывания по событию захвата
Регистры TxEMR (T0EMR, T1EMR).
● Биты 0–3 (EM0–3) отражают состояние логических уровней на вы-
ходах MATx.0–MATx.3
● Биты 4–5 (EMC0–EMC3). Биты управляют формированием внешне-
го сигнала по совпадению таймера-счетчика с каждым из пороговых реги-
стров TxMR0–TxMR3 (в соответствии с таблицей 1.13.4).
Таблица 1.13.4 – Способы формирования внешнего сигнала совпадения
ECx Реакция на совпадение
00 Не изменять внешний сигнал MATx.0
01 Установить на выходе MATx.0 сигнал «логический ноль»
10 Установить на выходе MATx.0 сигнал «логическая единица»
11 Инвертировать сигнал на выходе MATx.0
1.13.5 Формирование интервалов времени через систему прерываний
Чаще всего формирование временного интервала осуществляется с
помощью процедуры обработки прерывания, вызываемой схемой совпаде-
ния. При этом рекомендуется придерживаться следующего порядка настрой-
ки аппаратуры микроконтроллера.
1. Настроить работу схемы совпадения через регистр TxMCR. Обычно
требуется включить сброс счетчика и запрос прерывания по совпадению с
одним из пороговых регистров, например, TxMR0. Для этого достаточно уста-
новить единицы в битах MR0R, MR0I регистра TxMСR. Запрос прерывания
необходимо разрешить, даже если предполагается программный опрос флага.

53
2. Задать значение выбранного порогового регистра TxMR0–TxMR3.
Расчет выполнить в соответствии с формулой (1.13.3).
3. Выбрать режим таймера в регистре TxCTCR. Если настройка про-
изводится после сброса, этот пункт можно опустить, поскольку при сбросе
регистр TxCTCR получит нулевое значение.
4. Разрешить счет путем записи единицы в регистр TxTCR.
Остановка счета осуществляется путем записи нуля в TxTCR. Если
требуется при этом сбросить таймер в ноль, то следует записать единицы в
нулевой и первый бит, то есть число 3.
Проверка окончания временного интервала выполняется путем опроса
флага либо с помощью прерывания.
Если разрешен запрос прерывания (регистр TxMCR), то окончание
временного интервала (совпадение TxMCR и TxMRx) будет сопровождаться
установкой бита, соответствующего пороговому регистру, в регистре TxIR.
Для программного опроса флага требуется внедрить в программу команды
проверки условия и ветвления.
Чаще вместо программного опроса флага используют прерывание от
схемы совпадения. Для этого необходимо разрешить прерывание с помощью
регистров VICVectAddr0, VICVectCntl0 и VICIntEnable (раздел 1.11.4). В
конце процедуры обработки прерывания сбросить флаг прерывания путем
записи единицы в соответствующий разряд регистра TxIR.
1.13.6 Измерение периода и длительности импульса с помощью
устройства захвата
Измеряемый временной интервал может быть определен как разность
двух значений таймера, захваченных в моменты начала и конца временного
интервала. Для настройки таймера и схемы захвата предлагается придержи-
ваться следующего порядка действий.
1. Перевести выбранную портовую линию в режим CAP путем записи
в регистры PINSEL0, PINSEL1 (таблицы 1.9.3, 1.9.4).
2. Настроить схему захвата через регистр TxCCR. При измерении дли-
тельности импульса необходимо включить реакцию на оба фронта; при из-
мерении периода — на передний или задний фронт. Рекомендуется также
разрешить прерывание.
3. Включить таймер путем записи единицы в регистр TxTCR.
4. Разрешить обработку прерывания по захвату с помощью регистров
VICVectAddr0–15, VICVectCntl0–15 и VICIntEnable (раздел 1.11.4).
5. В процедуре обработки прерывания требуется сохранить захвачен-
ное значение таймера, находящееся в одном из регистров захвата TxCC0–
TxCC3. Необходимо также хранить и предыдущее значение этого регистра.
6. Определить длительность измеряемого интервала времени по раз-
ности текущего ( ) и предыдущего ( ) значения регистра захвата
. (1.13.4)

54
Такой алгоритм необходим, если окончание одного временного ин-
тервала совпадает с началом следующего. С таким случаем имеем дело при
измерении периода прямоугольного сигнала, как интервала времени между
нарастающими или спадающими фронтами импульсов.
При измерении длительности импульса можно подключить сигнал
сразу к двум входам захвата и настроить реакцию одного из них (например,
CAP0.0) на нарастающий фронт, а другого — на спадающий (например,
CAP0.1). Прерывание разрешить только по спадающему фронту. Тогда нет
необходимости сохранять в памяти значения регистров захвата. Можно
определить длительность через разность текущих значений CAP0.1 и CAP0.0.
1.13.7 Подсчет числа импульсов в единицу времени
Для реализации частотомера потребуется два таймера-счетчика. Один
используется для формирования интервала счета (например, 1 с), другой
служит счетчиком внешних импульсов. Для определенности будем считать,
что TC0 — таймер, а TC1 — счетчик.
Тогда необходимо использовать один из выходов MAT0 (таймера-
счетчика 0), сигнализирующий об окончании интервала счета, в качестве
сигнала захвата CAP1 (таймера-счетчика 1). Потребуется внешнее электриче-
ское соединение соответствующих портовых линий MAT0 и CAP1.
Порядок настройки изложен ниже.
1. Перевести одну портовую линию в режим MAT0.x, и две в режим
CAP1.x и CAP2.x.
2. Через регистр T0MCR включить сброс таймера по совпадению.
3. Через регистр T0EMR включить инверсию выбранного выхода
MAT0.x.
4. Задать длительность формируемого интервала счета установкой по-
рогового регистра T0MRx. Опираться на формулу (1.13.3).
5. Запустить таймер через T0TCR.
6. Задать режим счетчика с инкрементом по одному из фронтов, вы-
брать счетный вход для TC1 через регистр T1CTCR.
7. В регистре T1CCR включить захват TC1 по обоим фронтам сигнала
на входе CAP1.x, соединенным с сигналом совпадения MAT0.x.
8. Разрешить счет через регистр T1TCR.
9. Разрешить прерывание от таймера 1 с помощью регистров
VICVectAddr0–15, VICVectCntl0–15 и VICIntEnable.

1.14 Широтно-импульсный модулятор


Широтно-импульсный модулятор (ШИМ) предназначен для формиро-
вания периодических последовательностей прямоугольных импульсов. Пе-
риод и длительность импульсов регулируются с шагом в один машинный
цикл (16,67 нс). Возможно формирование до шести последовательностей им-
пульсов одной частоты и разной скважности. Имеется режим, в котором за-
дается начальная фаза импульсов.

55
1.14.1 Основы функционирования
Упрощенная функциональная схема ШИМ показана на рисунке 1.14.1.
Основу модуля ШИМ составляет счетчик PWMTC (на схеме не показан),
семь пороговых регистров PWMMR0–PWMMR6 (также не показаны), набор
схем совпадения и D-триггеров, связанных с выходными портовыми линиями
МК PWM0–PWM6. Счетчик PWMTC инкрементируется в каждом такте .
PWMTC A ==
Y
PWMMR0 B
S Q PWM1
T

A ==
Y R
PWMMR1 B

D1 MX
D0 Y S Q PWM2
T
MWMSEL2 A
A ==
Y R
PWMMR2 B

D1 MX
D0 Y S Q PWM3
T
MWMSEL3 A
A ==
Y R
PWMMR3 B

D1 MX
D0 Y S Q PWM4
T
MWMSEL4 A
A ==
Y R
PWMMR4 B

D1 MX
D0 Y S Q PWM5
T
MWMSEL5 A
A
==
Y R
PWMMR5 B

D1 MX
D0 Y S Q PWM6
T
MWMSEL6 A
A
==
Y R
PWMMR6 B

Рисунок 1.14.1 – Упрощенная функциональная схема модуля ШИМ


С помощью схем совпадения счетчик PWMTC сравнивается с порого-
выми регистрами PWMMR0–6. При совпадении PWMTC и PWMMR0 фор-
мируется сигнал сброса счетчика в ноль (верхний график на рисунке 1.14.2).
Таким образом, пороговый регистр PWMMR0 используется для зада-
ния периода импульсов. При частота выходных импульсов
ШИМ определяется выражением
. (1.14.1)
Так как PWMMR0 — 32-разрядный регистр, диапазон изменения ча-
стоты весьма широк: от десятков мегагерц до сотых долей герц.
56
Рисунок 1.14.2 – Временные диаграммы работы ШИМ.
Управление начальной фазой отключено (PWMSEL2–6 = 0)
Остальные пороговые регистры служат для задания длительности им-
пульсов. D-триггеры, соединенные с выходными портовыми линиями МК
PWM0–PWM6, сбрасываются при совпадении счетчика PWMTC с соответ-
ствующим пороговым регистром PWMMR1–PWMMR6. Установка триггеров
может происходить двумя способами в зависимости от состояния мульти-
плексоров, управляемых сигналами PWMSEL2–6.
Если , установка осуществляется в начале каждого периода
ШИМ. При этом возможность регулировки начальной фазы отсутствует. По-
лучим шесть синхронных выходов с независимой регулировкой коэффициен-
та заполнения (рисунок 1.14.2). Коэффициент заполнения определяется сле-
дующим выражением:
. (1.14.2)
При установка триггеров PWM2, 4, 6 происходит при сбросе тригге-
ров PWM1, 3, 5. В этом случае пороговые регистры PWMMR1, 3, 5 исполь-
зуются для задания начальной фазы, а PWMMR2, 4, 6 для задания длитель-
ности импульсов. Данный режим задействует больше аппаратных ресурсов
(по два пороговых регистра на каждый выход), что приводит к сокращению
числа выходных сигналов. Получим три синхронных выхода PWM2, 4, 6 с
независимой регулировкой начальной фазы (угла включения) и коэффициен-
та заполнения (рисунок 1.14.3). В этом случае коэффициент заполнения (для
выхода PWM2)
. (1.14.3)
Для остальных выходов должны использоваться другие пары «четно-
го» и «нечетного» пороговых регистров.

57
Рисунок 1.14.3 – Временные диаграммы работы ШИМ
в режиме управления начальной фазой (PWMSEL2–6 = 1)

Начальная фаза
. (1.14.4)
Длительность импульса
. (1.14.5)

1.14.2 Дополнительные возможности


Имеется возможность деления входной тактовой частоты счет-
чика PWMTC предварительным счетчиком делителем PWMPC. Причем ко-
эффициент деления частоты задается в регистре PWMPR. Инкремент счетчи-
ка PWMTC осуществляется каждый PWMPR+1 такт . Таким образом,
действительная частота тактовых импульсов на входе счетчика PWMTC рас-
считывается по формуле
. (1.14.6)
Следовательно, частота выходных импульсов при
. (1.14.7)
Выше сказано, что сброс счетчика PWMTC осуществляется при сов-
падении его содержимого с пороговым регистром PWMMR0. На самом деле
есть возможность отслеживать его совпадение с любым из пороговых реги-
стров и выполнять одно из трех действий: сброс счетчика, остановка счета,
запрос прерывания.
Рассмотрим следующую ситуацию. Пусть счетчик ;
. Через 10 тактов их значения совпадут, что приведет к по-

58
явлению нового импульса. Если в этот момент увеличить частоту путем за-
писи в PWMMR0, например, числа 900, то PWMTC окажется больше
PWMMR0. Формирование нового импульса не произойдет до тех пор, пока
PWMTC не достигнет максимального значения , сбросится в ноль и
затем достигнет значения 800, что займет более 70 секунд. На это время ра-
бота ШИМ будет заблокирована.
Для предотвращения такого сбоя при изменении пороговых регистров
имеется система регистров-защелок. При этом сравнение счетчика осуществ-
ляется не с пороговыми регистрами, а с регистрами защелками, которые об-
новляются одновременно и только в начале каждого периода ШИМ. Подроб-
ней см. ниже (регистр PWMLER в разделе 1.14.3 и раздел 1.14.4).
1.14.3 Регистры управления ШИМ
Схема управляющих регистров показана на рисунке 1.14.4.
Регистры PWMTC, PWMPC — счетчик ШИМ и предварительный
делитель счетчика (соответственно). Как правило, ни в чтении, ни в записи
этого регистра необходимости не возникает.
Регистр PWMPR — регистр порогового значения для предваритель-
ного делителя, фактически, коэффициент деления частоты .
Регистр PWMTCR служит для управления счетчиком ШИМ.
● Бит 0 (CNTEN). Бит включения счетчика ШИМ. Для работы ШИМ
должен быть установлен в единицу.
● Бит 1 (RESET). Установка единицы приводит к сбросу счетчика
ШИМ. Счет блокируется, если бит равен единице.
● Бит 3 (PWMEN). Включение синхронного режима. В данном режи-
ме при изменении пороговых регистров (PWMMR0–PWMMR6) их содержи-
мое будет обновлено только в начале следующего периода. Изменение раз-
решается через регистр PWMLER (см. ниже).
Внимание! Запись в пороговый регистр PWMMR0 должна предше-
ствовать установке данного бита.
Регистр PWMMCR
● Биты 0–2 (MR0I–MR6I, MR0R–MR6К, MR0S–MR6S) задают реак-
цию на совпадение счетчика с каждым из пороговых регистров PWMMR0–
PWMMR6 (в соответствии с таблицей 1.14.1).
Регистр PWMPCR — управление начальной фазой.
● Биты 2–6 (PWMSEL2–6). Установка единицы в каждом разряде раз-
решает регулировку начальной фазы выходной линии ШИМ с тем же номе-
ром. На рисунке 1.14.1 выход Y соответствующего мультиплексора

Таблица 1.14.1 – Реакции на совпадение счетчика с PWMMRx


Управляющие биты Назначение
MR0I–MR6I Разрешить/запретить запрос прерывания
MR0R–MR6R Разрешить/запретить сброс таймера-счетчика в ноль
MR0S–MR6S Разрешить/запретить остановку счета

59
PWMTCR – настройка счетчика ШИМ
15 8 7 4 3 2 1 0
M ET N
T
PW EN ES C
EN
R
ВКЛ
Вкл. защелки пороговых регистров Сброс

PWMMCR – настройка схемы совпадения


23 21 20 19 18 17 16 15 14 13 12
6S 6R 6I 5S 5R 5I 4S 4R 4I
R R R R R R R R R
M M M M M M M M M

6 5 4
11 10 9 8 7 6 5 4 3 2 1 0
3S 3R 3I 2S 2R 2I 1S 1R 1I 0S 0R 0I
R R R R R R R R R R R R
M M M M M M M M M M M M

3 2 1 Сброс
Прерывание
Остановка
PWMPCR – настройка ШИМ
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
M M M M M M M M M M M
PW N6 PW N5 PW N4 PW N3 PW N2 PW N1 PW EL6 PW EL5 PW EL4 PW EL3 PW EL2
E E E E E E S S S S S
Включение каналов Вкл. управление начальной фазой

PWMLER – настройка регистров-защелок


15 8 7 6 5 4 3 2 1 0
T6 AT5 AT4 T3 AT2 AT1 AT0
LA L L LA L L L
Разрешение обновления регистров-защелок

PWMIR – флаги прерываний


15 11 10 9 8 7 4 3 2 1 0
6 5 4 3 1 2
0
M I M I M I M I M I M I M I
PW MR PW MR PW MR PW MR PW MR PW MR PW MR

Флаги прерываний от каналов ШИМ

Рисунок 1.14.4 – Схема регистров управления модулем ШИМ


соединяется с входом D1. Сброс данного бита в ноль отключает регулировку
начальной фазы соответствующего канала (начальная фаза равна 0 радиан),
выход Y соединяется с входом D0. Временные диаграммы работы ШИМ в
двух режимах показаны на рисунках 1.14.1 и 1.14.2.
Регистры PWMLER — синхронный режим.
● Биты 0–6 (LAT0–6). В синхронном режиме ( ) установ-
ка единиц разрешает копирование соответствующих программно доступных
пороговых регистров PWMMR0–6 в регистры защелки, воздействующие на
схемы совпадения. Изменение произойдет в начале следующего периода
ШИМ. Данный регистр необходим для обеспечения одновременного измене-
ния всех семи пороговых значений.
Регистры PWMIR — управление прерыванием.
● Биты 0–3, 8–10 (PWM0MRI–PWM6MRI). Флаги прерываний, уста-
навливаемые в единицу аппаратно при совпадении счетчика ШИМ с соответ-
ствующими пороговыми регистрами (PWMMR0–PWMMR6).

60
1.14.4 Порядок настройки ШИМ
1. Задать режим PWM для портовых линий, которые послужат выхо-
дами ШИМ через регистры PINSEL0, PINSEL1 (раздел 1.9.3).
2. Задать частоту импульсов путем записи в регистр PWMMR0 значе-
ния, рассчитанного по формуле (1.14.1) или (1.14.7).
3. Задать длительности импульсов и (или) начальные фазы с помощью
регистров PWMMR1–6. Необходимо устанавливать значения только тех ре-
гистров, которые связаны с задействованными выходами ШИМ. Использо-
вать выражения (1.14.2) при нулевой начальной фазе, выражения (1.14.3–
1.14.5) при регулируемой начальной фазе.
4. Произвести настройку счетчика модуля ШИМ через регистр
PWMTCR. Необходимо установить бит включения счетчика; рекомендуется
разрешить работу защелок. Следовательно, типовым значением является
.
5. Включить необходимые выходы ШИМ и выбрать режим управле-
ния начальной фазой для каждого канала через регистр PWMPCR.
После того как настройка произведена, генерирование прямоугольных
импульсов с заданными параметрами будет продолжаться, не требуя никако-
го участия со стороны программы. Изменение параметров сигнала (частоты,
начальной фазы, скважности) возможно в любой точке программы путем
следующей последовательности действий:
а) запись новых значений в регистры PWMMR0–6;
б) установка битов разрешения обновления защелок в регистре PWM-
LER. Запись единиц должна производиться одной командой.
Сброс регистра PWMLER в ноль выполняется автоматически.
Остановка ШИМ возможна путем сброса бита CNTEN в регистре
PWMTCR. Рекомендуется той же командой сбросить таймер установкой бита
RESET в том же регистре.
В разделе 3.6 приведены выражения для расчета пороговых значений,
позволяющие организовать ШИМ, частотное и фазовое управление.

1.15 Аналого-цифровые преобразователи


1.15.1 Краткие сведения о встроенных АЦП
Микроконтроллер LPC2148 оснащен двумя встроенными аналого-
цифровыми преобразователями (АЦП) поразрядного уравновешивания. Ос-
новные параметры встроенных АЦП приведены в таблице 1.15.1.
Каждый АЦП с помощью аналогового мультиплексора позволяет вы-
бирать один из нескольких сигналов, поступающих одновременно на анало-
говые входы. Для АЦП 0 таких входов шесть (AD0.1–4, AD0.6.–7), для АЦП
1 — восемь (AD1.0–7). В остальном АЦП идентичны.
Входы АЦП совмещены с цифровыми портовыми линиями. Как было
показано в разделе 1.9.3 выбор функции, выполняемой входом, осуществля-
ется через регистры PINSEL0 и PINSEL1.

61
Таблица 1.15.1 – Основные параметры АЦП МК LPC2148
Разрядность, бит 3–10
Мин. время преобразования при разрядности 10 бит, мкс 2,44
Макс. производительность при разрядности 10 бит, преобр./с 409 090
Мин. время преобразования при разрядности 3 бит, мкс 0,89
Макс. производительность при разрядности 3 бит, преобр./с 1 125 000
Число мультиплексируемых аналоговых входов (АЦП 0/1) 6/8
Диапазон измеряемого напряжения 0–3,3 В
Имеется рекомендация, в соответствии с которой для сохранения точ-
ности выходное сопротивление источника измеряемого напряжения не
должно превышать 40 кОм.
1.15.2 Общие рекомендации по использованию АЦП
Взаимодействие с аналого-цифровым преобразователем включает три
основных действия: запуск АЦП, ожидание готовности результата преобра-
зования, считывание и обработка результата. Существует несколько вариан-
тов алгоритмической реализации взаимодействия с аналого-цифровым пре-
образователем. Основное отличие состоит в способе запуска АЦП. Запуск
может осуществляться:
а) программным путем;
б) по совпадению счетчика с пороговым значением;
в) внешним электрическим сигналом;
г) окончанием предыдущего преобразования.
В таблице 1.15.2 дана краткая характеристика перечисленных спосо-
бов. Ниже будут рассмотрены все способы взаимодействия с АЦП, даны ре-
комендации по выбору каждого варианта, а также предложены шаблоны про-
граммного кода для их реализации.
Программный запуск АЦП реализуется командой, выполняемой при
наступлении некоторого события. Таким событием может быть нажатие
кнопки, получение команды от компьютера, истечение интервала времени и
т. п. Единственным преимуществом программного запуска является то, что
он не требует привлечения других ресурсов МК, таких как таймеры-
счетчики.
При решении большинства задач желательна строгая периодичность
запуска АЦП, а в некоторых случаях совершенно необходима. Могут быть
названы следующие причины. Во-первых, большинство методов цифровой
обработки сигналов разработаны для случая периодической дискретизации.
Для их применения необходимо, чтобы дискретные отсчеты напряжения бы-
ли получены через равные интервалы времени. Нарушение периодичности
неизбежно приведет к возникновению дополнительного шума квантования.
Во-вторых, одним из распространенных способов борьбы с некото-
рыми видами помех является синхронизация частоты квантования с частотой
измеряемого процесса или с частотой питающей сети.

62
Таблица 1.15.2 — Способы запуска АЦП в микроконтроллере LPC2148
Способ
Преимущества Недостатки Применение
запуска АЦП
Программный Не задействует ап- Непериодиче- Измерение посто-
паратных ская дискрети- янного или медлен-
узлов МК зация но меняющегося
напряжения с пери-
одом дискретиза-
ции от 0,1 с и выше
От таймера Периодическая дис- Задействован Широкий круг за-
кретизация; не тре- таймер дач цифровой обра-
бует участия про- ботки сигналов
граммы
Внешним Синхронизация Задействован Системы импульс-
сигналом внешним вывод МК; тре- но-фазового управ-
процессом бует источника ления, цифровая
синхросигнала обработка сигналов
Непрерывное Периодическая дис- Ограниченные Цифровая обработ-
преобразова- кретизация; не за- возможности ка сигналов с высо-
ние действует узлов выбора частоты кими частотами
МК; мин. задержки квантования квантования
между преобр.
Программный запуск АЦП практически не позволяет обеспечить
строгую периодичность запуска АЦП, а значит и периода дискретизации
сигнала. Причина заключается в том, что выполнение каждой итерации про-
граммы занимает различное время, например, из-за ветвлений с различным
числом команд в ветвях. Дополнительные временные задержки создают пре-
рывания от разных источников.
В связи с этим, программный запуск применять не рекомендуется.
Программный запуск допустим лишь в случаях, когда нет необходимости в
строгой периодичности дискретизации, например при измерении постоянно-
го или медленно меняющегося напряжения и притом, что нежелательно ис-
пользовать один из таймеров-счетчиков специально для формирования сиг-
нала запуска АЦП.
Отметим, что команда запуска АЦП, помещенная в процедуре обра-
ботки прерывания от таймера также не обеспечит строгой дискретизации.
Точнее обеспечит периодичность с некоторой погрешностью. Погрешность
возникает вследствие неизбежных временных задержек, которые имеют слу-
чайный характер (см. раздел 1.11.8).
Автоматический запуск при достижении таймером заданного по-
рогового значения. Этот способ можно назвать наиболее универсальным и
пригодным для решения большинства практических задач. Сигнал, формиру-
емый схемой совпадения таймера-счетчика, приведет к запуску без участия
программы. Запуск осуществляется строго периодически. Прерывание от

63
таймера при этом использовать не требуется. Это является еще одним пре-
имуществом — отсутствуют затраты процессорного времени на обработку
прерывания и команды запуска АЦП. Имеется единственный недостаток —
использование важного аппаратного ресурса — таймера-счетчика.
Считывание результата можно организовать путем программного опро-
са, либо с помощью прерывания от АЦП. Второй вариант предпочтителен.
Запуск внешним электрическим сигналом. Внешний пуск обеспе-
чивает синхронизацию процесса квантования с измеряемым процессом, что в
некоторых задачах совершенно необходимо, а в ряде других случаев, как
упоминалось выше, позволяет устранить некоторые составляющие случай-
ной погрешности. Использование одного из выводов МК, является несуще-
ственным недостатком. Существенную трудность составляет необходимость
построения аппаратной схемы синхронизации.
Непрерывная работа. В таком случае также обеспечивается строгая
периодичность, однако, доступна фиксированная сетка частот тактирования
АЦП и соответствующих частот квантования. При этом не предоставляется
возможность выбирать период квантования с шагом в один машинный цикл
МК. Доступный шаг гораздо больше. Следует отметить, что такой способ за-
пуска может гарантировать работу АЦП без простоев, то есть позволяет до-
биться наибольшей его производительности.
1.15.3 Управляющие регистры
Рассмотрим регистры, отвечающие за настройку аналого-цифровых
преобразователей (рисунок 1.15.1).
Регистры ADxCR
● Биты 0–7 (SEL) отвечают за выбор каналов АЦП. Каждому биту со-
ответствует канал с тем же номером AD0.0–AD0.7 (АЦП 0) или
AD1.0–AD1.7 (АЦП 1). Одновременная установка нескольких битов допус-
кается только в режиме автоматического сканирования каналов (см. ниже).
● Биты 8–15 (CLKDIV) служат для выбора тактовой частоты АЦП.
Тактовая частота определяется по формуле
, (1.15.1)
где — тактовая частота периферийных устройств, которая может быть
равна целой, половине или четверти тактовой частоты МК (раздел 1.7.2).
Значение не должно превышать 4,5 МГц.
● Бит 16 (BURST). Единица в данном разряде переводит АЦП в ре-
жим автоматического сканирования каналов. Производится поочередное
преобразование сигналов в каналах, выбранных битами SEL. В этом режиме
биты START (см. ниже) должны быть равны нулю.
● Биты 17–19 (CLKS) имеют значение только в режиме автоматиче-
ского сканирования каналов ( ). Эти биты определяют время пре-
образования и разрядность результата. Значению соответствует
время преобразования 11 тактов, разрядность 10 бит. С увеличением на еди-
ницу CLKCS, на единицу уменьшается время преобразования и разрядность.

64
ADxCR – настройка АЦП
31 28 27 26 24 23 22 21 20 19 17 16 15 8 7 0
E N ST
G START CLKS R CLKDIV SEL
ED PD BU
Способ запуска ВКЛ Число тактов Делитель частоты Выбор каналов АЦП ADx.7:0
Фронт/срез
в непр. режиме
Непрерывное преобразование
ADGSR – запуск всех АЦП
31 28 27 26 24 23 20 19 17 16 15 8 7 0
E ST
G START R
ED BU
Способ запуска
Фронт/срез
Непрерывное преобразование
ADxGDR – общий результат
31 30 29 28 27 26 24 23 16 15 8 7 6 5 0
-
E VE
N CHN RESULT
O O UN
D R
Готов Номер канала Результат аналого-цифрового преобразования
Потеря результата

ADxDRx – результат для канала


31 30 29 28 27 24 23 16 15 8 7 6 5 0
-
E VE
N RESULT
O O UN
D R
Готов Результат аналого-цифрового преобразования
Потеря результата

ADxSTAT – состояние
31 24 23 20 19 17 16 15 8 7 0
T
IN OVERUN7:0 DONE7:0
AD
Потеря результата каналов ADx.7:0 Готовность результата каналов ADx.7:0
Флаг прерывания
ADxINTEN – управление прерыванием
31 24 23 16 15 12 11 9 8 7 0
-
G N
AD T