- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 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 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
Преиндексная адресация с непосредственным смещением. Испол-
нительный адрес — сумма или разность содержимого регистра
и константы ( или ). В случае использовании модификатора {!} вычисленный исполнительный адрес сохраняется в регистре до обращения к памяти.
Примеры:
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 |
|
DAbort |
2 |
0x00000010 |
–/– |
Abort |
SUBS PC, R14, #4 |
|
SUBS PC, R14, #8 |
||||||
|
|
|
|
|
||
IRQ |
4 |
0x00000018 |
1/– |
IRQ |
SUBS PC, R14, #4 |
|
FIQ |
3 |
0x0000001C |
1/1 |
FIQ |
SUBS PC, R14, #4 |
26