Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Микроконтроллеры ARM7 семейств LPC2300/2400. Вводный курс разработчика

Вводный курс
Покупка
Артикул: 661886.02.99
Доступ онлайн
174 ₽
В корзину
Книга представляет собой введение в архитектуру процессора ARM7 TDMI и микроконтроллеров семейств LPC2300 и LPC2400 компании NXP. В ней рассматриваются следующие вопросы: введение в ядро ARM7, средства разработки программного обеспечения, системная архитектура и периферийные устройства микроконтроллеров LPC2300/2400. Кроме того, в книгу включено полное учебное пособие, где на практических примерах закрепляются вопросы, изложенные в основном тексте. Изучая теоретический материал и выполняя сопутствующие упражнения, вы быстро освоите ядро ARM7 и микроконтроллеры семейств LPC2300/2400. На компакт-диске, прилагаемом к книге, имеются справочные материалы и руководства пользователя по микроконтроллерам семейств LPC2300 и LPC2400, исходные коды всех упражнений и другие полезные материалы. Предназначена для разработчиков радиоэлектронной аппаратуры, инженеров, студентов технических вузов и радиолюбителей.
Тревор, М. Микроконтроллеры ARM7 семейств LPC2300/2400. Вводный курс разработчика : практическое руководство / М. Тревор ; пер. с англ. А. В. Евстифеева. - 2-е изд. - Москва : ДМК Пресс, Додэка-XXI, 2023. - 337 с. - (Мировая электроника). - ISBN 978-5-89818-450-6. - Текст : электронный. - URL: https://znanium.ru/catalog/product/2106219 (дата обращения: 16.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Тревор Мартин

МИКРОКОНТРОЛЛЕРЫ ARM7
СЕМЕЙСТВ LPC2300/2400

Вводный курс разработчика

Перевод с английского
Евстифеева А. В.

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

Москва
ДМК Пресс, Додэка-XXI, 2023

2-издание, электронное
УДК 621.316.544.1(035.5)
ББК 32.844.1-04я2
М29

Данное издание подготовлено к печати при участии студентов и преподавателей 
Уральского Государственного Политехнического университета (УПИ) С. А. Агафонова, 
И. В. Букрина, А. В. Гусева при финансовой поддержке 
Российского представительства компании NXP

М29
Мартин, Тревор.
Микроконтроллеры ARM7 семейств LPC2300/2400. Вводный курс разработчика / Т. Мартин ; 
пер. с англ. А. В. Евстифеева. — 2-е изд., эл. — 1 файл pdf : 337 с. — Москва : ДМК Пресс, 
Додэка-XXI, 2023. — (Мировая электроника). — Систем. требования: Adobe Reader XI либо 
Adobe Digital Editions 4.5 ; экран 10". — Текст : электронный.
ISBN 978-5-89818-450-6

Книга представляет собой введение в архитектуру процессора ARM7 TDMI и микроконтроллеров 
семейств LPC2300 и LPC2400 компании NXP. В ней рассматриваются следующие вопросы: введение 
в ядро ARM7, средства разработки программного обеспечения, системная архитектура и периферийные 
устройства микроконтроллеров LPC2300/2400. Кроме того, в книгу включено полное учебное 
пособие, где на практических примерах закрепляются вопросы, изложенные в основном тексте. Изучая 
теоретический материал и выполняя сопутствующие упражнения, вы быстро освоите ядро ARM7 
и микроконтроллеры семейств LPC2300/2400.
На компакт-диске, прилагаемом к книге, имеются справочные материалы и руководства пользователя 
по микроконтроллерам семейств LPC2300 и LPC2400, исходные коды всех упражнений и другие 
полезные материалы.
Предназначена для разработчиков радиоэлектронной аппаратуры, инженеров, студентов технических 
вузов и радиолюбителей.

УДК 621.316.544.1(035.5) 
ББК 32.844.1-04я2

Электронное издание на основе печатного издания: Микроконтроллеры ARM7 семейств LPC2300/2400. Вводный 
курс разработчика / Т. Мартин ; пер. с англ. А. В. Евстифеева. — Москва : ДМК Пресс, Додэка-XXI, 2016. — 336 с. — 
(Мировая электроника).— ISBN 978-5-97060-400-7. — Текст : непосредственный.

