- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 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 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
5.Инициализация системы прерываний состоит в записи единицы в бит CR2I регистра T1IR.
Схема основной программы приведена на том же рисунке 3.17.3
1.С помощью регистра PINSEL1 перевести портовые линии P0.16– P0.18 в режимы MAT0.2, CAP1.2 и CAP1.3 соответственно.
2.Выполнить инициализацию ЖКИ, вызвав функцию LCDInit().
3.Настроить таймер 0. Для этого:
а) разрешить сброс таймера по совпадению MAT2 (регистр T0MCR); б) разрешить формирование внешнего электрического сигнала CAP2
при совпадении (регистр T0EMR); выбрать инверсию сигнала;
в) установить порог устройства совпадения равным , что при
тактовой частоте МГц даст совпадение через 1 с; г) включить таймер 0 (регистр T0TCR).
4.Настроить таймер 1. Для этого:
а) выбрать режим счетчика с инкрементом по обоим фронтам импульсов на счетном входе CAP1.3 (регистр T1CTCR);
б) включить захват по обоим фронтам сигнала CAP1.2, разрешить прерывание по захвату (регистр T1CCR);
в) включить таймер (регистр T1TCR).
5.Включить прерывание от таймера 1 через регистры VICVectAddr0,
VICVectCntl0, VICIntEnable (раздел 1.11.5).
6.С помощью конструкций цикла while и ветвления if организовать циклическое ожидание появления единицы в флаге готовности результата
Refresh.
7.Сбросить флаг готовности в ноль.
8.Создать строку символов для индикации S командой
snprintf(S,17,"f=%10.4f kHz",f);
Получим формат
f=xxxxx.xxxx kHz
9. Вывести строку функцией PrintSymbol.
3.17.4 Повышение точности измерений
При измерении высоких частот основным источником погрешности является погрешность образцовой меры (кварцевого резонатора). Об уменьшении этой составляющей погрешности путем введения поправочного коэффициента сказано в разделе 3.16.6. Случайная составляющая, связанная с неизбежной дискретизацией времени уменьшается выбором большего интервала счета, например 10 с. Для этого потребуется задать пороговое значение в регистре T0MR2 (при 60 МГц), и разделить результат на 10.
3.18 Опрос цифрового датчика температуры. Интерфейс I2C
3.18.1 Задание
Разработать программу, считывающую результат измерения температуры с цифрового датчика LM75 через интерфейс I2C, и отображающую его на жидкокристаллическом индикаторе.
220
3.18.2 Общие рекомендации
Учебная плата EA-EDU-001 оснащена цифровым измерителем температуры LM75 фирмы National Semiconductor. Микросхема содержит датчик температуры, действующий по принципу изменения ширины запрещенной зоны; сигма-дельта АЦП; блок поддержки интерфейса I2C; дискретный выход двухпозиционного регулятора температуры с программируемой шириной петли гистерезиса (не используется). Разрешающая способность датчика 0,5º, абсолютная погрешность ±2º.
LM75 подключена к модулю I2C0. Адрес микросхемы складывается из фиксированных двоичных разрядов 1001 (старшая часть) и адресных входов A2–A0, которые на плате соединены с общей точкой. Таким образом, адрес микросхемы 0x28.
Рассмотрим основные приемы работы с микросхемой LM75. Обмен данными с микросхемой осуществляется с помощью нескольких управляющих регистров. Каждый их них характеризуется номером, который передается по шине I2C, как указатель регистра, к какому регистру производится обращение. Перечень регистров с кратким описанием их назначения приведен в таблице 3.18.1.
В нашем случае нужен только регистр температуры. На рисунке 3.18.1 показаны схемы основных регистров, временные диаграммы сигналов I2C и соответствующие осциллограммы при чтении температуры. Порядок действия при этом такой:
а) сформировать на шине I2C состояние START;
б) передать адрес устройства 0x28 и флаг записи (); в) передать указатель регистра 0x00;
г) повторно сформировать состояние START;
д) передать адрес устройства 0x28 и флаг чтения ();
е) принять два байта температуры, причем второй не подтверждать; ж) сформировать состояние STOP.
Таблица 3.18.1 – Перечень управляющих регистров датчика температуры
Регистр |
Номер |
Разряд- |
Назначение |
|
ность |
||||
|
|
|
||
|
|
|
9 старших разрядов содержат двоич- |
|
Температуры |
0x00 |
16 |
ный код измеренной температуры. Из |
|
них 8 старших обозначают старшую |
||||
|
|
|
||
|
|
|
часть, а младший дробную 0,0 или 0,5 |
|
|
|
|
Содержит биты для отключения пи- |
|
Конфигурации |
0x01 |
8 |
тания, управления активным уровнем |
|
|
|
|
транзисторного выхода и другие |
|
Порогов |
|
|
Задают пороги температуры для от- |
|
включения/ |
0x02/0x03 |
16 |
пирания и запирания выходного |
|
отключения |
|
|
транзистора |
|
Идентификации |
0x07 |
8 |
Содержат идентификатор типа мик- |
|
росхемы, равный 0xA1 |
||||
|
|
|
221
Адресный байт |
|
|
|||
7 |
|
|
4 |
3 |
1 |
1 |
0 |
0 |
1 |
|
A2:A0 |
|
|
|
|
|
Адрес |
0
/W R
Указатель регистра |
|
|||||
7 |
|
|
|
3 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
|
REG |
|
|
|
|
|
Указатель регистра |
Направление передачи
Регистр температуры (REG = 0) |
|
|
|
|
15 |
8 |
7 |
6 |
0 |
|
TEMP |
|
|
|
|
Целая часть |
|
|
Неопределенное значение |
|
|
Дробная часть |
|
Рисунок 3.18.1 – Схема основных регистров управления цифрового датчика температуры LM75
S |
|
|
|
S |
|
|
|
|
|
|
P |
Адрес |
R/W |
A |
Указатель |
A |
Адрес |
R/W |
A |
Целая часть |
A |
Дробная часть |
A |
Рисунок 3.18.2 – Временные диаграммы сигналов на лини SDA (вверху) SCL (внизу) при считывании результат измерения
Рисунок 3.18.3 – Осциллограммы сигналов интерфейса I2C при считывании результата измерения температуры
с цифрового датчика LM75. Скорость передачи данных 50 кбит/с. Осциллограммы приведены для температуры T = 31,5º.
222
3.18.3 Алгоритм программы
Как правило, температура меняется медленно и строгая периодичность в ее измерении не требуется. Поэтому предлагается команды опроса датчика и индикации результата поместить в основную программу, не прибегая к механизму прерываний. Блок схема алгоритма программы показана на рисунке 3.18.4.
К программе потребуется подключить файлы STDIO.h и LCD.c дирек-
тивой #include.
Программа использует следующие данные:
Начало
1
Инициализация
ЖКИ
2Настройка режима линий P0.2 и P0.3
3
Настройка I2C
Нет 4 Готовность I2C
Да
5
Состояние I2C
Нет |
14 |
|
BusyFlag=0? |
|
Да |
15 Формирование строки символов на
основе байтов TH и TL
16
Обновление ЖКИ
17
Установка START
18
BusyFlag=1
0x08
6 Сброс START,
передача адреса и W
0x18
7Передача указателя регистра t˚ (0x00)
0x28
8 Повторный Start
0x10
9 Сброс START,
передача адреса и R, разр. подтверждение
0x50
10
Сохранить байт в TH, запрет подтверждения
0x58
11
Сохранить байт в TL, установить STOP
12 BusyFlag=0
Иначе
13Сбросить флаг готовности I2C
Рисунок 3.18.4 – Схема алгоритма программы измерения температуры
223
а) целочисленные переменные TH и TL для хранения старшего и младшего байтов температуры;
б) строка S (ее длина будет определена ниже);
в) целочисленный флаг занятости BusyFlag (0 — выполняется обмен по I2C, 1 — результат получен и готов к индикации).
1.Инициализация ЖКИ производится вызовом функции LCDInit().
2.Перевести портовые линии P0.2, P0.3 в режимы SCL0 и SDA0 (ре-
гистр PINSEL0).
3.Настроить модуль I2C:
а) выбрать скорость передачи данных в соответствии с выражениями
(1.18.1, 1.18.2) (регистры I2C0SCLH, I2C0SCLL);
б) включить приемопередатчик установкой бита EN в регистре
I2C0CONSET.
4.Записать конструкцию проверки готовности приемопередатчика (разряд SI регистра I2C0CONSET). Далее блоки 5–13 выполняются, если
.
5.Записать конструкцию множественного ветвления по значению состояния I2C (регистр I2C0STAT). Рекомендуется использовать следующий шаблон
switch (I2C0STAT)
{
case Состояние 1 : Команды 1 ; break;
case Состояние 2 : Команды 2 ; break;
...
case Состояние N : Команды N;
}
Взаимодействие с микросхемой подробно рассмотрено в предыдущем разделе. Состояния, которые необходимо проверять указаны на блок-схеме алгоритма (см. также таблицу 1.18.2). Команды, отдаваемые приемопередатчику I2C также ясны из алгоритма. Здесь приведем выборочно описания блока 6
I2C0CONCLR=0x20; // Сбросить состояние START (бит STA) I2C0DAT=0x90; // Передать адрес 1001000R (R/W = 0) break;
блока 9
I2C0CONCLR=0x20; // Сбросить состояние START (бит STA) I2C0CONSET=0x04; // Разрешить подтверждение (Бит AA) I2C0DAT=0x91; // Передать адрес 1001000R (R/W = 1) break;
224