- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 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 |
|
|
|||
|
|
|
|
|
|
|
|
|
Скопировать порт |
||
|
|
|
|
|
|
|
|
|
|
||
|
1 |
|
|
|
|
|
|
|
в NewPort |
||
|
|
|
|
|
|
|
|
||||
|
|
Настройка портовой |
|
|
|
|
|||||
|
|
|
|
|
с наложением маски |
||||||
|
|
|
линии на вывод |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Да |
3 |
OldPort>0 и |
|
|
NewPort=0 |
4 |
|
Нет |
Инверсия P0.7 |
|
|
|
|
|
|
5 |
|
|
OldPort=NewPort |
Рисунок 3.3.1 – Алгоритм программы опроса дискретного датчика
3. Проверить одновременное выполнение условий и (раздел 2.2.12 и пример 1). Выполнение условий говорит о том,
что кнопка сейчас нажата, а во время предыдущей проверки была отпущена.
4.Если условие выполнено, инвертировать логический уровень на портовой линии P0.7.
5.После проверки требуется сохранить переменную NewPort в OldPort, чтобы на следующей итерации с ней сравнивать состояние порта.
3.3.4 Отладка
Дадим некоторые рекомендации по поиску ошибок.
1.Установить точку останова непосредственно после команды чтения порта, убедиться, что 14-ый бит NewPort равен единице, когда кнопка отпущена, а когда нажата — NewPort равен нулю.
2.Установить точку останова на команде инверсии портовой линии. Запустить программу и убедиться, что остановка происходит при нажатии на кнопку P0.14. Если остановка происходит, ошибку снова следует искать в команде настройки портовой линии на вывод, либо в самой команде инверсии. Если точка останова не достигается, значит, ошибка в проверке условия. Рекомендуется воспользоваться окном Watch для просмотра содержимого переменных и прибегнуть к пошаговой трассировке программы.
3.Если состояние портовой линии меняется и при нажатии, и при отпускании кнопки. Проверить команду блока (5).
3.4 Опрос состояния механических контактов с подавлением дребезга
3.4.1 Задание
Разработать программу, выполняющую инверсию логического сигнала на линии P0.7 при нажатии кнопки, подключенной к линии P0.14. Схемы подключения кнопки и светодиода показаны на рисунках 3.4.1, 3.4.2 Дополнительно требуется обеспечить программное подавление дребезга контактов кнопки.
166
Рисунок 3.4.1 – Схема |
Рисунок 3.4.2 – Схема подключения |
подключения кнопки |
трехцветного светодиода |
3.4.2 Общие рекомендации
Внашем случае замкнутые контакты кнопки дают уровень логического нуля. На рисунке 3.4.3 показаны осциллограммы напряжения на портовой линии при размыкании кнопки.
Вмомент времени мс отчетливо виден всплеск, пересекающий уровень логического нуля, за которым следует провал напряжения. Такие колебания происходят до того, как контакт надежно разомкнется и напряжение установится на уровне примерно 3,3 В. Из приведенной осциллограммы следует, что надежное размыкание контактов занимает более миллисекунды. Причем, для кнопок и переключателей других конструкций это время может быть больше.
Простейший способ опроса дискретных датчиков, рассмотренный в предыдущей работе, не применяется для механических контактов из-за его чувствительности к дребезгу. Программа выполняет опрос порта достаточно часто, чтобы распознать колебания напряжения как повторное замыкание.
Рисунок 3.4.3 – Осциллограмма напряжения на контактах кнопки при размыкании
167
Броски напряжения, вызванные дребезгом, устраняются включением конденсатора небольшой емкости параллельно контактам. Существует также надежное программное решение, которое будет рассмотрено далее.
Идея состоит в том, чтобы, распознав однажды нажатие кнопки прекратить опрос на 10–50 мс. Этого времени вполне достаточно, чтобы контакты надежно замкнулись или разомкнулись, но слишком мало, чтобы пропустить действительное нажатие кнопки.
Предлагается сформировать интервал времени для блокировки клавиатуры с помощью таймера. Использование механизма прерываний здесь излишне; проще организовать периодический опрос флага совпадения таймера с пороговым значением.
Алгоритм решения поставленной задачи показан на рисунке 3.5.4.
|
Начало |
|
|
|
|
|
||
|
|
|
|
5 |
|
Да |
||
|
|
|
|
|||||
1 |
|
|
|
Совпадение |
|
|
||
|
|
|
||||||
|
Настройка портовых |
|
|
|
6 |
|
||
|
|
|
|
|
|
|
|
|
|
линий на вывод |
|
|
Нет |
Скопировать порт |
|||
|
|
|
|
|
|
в NewPort |
||
2 |
|
|
|
|
|
|||
|
|
|
|
|
с наложением маски |
|||
|
Настройка таймера: |
|
|
|
||||
|
|
|
|
|
|
|||
вкл. сброс, остановку, |
|
|
|
|
|
|||
|
запрос прерывания |
|
|
|
|
|
||
|
|
|
|
7 |
|
Да |
||
3 |
|
|
|
OldPort≠NewPort |
|
|
||
|
|
|
||||||
|
Задание порогового |
|
|
|
8 |
|
||
|
|
|
|
|
|
|
|
|
значения для таймера |
|
|
Нет |
Сброс запроса |
||||
|
|
|
|
|
|
прерывания |
||
4 |
|
|
|
|
|
|||
|
|
|
|
|
||||
|
|
|
|
|
|
|
||
|
Запуск таймера |
|
|
|
9 |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Запуск таймера |
|
|
|
|
|
|
|
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Обработка реакций |
|
|
|
|
|
|
|
|
11 |
|
|
|
|
|
|
|
|
OldPort = NewPort |
Рисунок 3.4.4 – Алгоритм опроса кнопки или датчика с механическими контактами с подавлением дребезга
Блоки 1–4 относятся к настройке и будут рассмотрены в инструкции к составлению программы.
1. Интервал времени для блокировки клавиатуры формируется с помощью таймера. Об окончание интервала времени сигнализирует флаг запроса прерывания, устанавливаемый автоматически аппаратурой МК при совпадении таймера TCx с пороговым значением TxMRx. Блокировка опроса кнопок обеспечивается условием 5. Через несколько миллисекунд после запуска таймера блоком 4 флаг будет установлен и условие 5 станет истинно. Выполнится ветка «Да», что приведет к чтению порта и копированию его содержимого в переменную NewPort (блок 6). Здесь с помощью маскирования считываются только те биты, к которым подключены кнопки. В данном случае требуется чтение только одного бита. Остальные биты остаются нулевы-
168
ми. Заметим, что после установки флага обновление содержимого порта в NewPort осуществляется периодически в каждой итерации главного цикла.
2.Условие 7 предназначено для распознавания изменения в состоянии кнопок. Заметим, что это условие проверяется независимо от флага совпадения таймера, но пока NewPort не обновляется (блок 6), условие 7 всегда ложно.
3.Если состояние порта изменилось (контакты кнопок замкнулись или разомкнулись), выполняются блоки 8–11. Сброс флага совпадения приведет к тому, что при следующей проверке условие 5 будет ложно. Таким образом, при любом изменении клавиатура окажется заблокирована снова. Запуск таймера гарантирует автоматическую установку флага совпадения через несколько миллисекунд и разблокирование клавиатуры. Блок 10 содержит ряд следующих одно за другим условий проверки каждого бита переменной NewPort и выполнения требуемых действий.
4.Обновление переменной OldPort (блок 11) приведет к тому, что при следующей проверке условие 7 окажется ложным. Повторной реакции на нажатие кнопки не произойдет. Прежде чем блоки 8–11 будут выполняться снова состояние кнопок должно измениться, причем не ранее чем через несколько миллисекунд.
3.4.3 Алгоритм программы
Потребуется объявить переменные NewPort и OldPort типа int.
1.Настроить поровую линию P0.7 на вывод путем записи управляющего кода в регистр IO0DIR0 (см. раздел 1.10.1).
2.Настроить схему совпадения одного из таймеров МК через регистр TxMCR (раздел 1.13.4). Включить остановку таймера, сброс в ноль, формирование запроса прерывания. Может быть выбран любой из двух таймеров произвольно. Также произвольно выбирается номер устройства совпадения (0–3). Однако для определенности далее будем считать, что используется таймер 0 и устройство совпадения 0.
3.Рассчитать пороговое значение для таймера по формуле (1.13.3) так, чтобы интервал времени, отводимый для прекращения дребезга контактов, был от 10 до 50 мс. Напомним, чему равны тактовые частоты, необходимые для расчета.
МГц.
4. Дать команду запуска таймера путем записи в регистр T0TCR. Блоки 1–4 относятся к настройке узлов микроконтроллера и должны
выполняться лишь однажды при сбросе. Блоки ниже помещаются в тело «вечного» цикла.
while (1)
{
...
}
5. Записать команду проверки флага совпадения таймера. Анализировать содержимое регистра с наложением маски.
169