Все права защищены, никакая часть этого издания не может быть воспризведена в любой форме или любыми средствами, 
электронными или механическими, включая фотографирование, ксерокопирование или иные средства копирования или сохранения 
информации, без письменного разрешения издательства.
Оригинальное название «The Insider’s Guide To The NXP LPC2300/2400 Based Microcontrollers. An Engeneer’s Introduction To 
The LPC2300 & LPC2400 Series»..

В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских прав, 
правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации.

ISBN 978-5-89818-450-6
© Hitex (U K) Lt d. 
© Издательский дом «Додэка-XXI» 
© Издание, ДМК Пресс, 2016
Оглавление 3

Введение  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Глава 1. Процессорное ядро ARM7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

1.1. Основные положения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2. Конвейер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3. Регистры  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4. Регистр текущего состояния программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5. Режимы обработки исключительных ситуаций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.6. Набор команд ARM7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.6.1. Команды ветвления  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.6.2. Команды обработки данных  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.7. Команда обмена . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.8. Изменение регистров состояния . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.9. Программное прерывание  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.10. Модуль MAC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.11. Набор команд THUMB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.12. Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Глава 2. Разработка программного обеспечения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

2.1. Основные положения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.1.1. Загрузка и установка пакета программ компании Keil . . . . . . . . . . . . . . . . . . . . . 30
2.1.2. ИСР μVISION  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.1.3. ИСР HiTOP  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.1.4. Учебные примеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.2. Стартовый код  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.2.1. Определение карты памяти проекта  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.2.2. Определение карты памяти для компилятора GCC  . . . . . . . . . . . . . . . . . . . . . . . 38
2.3. Взаимодействие кодов ARM и THUMB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.3.1. Обеспечение взаимодействия в компиляторе GCC  . . . . . . . . . . . . . . . . . . . . . . . 43
2.4. Библиотека STDIO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.4.1. Библиотека STDIO и компилятор GCC  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

ОГЛАВЛЕНИЕ
Оглавление

2.5. Организация доступа к периферийным устройствам  . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.5.1. Организация доступа к периферийным устройствам в компиляторе GCC  . . . 46
2.6. Процедуры обработки прерываний  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.6.1. Обработка прерываний в компиляторе GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.6.2. Отладка обработчиков системных ошибок  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.6.3. Программное прерывание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.6.4. Программное прерывание и компилятор GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.6.5. Размещение переменных по абсолютным адресам . . . . . . . . . . . . . . . . . . . . . . . . 51
2.6.6. Размещение кода в ОЗУ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.6.7. Загрузка кода и данных в ОЗУ при использовании компилятора GCC  . . . . . . 52
2.7. Встраиваемые функции  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.7.1. Встраиваемые функции в компиляторе GCC  . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.8. Встроенный ассемблер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.8.1. Встроенный ассемблер компилятора GCC  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.8.2. Импортирование программ для компилятора GCC . . . . . . . . . . . . . . . . . . . . . . . 56
2.9. Аппаратные средства отладки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.9.1. Важное замечание!  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.9.2. Еще более важное замечание! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.10. Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

Глава 3. Системные периферийные устройства. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  60

