- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 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 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
6.Если обнаружено совпадение таймера с пороговым регистром, присвоить переменной NewPort содержимое порта 0. При этом необходимо с помощью операции логического умножения наложить маску, обеспечив копирование единственного бита P0.14 (подробнее см. раздел 1.10.1).
7.Проверить неравенство переменных OldPort и NewPort. Команды, соответствующие блокам (9–11) должны выполняться при неравенстве этих переменных.
8.Сбросить флаг запроса прерывания через регистр T0IR. Напомним, что сброс флага выполняется записью единицы, а не нуля.
9.Запустить таймер через регистр T0TCR.
10.Поместить блок реакции на нажатие кнопок, в данном случае состоящий одного условия, проверяющего бит 14 регистра NewPort. Если бит равен нулю дать команду инверсии линии P0.7. Для этого использовать сложение по модулю два регистра IO0PIN с константой.
11.Обновить переменную OldPort.
3.4.4 Отладка
Ниже названы некоторые причина возможных ошибок.
1. Не работает таймер, флаг T0IR не устанавливается. Установить точку останова на команде, соответствующей блоку (5). Запустив программу, проверить, достигается ли периодически эта команда. Если нет, то проследить за состоянием таймера в окне Peripherals Timer Timer 0. Убедиться, что таймер инкрементируется, все три события по совпадению (остановка, сброс, запрос прерывания) разрешены, что модуль счета достаточно мал для быстрого совпадения.
2.Порт не считывается или неверно маскирование. Установить точку останова на команду блока 8; запустить программу; нажать кнопку на плате. Ошибка диагностируется, если останова при этом не происходит. Проверить маскирование (блок 6), условие (блок 7). Рекомендуется использовать просмотр переменной NewPort через окно Watch.
3.Неверно условие проверки битов переменной NewPort (блок 10). Установить точку останова на команду инверсии линии P0.8. Если при нажатии кнопки (притом что отладка по пунктам 1–3 ошибок не выявила) состояние портовой линии не меняется, искать ошибку в командах блока 10.
4.Дребезг сохраняется из-за неверной инициализации схемы совпадения. Проверить команды блоков 8 и 9.
5.Состояние портовой линии меняется и при нажатии, и при отпускании кнопки. Проверить команду блока 11.
3.5 Опрос клавиатуры с автоповтором
3.5.1 Задание
Задание. Разработать программу, инвертирующую логические уровни на линиях P0.8, P0.9 при нажатии кнопок, подключенных к линиям P0.18 и P0.19. Необходимо обеспечить защиту от дребезга контактов; инверсия должна повторяться периодически при удерживании кнопки.
170
3.5.2 Общие рекомендации
Здесь предлагается воспроизвести реакцию на нажатие кнопок, знакомое пользователям персонального компьютера. Некое действие выполняется однократно при нажатии кнопки, а затем повторяется периодически, если кнопка удерживается в нажатом положении. Причем, задержка перед началом повтора должна быть больше, чем период автоповтора. Разрабатываемый в данном практическом занятии алгоритм применяется при создании интерфейса встраиваемой системы с пользователем. Например, при использовании экранного меню для настройки прибора.
Может быть предложено несколько вариантов решения данной задачи. Алгоритм, описанный ниже, представляется авторами наиболее рациональным.
Рисунок 3.5.1 – Временные диаграммы, показывающие изменение таймера
Начальное значение таймера задано таким, что потребуется секунд для его совпадения с пороговым регистром (см. рисунок 3.5.1). Это время задержки перед повтором. Рекомендуется выбирать с.
После совпадения таймер автоматически сброшен в ноль и для следующего совпадения потребуется время , определяемое порогом T0MR1.
Как и в предыдущем случае, для подавления дребезга чтение порта (блок 6) будет производиться только после завершения интервала с после изменения порта. Блокировка клавиатуры осуществлена блоком 5. Значение порогового регистра T0MR0 определяется относительно начального значения T0TC.
3.5.3 Алгоритм программы
1.Настроить портовые линии P0.8, P0.9 на вывод, записав единицы в соответствующие разряды регистра IO0DIR.
2.В предлагаемом решении используется две схемы совпадения. По-
ровый регистр T0MR0 определяет задержку для защиты от дребезга , пороговый регистр T0MR1 — задержки и для автоповтора.
171
Начало |
|
|
|
|
5 |
Да |
|
1 |
Совпадение 0 |
|
|
Настройка портовых |
|
6 |
|
|
|
||
линий на вывод |
Нет |
Скопировать порт |
|
|
в NewPort |
||
2 |
|
||
|
с наложением маски |
||
Настройка схем |
|
||
|
|
||
совпадения |
|
|
|
3 |
7 |
Да |
|
Загрузка таймера и |
Совпадение 1 или |
|
|
пороговых регистров |
OldPort≠NewPort |
|
|
|
8 |
||
|
|
||
4 |
Нет |
Сброс запроса |
|
прерывания 1 |
|||
|
|||
Запуск таймера |
|
||
|
|
||
|
|
9 |
|
|
|
Обработка реакций |
|
|
10 |
Да |
|
|
OldPort≠NewPort |
|
|
|
|
11 |
|
|
Нет |
Загрузка таймера |
|
|
|
||
|
|
12 |
|
|
|
Сброс запроса |
|
|
|
прерывания 0 |
|
|
|
13 |
|
|
|
OldPort = NewPort |
Рисунок 3.5.2 – Алгоритм программы опроса клавиатуры с автоповтором
Необходимо включить запрос прерывания для совпадения MR0; для совпадения MR1 включить запрос прерывания и сброс таймера-счетчика (ре-
гистр T0MCR).
3. Рассчитать значения пороговых регистров T0MR0, T0MR1 и таймера T0TC, которое в данном случае не будет нулевым.
Пороговое значение T0MR1, отвечающее за автоповтор, рассчитывается по формуле (1.13.3) для интервала . Повторим эту формулу упрощенно, опустив операцию округления:
.
Начальное значение таймера вычисляется по аналогичной формуле таким образом, чтобы разность между ним и T0MR1 соответствовала задержке перед автоповтором . Отметим, что величина T0TC окажется отрицательной. Чтобы избежать предупреждений компилятора о возможной потере знака при приведении типов, рекомендуется представить результат в дополнительном коде. Тогда
, |
(3.5.1) |
или, что то же самое
,
172
Пороговое значение T0MR0 больше на величину, соответствующую интервалу с. Вопрос выбора этого интервала обсуждался в разделе 3.5.3.
. (3.5.2)
Рассчитав T0MR0, T0MR1, T0TC, включить в программу команды присваивания значений этим регистрам.
4.Запустить таймер через регистр T0TCR.
5.Блоки 5–13 помещены в «вечный цикл». Проверить совпадение MR0 путем сравнения с единицей флага MR0I в регистре T0IR. Для проверки единственного бита необходимо выделить его наложением маски операцией логического умножения.
6.Если совпадение произошло (флаг равен единице), обновить переменную NewPort, скопировав в нее содержимое порта с наложением маски.
7.Последующие блоки выполняются при выполнении одного из условий: совпадение MR1 или неравенство переменных NewPort и OldPort.
8.В случае выполнения условия блока 7 необходимо сбросить запрос прерывания и обеспечить обработку реакции на кнопку. В соответствии с заданием реакция состоит в инверсии линии порта P0.8 или P0.9 в зависимости от нажатой кнопки P0.18 или P0.19.
9.При обнаружении изменения порта (блок 10) потребуется снова загрузить в таймер начальное значение, рассчитанное по формуле 3.5.1 (блок 11). Сбросить флаг совпадения 0 (блок 12), что обеспечит блокировку опроса порта ложным условием 5. И обновить прежнее значение порта (блок 13), что позволит обнаружить очередное изменение при следующем выполнении блоков 7 и 10.
3.5.4 Отладка
1.Из-за неверной настройки таймера и схемы совпадения 0 нет обновления переменной NewPort (блок 6). Установить точку останова на команду блока 6 и, запустив программу, проверить достигается ли эта точка. Если останова не происходит, проверить настройки таймера.
2.Из-за неверной настройки схемы совпадения 1 нет анализа изменений порта. Установить точку останова на команду блока 8. Проверить достигается ли она, запустив программу и нажав на кнопку учебной платы. Если останова не происходит, проверить настройку схемы совпадения 1. Рекомендуется также сопоставить содержимое порта и переменной NewPort.
3.После обработки реакции на изменение уровня таймеру не присевается требуемого начального значения, в результате чего до порогового значения T0MR0 (см. рисунок) таймер доходит несколько минут. Проверить содержимое таймера, установив точку останова на команду блока 12.
4.Проверить команды, отвечающие непосредственно за реакцию на изменения уровней (блок 9).
5.Состояние светодиода меняется и при нажатии и при отпускании кнопки либо при удерживании кнопки они мигают с очень высокой частотой. Проверить команды, отвечающие за реализацию блоков 10–13.
173