- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 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 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
2.Настроить скорость обмена данными, задав делитель тактовой частоты через регистр S0SPCCR (1.17.1). Требуется принимать во внимание допустимую частоту для других устройств, подключенных к шине SPI.
3.Настроить модуль SPI через регистр S0SPCR. Обычно требуется лишь включить режим ведущего (бит MSTR) и задать число передаваемых бит (разряды BITEN и BITS).
4.При необходимости включить прерывание от модуля SPI через ре-
гистры VICVectAddr0, VICVectCntl0 и VICIntEnable.
Передача инициируется путем записи в регистр S0SPDR передаваемых данных.
Готовность приемопередатчика может быть проверена путем опроса бита SPIF (бит 7) в регистре S0SPSR. Единица обозначает завершение передачи. Альтернатива — использование системы прерываний.
Передача данных приводит к формированию синхроимпульсов и одновременно сопровождается приемом последовательных битов с входа MISO. Если прием задействован, то после распознавания готовности передатчика принятый пакет может быть считан из того же регистра S0SPDR. В режиме ведущего осуществить прием без передачи невозможно, поскольку только передача сопровождается формированием синхроимпульсов.
1.17.4 Передача и прием данных в режиме ведомого
1.Настроить портовые линии на режим SPI через регистры PINSEL0, PINSEL1. В простейшем случае потребуются лишь одна линия: MOSI (для приема) или MISO (для передачи).
2.Настроить модуль SPI через регистр S0SPCR. Обычно требуется лишь включить режим ведомого (бит MSTR) и задать число передаваемых бит (биты BITEN и BITS).
3.При необходимости включить прерывание от модуля SPI через ре-
гистры VICVectAddr0, VICVectCntl0 и VICIntEnable.
Как и в режиме ведущего передача инициируется путем записи передаваемых данных в регистр S0SPDR. Передача не является обязательной. Если требуется только прием данных, то достаточно только контроля готовности приемопередатчика.
Готовность приемопередатчика может быть проверена путем опроса бита SPIF (бит 7) в регистре S0SPSR (единица — обмен завершен) или через прерывания.
После обнаружения готовности можно считать принятый пакет из регистра S0SPDR. В режиме ведущего может осуществляться только передача, только прием или и то и другое.
1.18 Последовательный синхронный приемо-передатчик I2С
1.18.1 Назначение и основы функционирования интерфейса I2С
I2C — последовательный синхронный интерфейс, предназначенный для передачи небольших объемов информации между микросхемами. Микросхемы, поддерживающие I2C — АЦП, ЦАП, ПЗУ, датчики температуры,
75
драйверы дисплеев, порты ввода-вывода и др. Используется всего два проводника SCL — тактирование и SDA данные. Одновременно возможна передача только в одном направлении. Скорость передачи данных не велика — до 400 кбит/с или (реже) до 1 Мбит/с. В LPC2148 скорость не превышает 400 кбит/с.
Одно из устройств на шине I2C является ведущим, остальные — ведомыми. Допускается подключение до 128 устройств. I2С предоставляет аппаратную поддержку адресации.
Любая передача независимо от направления инициируется ведущим. Интерфейсные выходы I2C любой микросхемы имеют открытые стоки, на обеих линиях I2C устанавливаются подтягивающие резисторы. Таким образом реализуется операция монтажного логического «И», позволяющая любому ведомому устройству захватить линию и заставить ведущего ждать.
Сопротивления подтягивающих резисторов рекомендовано [2] приближенно рассчитывать по формуле
(кОм),
где — число устройств на шине I2C.
Начало и конец пакета I2C обозначаются состояниями START и STOP, которые формируются ведущим устройством. Состояние START представляет собой спадающий фронт сигнала SDA при высоком уровне на SCL. Состояние STOP генерируется нарастающим фронтом SDA также при высоком SCL. Временные диаграммы сигналов на лини данных SDA показаны на ри-
сунке 1.18.1.
START |
|
|
|
|
STOP |
Адрес A6-A0 |
R/W |
A |
Данные D7-D0 |
A |
A/A |
START |
|
|
|
|
STOP |
Адрес A6-A0 |
R/W |
A |
Данные D7-D0 |
A |
A |
|
|
|
― Генерируется ведущим |
|
― Генерируется ведомым |
Рисунок 1.18.1 – Временные диаграммы сигнала SDA при передаче от ведущего к ведомому (вверху) и ведомого к ведущему (внизу)
Первым байтом передается 7 бит адреса ведомого и бит направления передачи (передача от ведущего ведомому) или (передача от ведомого ведущему). После адресного байта передается один или несколько байт данных. Прием каждого байта, включая адресный, подтверждается нулевым битом, то есть замыканием на ноль линии SDA через выходной транзистор. Если ведомый не подтвердит прием байта, ведущий должен сгенерировать состояние STOP и прекратить передачу. Принимая данные, ведущий подтверждает все байты кроме последнего. Отсутствие подтверждения заставляет ведомый освободить линию, после чего ведущий сможет сгенерировать состояние STOP.
76
Микроконтроллер LPC2148 оснащен двумя идентичными модулями I2C (I2C0 и I2C1). Здесь будем рассматривать только работу в режиме ведущего. Режим ведомого может потребоваться только для организации передачи данных между двумя или несколькими микроконтроллерами. Полное описание можно найти в литературе [1] или в документации к LPC214x.
1.18.2 Управляющие регистры
Схема регистров управления модулями I2C показана на рисунке 1.18.2.
Регистры I2CxCONSET и I2CxCONCLR — управляют состоянием модулей I2C. Запись единицы в один из разрядов регистра xSET переводит модуль в соответствующие состояние. Запись единица в xCLR снимает соответствующие состояние. Запись нулей в эти регистры не имеет значения.
●Бит 2 (AA) разрешает или запрещает генерирование подтверждения
врежиме приема данных. Во время передачи байтов пакета обычно требуется устанавливать в единицу, при передаче последнего байта сбросить в ноль.
I2CxCONSET – установка состояния I2C
15 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
|
|
|
EN STA STO |
SI |
AA |
|
|
||||
|
|
ВКЛ |
|
|
|
Старт/Стоп |
|
Подтвержд. |
|
||
I2CxCONCLR – сброс состояния I2C |
|
|
|
|
Флаг прерывания |
|
|
||||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
||
15 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
|
|
|
EN STA |
|
SI |
AA |
|
|
|||
|
|
ВКЛ |
|
|
|
Старт |
|
|
Подтвержд. |
|
|
|
|
|
|
|
|
Флаг прерывания |
|
|
|||
|
|
|
|
|
|
|
|
|
|||
I2CxSTAT – Состояние I2C |
|
|
|
|
|
|
|
|
|
|
|
15 |
8 |
7 |
|
|
|
|
|
3 |
2 |
|
0 |
STATUS
Состояние I2C
Рисунок 1.18.2 – Схема регистров управления приемопередатчиками I2С
●Бит 3 (SI) — флаг запроса прерывания при завершении операции приемопередатчиком I2C. Аппаратная установка единицы свидетельствует о готовности модуля I2C. Сброс в ноль инициирует генерирование очередного состояния или передачу данных.
●Бит 4 (STO). Запись единицы генерирует состояние STOP, прекращая обмен по I2C. Отменить STOP нельзя, поэтому бит STO в регистре I2CxCONCLR отсутствует.
●Бит 5 (STA). Устанавливает или сбрасывает состояние START, начиная передачу пакета. После установи через I2CxCONSET бит должен сбрасываться через I2CxCONCLR программным путем.
●Бит 6 (EN) включает или отключает приемопередатчик I2C. Прежде чем использовать модуль необходимо установить этот бит в регистре
I2CxCONSET.
В таблице 1.18.1 приведены наиболее часто используемые кодовые комбинации, записываемые в регистры I2CxCONSET/CLR.
77
Таблица 1.18.1 – Коды управления состоянием через I2CxCONSET/CLR
Код |
Описание |
|
0x40 |
Включить/выключить приемопередатчик I2C |
|
0x20 |
Сгенерировать состояние START |
|
0x04 |
Разрешить/запретить подтверждение приема байта |
|
0x10 |
Сгенерировать состояние STOP |
|
0x08 |
Сбросить запрос прерывания (для I2CxCONCLR) прочитать |
|
флаг запроса готовности (для I2CxCONSET) |
||
|
Регистр I2CxSTAT необходим для чтения текущего стояния модуля I2C и принятия решения о следующем действии.
Биты 3–7 (STATUS) содержат код текущего состояния. Коды для режима ведущего приведены в таблице 1.18.2.
Таблица 1.18.2 – Коды состояния приемопередатчика I2C в режиме ведущего
Код |
Описание |
Направление |
0x00 |
Ошибка |
передача/прием |
0x08 |
Передано состояние START |
передача/прием |
0x10 |
Передано повторное состояние START |
передача/прием |
0x18 |
Передан адрес ведомого (SLA) и признак режима |
передача |
записи (W), подтверждение (ACK) получено |
||
0x20 |
Адрес ведомого (SLA) и признак режима записи (W) |
передача |
НЕ переданы, подтверждение (ACK) НЕ получено |
||
0x28 |
Данные переданы, подтверждение (ACK) получено |
передача |
0x30 |
Данные НЕ переданы, подтверждение (ACK) |
передача |
НЕ получено |
||
0x38 |
Арбитраж потерян |
передача/прием |
0x40 |
Адрес ведомого (SLA) и признак режима чтения (R) |
прием |
переданы, подтверждение (ACK) получено |
||
0x48 |
Адрес ведомого (SLA) и признак режима чтения (R) |
прием |
НЕ переданы, подтверждение (ACK) НЕ получено |
||
0x50 |
Данные получены, подтверждение (ACK) отправлено |
прием |
0x58 |
Данные получены, подтверждение (ACK) |
прием |
НЕ отправлено |
||
0xF8 |
Простой |
передача/прием |
Регистр состояния I2CxDAT предназначен для записи байта данных, который предстоит передать. Передача будет сбросов запроса прерывания SI в регистре I2CxCONCLR. При чтении регистр содержит принятый байт.
Регистры частоты I2CxSCLH, I2CxSCLL представляют собой делители частоты, определяющие длительности высокого (I2CxSCLH) и низкого (I2CxSCLL) состояний на линии тактирования SCL. Учитываются 16 младших разрядов этих регистров. Частота определяется их суммой:
. (1.18.1)
78