3.1. Основные положения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.2. Внутренние шины . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.3. Организация памяти . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.4. Программирование регистров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.5. Модуль ускорения работы памяти  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.5.1. Пример конфигурирования модуля MAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.6. Программирование FLASHпамяти. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.6.1. Управление картой распределения памяти  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.6.2. Загрузчик  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.6.3. Внутрисхемное программирование (ISP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.6.4. Внутрипрограммное программирование (IAP)  . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.6.5. Защита FLASHпамяти  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.6.6. Системные тактовые сигналы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.6.7. Схема ФАПЧ  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.6.8. Тактовые сигналы периферийных устройств . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.7. Управление электропитанием . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.7.1. Группы потребителей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.7.2. Режимы пониженного энергопотребления  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.8. Система прерываний LPC2300  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
3.8.1. Блок управления выводами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.8.2. Выводы внешних прерываний  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.8.3. Структура прерываний . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.8.4. Прерывание FIQ  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Оглавление 5

3.8.5. Выход из прерывания FIQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
3.8.6. Векторные прерывания IRQ  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.8.7. Выход из прерывания IRQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3.8.8. Пример: прерывание IRQ  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3.8.9. Программное прерывание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
3.8.10. Вложенные прерывания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.9. Контроллер DMA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.9.1. Обзор модуля DMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.9.2. Синхронизация DMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
3.9.3. Пересылка из памяти в память . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
3.9.4. Пакетная передача  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
3.9.5. Поддержка модулем DMA периферийных устройств . . . . . . . . . . . . . . . . . . . . . . 94
3.9.6. Пересылка несмежных данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
3.10. Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

Глава 4. Периферийные устройства общего назначения. . . . . . . . . . . . . . . . . . . . . . . . . . 96

4.1. Основные положения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.2. Порты ввода/вывода общего назначения  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.2.1. Быстрые регистры ввода/вывода  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.2.2. Прерывание от GPIO  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4.3. Таймеры общего назначения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
4.3.1. Режим захвата  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
4.3.2. Режим счетчика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.3.3. Режим совпадения  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.4. Модуль ШИМ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
4.4.1. Режим счетчика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
4.5. Часы реального времени. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
4.5.1. Опорный сигнал модуля RTC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
4.6. Сторожевой таймер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
4.6.1. Период сторожевого таймера  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
4.7. Универсальный асинхронный приемопередатчик. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
4.7.1. Настройка скорости обмена  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
4.7.2. Автоопределение скорости обмена  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
4.7.3. Передача данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
4.7.4. Организация обмена по протоколу IrDA  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
4.8. Интерфейс I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
4.9. Интерфейс SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
4.10. Аналогоцифровой преобразователь  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
4.11. Цифроаналоговый преобразователь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
4.12. Синхронный последовательный порт  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
4.12.1. Контроллер I2S  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
4.13. Интерфейс карт FLASHпамяти . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
4.13.1. Модуль MCI микроконтроллеров семейства LPC2300 . . . . . . . . . . . . . . . . . . . 146
Оглавление

Глава 5. Развитые периферийные устройства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  150

5.1. Ethernet MAC  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
5.2. Протокол TCP/IP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
5.2.1. Сетевая модель  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
5.2.2. Ethernet и IEEE 802.3  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
5.2.3. Дейтаграммы TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
5.2.4. Модуль Ethernet MAC  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
5.2.5. Стек uIP  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
5.2.6. Создание вебсервера с использованием коммерческого стека TCP/IP . . . . . 173
5.3. Полноскоростной интерфейс USB 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
5.3.1. Введение в USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
5.3.2. Модуль контроллера USB  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
5.3.3. Заключение  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
5.4. Контроллер интерфейса CAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
5.4.1. Семиуровневая модель ISO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
5.4.2. Структура узла сети CAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
5.4.3. Объекты сообщений CAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
5.4.4. Арбитраж на шине CAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
5.4.5. Тактовая синхронизация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
5.4.6. Передача сообщений CAN  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
5.4.7. Ограничение распространения ошибок  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
5.4.8. Прием сообщений CAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
5.4.9. Фильтрация сообщений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

Глава 6. Использование ОС компании Keil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  229

6.1. Возможности ОСРВ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
6.2. Настройка проекта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
6.3.   Процессы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
6.4. Запуск ОСРВ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
6.5. Создание процессов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
6.6. Управление процессами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
6.7. Множество экземпляров. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
6.8. Управление временем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
6.8.1. Формирование задержки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
6.8.2. Периодический запуск процесса  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
6.8.3. Виртуальный таймер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
6.8.4. Демон ожидания  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
6.9. Межпроцессное взаимодействие  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
6.9.1. События  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
6.9.2. Обработка прерываний в ОСРВ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
6.9.3. Семафоры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
6.9.4. Предостережение по поводу семафоров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
6.9.5. Мьютексы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Оглавление 7

6.9.6. Предостережение по поводу мьютексов  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
6.9.7 Буферы сообщений 243
6.10. Конфигурация  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246

Глава 7. Использование ОС FreeRTOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

7.1. Портирование ОС FreeRTOS на LPC2300 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
7.1.1. Тики таймера  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
7.1.2. Процедура обработки прерывания от таймера . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
7.1.3. Переключение контекста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
7.1.4. Инициализация стека . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
7.1.5. Управление памятью  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
7.2. Конфигурация FreeRTOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
7.2.1. Запуск FreeRTOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.2.2. Процессы  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
7.2.3. Управление процессами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
7.2.4. Ловушка на тики  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
7.2.5. Семафоры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
7.2.6. Управление ядром . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

Глава 8. Учебное пособие. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263

Введение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Упражнение 1. Знакомство с ИСР Keil.  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Установка аппаратных средств.  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Отладчик Keil.  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Редактирование проекта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Управление процессом выполнения программы.  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Просмотр данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Упражнение 2. Стартовый код.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Упражнение 3. Совместное использование команд ARM и THUMB.  . . . . . . . . . . . . . . . . 287
Упражнение 4. Программное прерывание.  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Упражнение 5. Модуль MAM.  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Упражнение 6. Использование загрузчика от NXP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Упражнение 7. Схема ФАПЧ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Упражнение 8. Конфигурирование системы тактирования.. . . . . . . . . . . . . . . . . . . . . . . . . 299
Упражнение 9. Быстрое прерывание. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Упражнение 10. Векторное прерывание.  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Упражнение 11. Пересылка данных из памяти в память при помощи DMA.  . . . . . . . . . . 306
Упражнение 12. Пересылка несмежных данных при помощи DMA.  . . . . . . . . . . . . . . . . . 308
Упражнение 13. Порты ввода/вывода общего назначения.. . . . . . . . . . . . . . . . . . . . . . . . . . 309
Упражнение 14. Прерывание от порта GPIO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Упражнение 15. Функция захвата (capture).. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Упражнение 16. Функция совпадения (match). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Упражнение 17. ШИМ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Упражнение 18. Часы реального времени. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Оглавление

Упражнение 19. UART. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Упражнение 20. Аналогоцифровой преобразователь.  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Упражнение 21. Цифроаналоговый преобразователь. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Упражнение 22. Драйвер Ethernet.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Упражнение 23. TCP/IP стек uIP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Упражнение 24. Передача по интерфейсу CAN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Упражнение 25. Прием по интерфейсу CAN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Упражнение 26. Прием в режиме FullCAN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Упражнение 27. Запуск двух процессов в ОСРВ.  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Упражнение 28. Управление временем. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Упражнение 29. Приостановка и запуск процесса.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Упражнение 30. Возобновление процесса из обработчика прерывания. . . . . . . . . . . . . . . 331
Упражнение 31. Процесс Idle.  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Упражнение 32. Семафор.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Упражнение 33. Очередь сообщений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334

Приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  335

Список литературы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Полезные ссылки.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Оценочные платы и модули.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Эта книга представляет собой практическое руководство для тех, кто собирается использовать в своих новых разработках те или иные микроконтроллеры семейств LPC2300 и LPC2400 компании NXP Semiconductors. Данная книга не является ни справочником, ни учебным пособием. Предполагается, что читатель
имеет некоторый опыт в области программирования микроконтроллеров для
встраиваемых систем и знаком с языком программирования Си. Основной объем
технической информации содержится в четырех первых главах книги, поэтому
если вы совершенно не знакомы с семействами LPC2300/2400 и, в частности, с
процессорным ядром ARM7, вам необходимо внимательно прочитать эти главы.
Обращаю ваше внимание, что в книге речь пойдет, в основном, о семействе
LPC2300, а особенности, присущие семейству LPC2400, будут отмечены особо.
В первой главе рассматриваются основные характеристики процессорного
ядра (ЦПУ) ARM7. После прочтения этой главы вы будете знать достаточно, чтобы  начать писать программы для любых устройств, построенных на базе ядра
ARM7. Если же вы хотите расширить свои знания, к вашим услугам имеется несколько прекрасных книг, описывающих эту архитектуру, часть из которых указана в списке литературы. Во второй главе рассказывается о том, как следует писать
программы на языке Си для процессора ARM7. По существу, в этой главе описываются специфические расширения стандарта ANSI C, требуемые для программирования встраиваемых систем. Все примеры, встречающиеся в книге, были написаны с использованием коммерческого компилятора, однако в настоящее время на платформу ARM перенесен и бесплатный пакет программ GCC.
После прочтения первых двух глав книги вы должны хорошо разбираться в
процессоре и средствах разработки для него. Третья глава посвящена системной
периферии семейства LPC2300. В ней рассказывается о системной архитектуре
микроконтроллеров семейства и рассматривается вопрос конфигурирования
микросхем для достижения наибольшей производительности. В четвертой главе
мы познакомимся со встроенными периферийными устройствами этих микроконтроллеров и узнаем, как их необходимо конфигурировать при использовании
в своих программах. В пятой главе описываются более сложные периферийные
устройства, такие как контроллер USB и контроллер Ethernet. Шестая и седьмая
главы книги посвящены двум популярным операционным системам реального

ВВЕДЕНИЕ
Введение

времени для микроконтроллеров с ядром ARM — платной, разработки компании
Keil, и бесплатной FreeRTOS.
На протяжении всей книги вам будут встречаться различные упражнения, которые подробно рассматриваются в восьмой главе, посвященной практическим
занятиям. Все эти упражнения можно выполнить, используя ознакомительные
версии компилятора и симулятора, имеющиеся на компактдиске, который прилагается к книге. В продаже также имеется недорогой стартовый набор разработчика (starter kit), используя который вы можете загрузить учебную программу в
реальный микроконтроллер и удостовериться, что она действительно работает.
Я искренне надеюсь, что, читая эту книгу и выполняя упражнения, вы быстро освоите микроконтроллеры семейств LPC2300 и LPC2400.
1.1.  Основные положения 11

1.1.
Основные положения

Все микроконтроллеры семейства LPC2300 построены на основе ЦПУ ARM7.
Вообще говоря, чтобы использовать эти микроконтроллеры, вам совершенно не
нужно быть экспертом в области программирования процессора ARM7, поскольку заботу о большинстве сложных моментов берет на себя компилятор языка Си.
Тем не менее, чтобы разработать надежное устройство, вы должны иметь хотя бы
общее представление о том, как работает ЦПУ и какие у него имеются особенности.
В этой главе мы рассмотрим основные характеристики ядра ARM7 вместе с
его моделью программирования, а также обсудим набор команд, используемый
данным процессором. В результате вы получите всю необходимую информацию о
процессоре, являющемся «сердцем» семейства LPC2300. Для более углубленного
изучения процессоров ARM рекомендую обратиться к книгам, указанным в списке литературы.
Ключевой принцип, лежащий в основе процессора ARM, — простота. Ядро
ARM7 является RISCмашиной, предполагающей использование небольшого
числа команд и соответственно состоящей из относительно небольшого количества логических элементов. Благодаря этому процессор ARM7 идеально подходит
для использования во встраиваемых системах. Он имеет высокую производительность, низкое энергопотребление и занимает небольшую часть общей площади
кристалла.

1.2.
Конвейер

Основной элемент ЦПУ ARM7 — конвейер команд, который используется
для обработки команд, считанных из памяти программ. Конкретно, в ядре ARM7
реализован трехступенчатый конвейер (Рис. 1.1).
Трехступенчатый конвейер является самой простой разновидностью конвейеров и не подвержен возникновению различных опасных ситуаций, таких как
«чтение раньше записи», которые встречаются в конвейерах с бо льшим числом
ступеней. Конвейер имеет три аппаратнонезависимые ступени, благодаря котоГЛАВА 1

ПРОЦЕССОРНОЕ ЯДРО ARM7
Глава 1. Процессорное ядро ARM7

рым одновременно с выполнением одной команды осуществляется декодирование второй и выборка третьей. Он настолько эффективно ускоряет прохождение
команд через ЦПУ, что большинство команд ARM может выполняться за один
такт. Конвейер наиболее эффективен при выполнении линейного кода. При обнаружении перехода конвейер сбрасывается, и для возобновления выполнения
программы с максимальной скоростью он должен сначала заполниться. Позже
мы с вами увидим, что набор команд процессора ARM имеет несколько интересных особенностей, позволяющих исключить из кода короткие переходы для
улучшения прохождения кода по конвейеру. Поскольку конвейер является составной частью ЦПУ, он полностью скрыт от программиста. Тем не менее, важно
помнить, что значение счетчика команд (Program Counter — PC) на 8 байт превышает значение адреса текущей выполняемой команды. В связи с этим необходимо аккуратно подходить к вычислению смещений в случае относительной адресации с использованием счетчика команд.
Например, команда:

0x40000
LDR
PC,[PC,#4]
загрузит в счетчик команд PC содержимое, находящееся по адресу PC + 4. Поскольку PC опережает текущую команду на 8 байт, в него будет загружено содержимое по адресу 0x400C, а не 0x4004.

1.3.
Регистры

Процессор 
ARM7 
имеет 
архитектуру 
«loadandstore» 
(загрузка —
сохранение), поэтому для выполнения любой обработки данных необходимо
сначала перенести эти данные из памяти в определенные регистры, выполнить
команду обработки данных и затем записать полученные значения обратно в память (Рис. 1.2).
Основной регистровый файл состоит из 16 пользовательских регистров
R0…R15 (Рис. 1.3). Каждый из этих регистров является 32битным1). Регистры

Рис. 1.1. Работа трехступенчатого конвейера.

1)  В отечественной литературе принято пользоваться понятиями «разряд», «разрядный». Двоичный разряд — это бит. В данном издании мы будем придерживаться зарубежной терминологии («бит»,
«битный»), что более соответствует современной тенденции в цифровой технике. — Примеч. пер.

