- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 1. Архитектура и аппаратные средства микроконтроллера LPC214x
- •1.1 Общие сведения о микроконтроллерах LPC214x
- •1.2 Программистская модель процессорного ядра ARM7TDMI
- •1.2.1 Режимы работы ядра ARM7
- •1.2.2 Система регистров
- •1.2.3 Слово состояния программы
- •1.2.4 Организация памяти
- •1.3 Система команд
- •1.3.1 Команды арифметической и логической обработки
- •1.3.2 Команды умножения
- •1.3.3 Команды регистровой пересылки
- •1.3.4 Команды загрузки и сохранения регистров
- •1.3.5 Команды пакетного обмена с памятью
- •1.3.6 Команды передачи управления
- •1.3.7 Команды обращения к слову состояния программы
- •1.4 Методы адресации
- •1.4.1 Непосредственная адресация
- •1.4.2 Регистровая адресация
- •1.4.3 Косвенная адресация
- •1.4.4 Индексная адресация
- •1.5 Процедура начальной загрузки и режимы отображения памяти
- •1.6 Обработка исключительных ситуаций
- •1.7 Система тактирования
- •1.7.1 Выбор тактовой частоты микроконтроллера
- •1.7.2 Настройка тактирования периферийных устройств
- •1.8 Модуль ускорения памяти
- •1.9 Внешние выводы микроконтроллера
- •1.9.1 Служебные контакты
- •1.9.2 Программно-управляемые линии ввода-вывода
- •1.9.3 Альтернативные функции линий ввода вывода
- •1.10 Цифровые порты ввода-вывода
- •1.10.1 Управление портом через низкоскоростную шину
- •1.10.2 Управление портом через высокоскоростную шину
- •1.11 Система прерываний
- •1.11.1 Назначение системы прерываний
- •1.11.2 Процесс обработки прерываний IRQ
- •1.11.3 Процесс обработки быстрых прерываний FIQ
- •1.11.4 Регистры управления системой прерываний
- •1.11.5 Порядок настройки прерывания IRQ
- •1.11.6 Порядок настройки быстрого прерывания FIQ
- •1.11.7 Процедура обработки прерывания
- •1.11.8 Задержка обработки прерывания
- •1.12 Внешние прерывания
- •1.12.1 Регистры управления блоком внешних прерываний
- •1.12.2 Порядок настройки блока внешних прерываний
- •1.13 Таймеры-счетчики
- •1.13.1 Режим таймера и схема совпадения
- •1.13.2 Режим счетчика
- •1.13.3 Схема захвата
- •1.13.4 Управляющие регистры
- •1.13.5 Формирование интервалов времени через систему прерываний
- •1.13.6 Измерение периода и длительности импульса с помощью устройства захвата
- •1.13.7 Подсчет числа импульсов в единицу времени
- •1.14 Широтно-импульсный модулятор
- •1.14.1 Основы функционирования
- •1.14.2 Дополнительные возможности
- •1.14.3 Регистры управления ШИМ
- •1.14.4 Порядок настройки ШИМ
- •1.15 Аналого-цифровые преобразователи
- •1.15.1 Краткие сведения о встроенных АЦП
- •1.15.2 Общие рекомендации по использованию АЦП
- •1.15.3 Управляющие регистры
- •1.15.4 Порядок настройки АЦП
- •1.15.5 Программный запуск аналого-цифрового преобразователя
- •1.15.6 Запуск аналого-цифрового преобразователя по таймеру
- •1.15.7 Программный опрос готовности АЦП
- •1.15.8 Опрос готовности АЦП по прерыванию
- •1.15.9 Считывание и масштабирование результата АЦП
- •1.16 Цифро-аналоговый преобразователь
- •1.16.1 Регистр управления ЦАП
- •1.16.2 Рекомендации по применению ЦАП
- •1.17 Последовательный синхронный приемо-передатчик SPI
- •1.17.1 Назначение и основы функционирования интерфейса SPI
- •1.17.2 Управляющие регистры
- •1.17.3 Передача и прием данных в режиме ведущего
- •1.17.4 Передача и прием данных в режиме ведомого
- •1.18 Последовательный синхронный приемо-передатчик I2С
- •1.18.1 Назначение и основы функционирования интерфейса I2С
- •1.18.2 Управляющие регистры
- •1.18.3 Настройка модуля I2C
- •1.18.4 Типовые циклы обмена данными по шине I2C
- •1.19 Последовательный асинхронный приемопередатчик UART
- •1.19.1 Назначение и основы функционирования порта UART
- •1.19.2 Управляющие регистры
- •1.19.3 Настройка порта UART
- •1.19.4 Прием байта с опросом флага
- •1.19.5 Передача байта с опросом флага
- •1.19.6 Прием и передача данных с использованием прерываний
- •1.19.7 Прием и передача пакетов данных
- •1.19.8 Диагностика ошибок
- •1.19.9 Автоматическая настройка скорости
- •1.20 Часы реального времени
- •1.20.1 Основные возможности часов реального времени
- •1.20.2 Управляющие регистры
- •1.20.3 Рекомендации по применению
- •1.21 Управление питанием и идентификация источников сброса
- •1.21.1 Краткие сведения о мониторе питания
- •1.21.2 Управляющие регистры
- •Часть 2. Разработка и отладка программ с помощью современных инструментальных средств
- •2.1 Форматы представления чисел
- •2.1.1 Основные коды представления целых чисел
- •2.1.2 Форматы представление целых чисел, приятные в языке Си
- •2.1.3 Форматы чисел c плавающей точкой стандарта IEEE754
- •2.2 Основы программирования на языке Си
- •2.2.1 Структура программы
- •2.2.2 Числовые константы
- •2.2.3 Переменные и именованные константы
- •2.2.4 Оператор присваивания, выражения и операции
- •2.2.5 Условный оператор
- •2.2.6 Приведение и преобразование типов
- •2.2.7 Массивы
- •2.2.8 Строки символов
- •2.2.9 Структуры
- •2.2.10 Объединения
- •2.2.11 Указатели
- •2.2.12 Ветвление
- •2.2.13 Множественное ветвление
- •2.2.14 Цикл со счетчиком
- •2.2.15 Циклы с предусловием и постусловием
- •2.2.16 Функции
- •2.2.17 Некоторые директивы компилятора
- •2.2.18 Библиотека математических функций MATH.h
- •2.2.19 Функция создания форматированных строк SNPRINTF
- •2.2.20 Ассемблер в Си-программах
- •2.3 Интегрированная среда разработки Keil µVision 4
- •2.3.1 Создание проекта
- •2.3.2 Создание файла программы
- •2.3.3 Настройка проекта
- •2.3.4 Набор текста программы
- •2.3.5 Компиляция программы
- •2.3.6 Отладка программы
- •2.3.7 Основные отладочные инструменты среды Keil µVision 4
- •2.3.8 Управление распределением памяти
- •2.4 Методика отладки программ
- •2.4.1 Быстрый поиск ошибок
- •2.4.2 Ввод и вывод дискретных сигналов
- •2.4.3 Таймер-счетчик. Формирование интервалов времени
- •2.4.4 Таймер-счетчик. Формирование внешних сигналов совпадения
- •2.4.5 Таймер-счетчик. Счетчик внешних событий
- •2.4.6 Таймер-счетчик. Устройство захвата
- •2.4.7 Широтно-импульсный модулятор
- •2.4.8 Аналого-цифровой преобразователь
- •2.4.9 Цифро-аналоговый преобразователь
- •2.4.10 Приемопередатчик SPI
- •2.4.11 Приемопередатчик I2C
- •2.4.12 Приемопередатчик UART
- •2.4.13 Часы реального времени
- •2.5 О программировании ARM7 на ассемблере
- •2.5.1 Основные правила записи программ на ассемблере
- •2.5.2 Псевдокоманды
- •2.5.3 Директивы ассемблера
- •2.5.4 Макросы
- •2.5.5 Пример простой программы
- •2.6 Распространенные средства разработки и отладки
- •2.6.1 Демонстрационные платы EA-EDU-001 и EA-EDU-011
- •2.6.2 Внутрисхемный отладчик J-Link
- •2.6.3 Утилиты программирования ПЗУ LPC Flash Utility и FlashMagic
- •2.6.4 Программа-терминал 232Analyzer
- •2.6.5 Низкоуровневый редактор диска DMDE
- •Часть 3. Решение типовых задач локального управления
- •3.1 Формирование временной задержки с помощью цикла
- •3.1.1 Задание
- •3.1.2 Общие рекомендации
- •3.1.3 Алгоритм программы
- •3.1.4 Отладка
- •3.1.5 Дополнительные сведения о формировании временной задержки
- •3.2 Формирование дискретного сигнала с помощью таймера
- •3.2.1 Задание
- •3.2.2 Общие рекомендации
- •3.2.3 Алгоритм программы
- •3.3 Опрос дискретного датчика или кнопки
- •3.3.1 Задание
- •3.3.2 Общие рекомендации
- •3.3.3 Алгоритм программы
- •3.3.4 Отладка
- •3.4 Опрос состояния механических контактов с подавлением дребезга
- •3.4.1 Задание
- •3.4.2 Общие рекомендации
- •3.4.3 Алгоритм программы
- •3.4.4 Отладка
- •3.5 Опрос клавиатуры с автоповтором
- •3.5.1 Задание
- •3.5.2 Общие рекомендации
- •3.5.3 Алгоритм программы
- •3.5.4 Отладка
- •3.6 Формирование импульсного управляющего сигнала с помощью модуля ШИМ
- •3.6.1 Задание
- •3.6.2 Общие сведения
- •3.6.3 Алгоритм программы
- •3.6.4 Отладка
- •3.6.5 Синхронизация внешним сигналом
- •3.7 Формирование сигналов специальной формы с помощью ЦАП
- •3.7.1 Задание
- •3.7.2 Основы
- •3.7.3 Алгоритм программы
- •3.7.4 Повышение точности генерирования частоты
- •3.7.5 Выбор числа дискрет
- •3.8 Управление двухфазным шаговым двигателем
- •3.8.1 Задание
- •3.8.2 Общие сведения
- •3.8.3 Алгоритм программы
- •3.9 Применение ШИМ для формирования низкочастотных аналоговых сигналов
- •3.9.1 Задание
- •3.9.2 Основные сведения
- •3.9.3 Алгоритм основной программы
- •3.9.4 Алгоритм процедуры обработки прерывания
- •3.10 Управление символьным жидкокристаллическим индикатором
- •3.10.1 Задание
- •3.10.2 Управление модулем жидкокристаллической индикации
- •3.10.3 Разработка функции управления ЖКИ с ожиданием готовности
- •3.10.4 Функция вывода строки символов
- •3.10.5 Разработка функции инициализации модуля ЖКИ
- •3.10.6 Разработка тестовой программы
- •3.10.7 Управление ЖКИ с опросом флага готовности
- •3.10.8 Программирование произвольных символов
- •3.11 Управление матричным светодиодным индикатором
- •3.11.1 Задание
- •3.11.2 Основные рекомендации
- •3.11.3 Алгоритм основной программы
- •3.11.4 Алгоритм процедуры обработки прерывания
- •3.11.5 Реализация движения строки
- •3.12 Управление матричным жидкокристаллическим дисплеем
- •3.12.1 Управление дисплеем на основе контроллера PCF8833
- •3.12.2 Построение простейших геометрических фигур
- •3.13 Измерение постоянного напряжения
- •3.13.1 Задание
- •3.13.2 Основные рекомендации
- •3.13.3 Алгоритм основной программы
- •3.13.4 Алгоритм процедуры обработки прерывания от АЦП
- •3.13.5 АЦП с циклическим опросом нескольких каналов
- •3.13.6 Автоматический выбор пределов измерения
- •3.14 Измерение параметров уровня переменного напряжения
- •3.14.1 Задание
- •3.14.2 Основные рекомендации
- •3.14.3 Алгоритм основной программы
- •3.14.4 Алгоритм процедуры обработки прерывания
- •3.15 Измерение ускорения с помощью трехосевого акселерометра
- •3.16 Измерение интервалов времени с помощью таймера
- •3.16.1 Задание
- •3.16.2 Общие рекомендации
- •3.16.3 Алгоритм основной программы
- •3.16.4 Алгоритм процедуры обработки прерывания
- •3.16.5 Повышение разрешающей способности путем усреднения
- •3.16.6 Введение поправок
- •3.17 Измерение частоты с помощью счетчика
- •3.17.1 Задание
- •3.17.2 Основные рекомендации
- •3.17.3 Алгоритм программы
- •3.17.4 Повышение точности измерений
- •3.18 Опрос цифрового датчика температуры. Интерфейс I2C
- •3.18.1 Задание
- •3.18.2 Общие рекомендации
- •3.18.3 Алгоритм программы
- •3.20 Обмен данными с электрически перепрограммируемым ПЗУ
- •3.20.1 Задание
- •3.20.2 Общие сведения о микросхемах EEPROM
- •3.20.3 Адресация в микросхемах EEPROM
- •3.20.4 Порядок чтения EEPROM
- •3.20.5 Порядок записи EEPROM
- •3.20.6 Разработка программы чтения EEPROM
- •3.20.7 Разработка функции записи блока данных в EEPROM
- •3.21 Интерфейс RS-232. Прием и передача простых команд
- •3.21.1 Задание
- •3.21.2 Алгоритм программы
- •3.21.3 Автоматическая настройка скорости
- •3.22.1 Задание
- •3.22.2 Основные рекомендации
- •3.22.3 Алгоритм программы
- •3.23 Интерфейс RS-232. Прием пакета переменной длины
- •3.23.1 Задание
- •3.23.2 Основы реализации
- •3.23.3 Алгоритм программы
- •3.24 Обмен данными с картой памяти Secure Digital
- •3.24.1 Задание
- •3.24.2 Общие сведения о карах FLASH-памяти SD/MMC
- •3.24.3 Команды SD/MMC
- •3.24.4 Процедура инициализации карты
- •3.24.5 Чтение и запись данных
- •3.24.6 Обработка ошибок
- •3.24.7 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
Пример:
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