Команда

Выборка

Декодирование

Выполнение

1
2
3
4
5
6

Трехступенчатый конвейер ядра ARM7 имеет три независимых ступени: 
выборка, декодирование и выполнение.
1.3.  Регистры 13

R0…R12 предназначены исключительно для нужд пользователя и не выполняют
никаких других функций, в то время как регистры R13…R15 имеют дополнительные функции. Регистр R13 используется в качестве указателя стека (Stack
Pointer — SP). Регистр R14 называется регистром связи (Link Register — LR). При
вызове подпрограммы адрес возврата автоматически запоминается в регистре
связи, откуда затем считывается при возврате. Такое решение позволяет быстро
переходить к «концевым» функциям (функции, которые не вызывают других
функций) и возвращаться из них. Если же функция входит в состав «ветви»,
т.е. вызывает другие функции, содержимое регистра связи необходимо сохранять
в стеке (R13). Наконец, регистр R15 выполняет функции счетчика команд (PC).
Что интересно, многие команды могут работать с регистрами R13…R15, как с
обычными пользовательскими регистрами.

Рис. 1.2. Обработка данных.

Рис. 1.3. Структура основного регистрового файла.

M1

Add R4, R1, R2    
(R4 = R1 + R2)
Mov M2, R2

Mov M1, R1

Mov R4, M3

M2

M3

ЦПУ ARM7 имеет 
архитектуру 
«loadandstore». 
Все команды обработки 
данных могут работать 
только с основным 
регистровым файлом.

R13 используется в качестве указателя стека

Регистр текущего состояния программы

R14 — регистр связи

R15 — счетчик команд

15 пользовательских регистров + PC

R0

R1

R2

R3

R4

R5

R6

R7

R8

R9

R10

R11

R12

R13

R14

R15 (PC)

CPSR

В основной регистровый файл входят 
шестнадцать 32битных регистров 
и один дополнительный регистр ЦПУ, 
который называется регистром 
текущего состояния программы. 
R0…R12 — пользовательские 
регистры, а регистры R13…R15 
выполняют специальные функции.
Глава 1. Процессорное ядро ARM7

1.4.
Регистр текущего состояния программы

Наряду с банком регистров в ЦПУ имеется дополнительный 32битный регистр, который называется регистром текущего состояния программы (Current
Program Status Register — CPSR). Регистр CPSR содержит набор флагов, которые
управляют функционированием ЦПУ ARM7 и отображают его состояние
(Рис. 1.4).

В старших четырех битах регистра CPSR хранятся флаги условий, значения
которых определяются процессором. Эти флаги отражают результат выполнения
очередной команды обработки данных. Благодаря им вы можете узнать, не было
ли получено в результате выполнения команды отрицательное или нулевое значение, а также не произошел ли перенос или переполнение. Младшие восемь битов
регистра CPSR содержат флаги, значения которых прикладная программа может
изменять. Биты 7 и 8 являются флагами I и F соответственно. Эти флаги используются для разрешения и запрещения двух линий прерываний, являющихся внешними по отношению к ЦПУ ARM7. Как мы с вами увидим позже, все периферийные модули микроконтроллеров LPC2300 подключены к этим двум линиям
прерываний. При работе с данными битами нужно соблюдать осторожность, поскольку для запрещения любого из источников прерываний в соответствующий
бит необходимо записать 1, а не 0, как можно было бы предположить. Пятый бит
регистра является флагом THUMB.
ЦПУ ARM7 поддерживает два набора команд — 32битный набор команд
ARM и 16битный набор команд THUMB. Соответственно флаг T показывает,
какой из наборов команд используется. Учтите, что программа не должна пытаться напрямую устанавливать или сбрасывать этот флаг для переключения между
наборами команд. Корректный механизм смены текущего набора команд мы рассмотрим чуть позже. Последние пять битов регистра CPSR являются флагами режима. В общей сложности процессор ARM7 поддерживает 7 режимов работы.

Рис. 1.4. Регистр текущего состояния программы.

Режим работы
процессора:

10000 — User

10001 — FIQ

10010 — IRQ

10011 — Supervisor

10111 — Abort

11011 — Undefined

11111 — System

Набор команд Thumb

Разрешение прерываний:
I — IRQ, F — FIQ
Флаги условий:

N — отрицательный результат

Z — нулевой результат

C — перенос

V — переполнение

N

31 30 29 28
8
7
6
5
4
3
2
1
0
27

Z
C
V
I
F
T
M M M M M

4
3
2
1
0

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

Прикладные программы, как правило, выполняются в режиме User. В этом режиме программа может обращаться к регистрам R0…R15 и CPSR. Однако при возникновении исключительных ситуаций (таких как прерывание, ошибка памяти
или выполнение команды генерации программного прерывания) режим работы
процессора изменяется. При этом регистры R0…R12 и R15 остаются теми же самыми, а регистры R13 (SP) и R14 (LR) заменяются новой парой регистров, уникальной для каждого режима. Таким образом, каждый режим имеет собственные
регистр связи и указатель стека. Более того, в режиме быстрых прерываний (FIQ)
дублируются и регистры R7…R12. Это позволит вам сразу же приступить к обработке прерывания FIQ, не тратя время на сохранение регистров в стеке.
В каждом из режимов, за исключением режима User, имеется дополнительный регистр, называемый регистром сохраненного состояния программы (Saved
Program Status Register — SPSR). Если в момент возникновения исключительной
ситуации программа находилась в режиме User, происходит смена режима и текущее содержимое регистра CPSR сохраняется в регистре SPSR. После обработки
исключительной ситуации (при возврате из обработчика) содержимое регистра
CPSR восстанавливается из SPSR, обеспечивая возобновление выполнения прикладной программы. Режимы работы процессора показаны на Рис. 1.5.

Рис. 1.5. Режимы работы процессора.

R0

R1

R2

R3

R4

R5

R6

R7

R8

R9

R10

R11

R12

R13

R14

R15  (PC)

CPSR

R0

R1

R2

R3

R4

R5

R6

R7_fig

R8_fig

R9_fig

R10_fig

R11_fig

R12_fig

R13_fig

R14_fig

R15  (PC)

CPSR

R0

R1

R2

R3

R4

R5

R6

R7

R8

R9

R10

R11

R12

R13_svc

R14_svc

R15  (PC)

CPSR

R0

R1

R2

R3

R4

R5

R6

R7

R8

R9

R10

R11

R12

R13_abt

R14_abt

R15  (PC)

CPSR

R0

R1

R2

R3

R4

R5

R6

R7

R8

R9

R10

R11

R12

R13_irq

R14_irq

R15  (PC)

CPSR

R0

R1

R2

R3

R4

R5

R6

R7

R8

R9

R10

R11

R12

R13_und

R14_und

R15  (PC)

CPSR

SPSR_fig
SPSR_svc
SPSR_abt
SPSR_irq
SPSR_und

System & User
FIQ
Supervisor
Abort
IRQ
Undefined

ЦПУ ARM7 имеет 6 различных рабочих режимов, которые используются 
для обработки исключительных ситуаций. Затененные регистры представляют собой
 дублирующие регистры, которые «включаются» при изменении режима работы. 
Регистр SPSR используется для сохранения содержимого регистра CPSR 
при переключении режимов.
Глава 1. Процессорное ядро ARM7

1.5.
Режимы обработки исключительных ситуаций

При возникновении исключительной ситуации изменяется режим работы
ЦПУ, и в PC загружается адрес соответствующего вектора прерывания (Табл. 1.1).
Таблица векторов начинается с нулевого адреса, первым в таблице расположен
вектор сброса, а за ним остальные векторы (по 4 байта на каждый).

Замечание. В таблице векторов имеется «дырка», поскольку вектор с адресом 0x00000014 отсутствует. Этот адрес использовался в ранних версиях процессоров ARM, а в процессоре
ARM7 он сохранен, чтобы обеспечить программную совместимость между различными архитектурами ARM. Однако, как мы увидим позже, в микроконтроллерах семейства LPC2300,
эти четыре байта играют очень важную роль.
При одновременном возникновении нескольких исключительных ситуаций
используется метод приоритетов. Приоритеты прерываний приведены в Табл. 1.2.

Когда возникает исключительная ситуация, например, прерывание IRQ, процессор выполняет следующие действия (Рис. 1.6). Вопервых, адрес следующей
выполняемой команды (PC + 4) сохраняется в регистре связи. Затем регистр
CPSR копируется в регистр SPSR конечного режима (в нашем случае SPSR_irq).
После этого в PC заносится адрес вектора прерывания режима исключительной
ситуации. Для режима IRQ этот адрес — 0x00000018. В то же время режим работы
процессора меняется на IRQ, в результате чего регистры R13 и R14 заменяются
соответствующими регистрами этого режима. При входе в режим IRQ устанавливается флаг I регистра CPSR, что приводит к отключению линии IRQ. Если требуется использовать вложенные прерывания, то вы должны вручную разрешить

Таблица 1.1. Адреса векторов прерываний

Исключительная ситуация
Режим
Адрес вектора

Каждому режиму работы соответствует свой 
вектор прерывания. При 
смене процессором режима производится переход 
по этому вектору.
Обратите внимание! 
Вектор по адресу 
0x00000014 отсутствует!

Reset (сброс)
Supervisor
0x00000000

Undefined instruction (неопределенная команда)
Undefined
0x00000004

SWI (программное прерывание)
Supervisor
0x00000008

Prefetch Abort (ошибка обращения к памяти 
при выборке команды)
Abort
0x0000000C

Data Abort (ошибка обращения к памяти при 
доступе к данным)
Abort
0x00000010

IRQ (прерывание)
IRQ
0x00000018

FIQ (быстрое прерывание)
FIQ
0x0000001C

Таблица 1.2. Приоритеты прерываний

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

Высший 1
Reset

2
Data Abort

3
FIQ

4
IRQ

5
Prefetch Abort

Низший 6
Undefined instruction SWI
Доступ онлайн
174 ₽
В корзину