- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 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 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
Настроить тактовую частоту на линии SCK через регистр S0SPCCR (выражение 1.17.1). В соответствии с техническом описанием для регистра 74HC595 фирмы NXP допустимая частота составляет 20 МГц.
4.Выполнить настройку таймера. Значение порогового регистра T0MR0 рассчитать по формуле (1.13.3) для времени не более
мс. Разрешить сброс таймера и запрос прерывания при совпадении (регистр T0MCR). Включить таймер (регистрT0TCR).
5.Включить прерывание от таймера.
6.Формирование карты светодиодной матрицы может выполняться следующим кодом (для изображения цифры «7»)
for (k=0;k<6;k++) Map[k+1]=Font_6x8_Data[6*'7'+k];
Массив столбцов светодиодной матрицы Map заполняется кодами из таблицы знакогенератора Font_6x8_Data. Индекс каждого байта таблицы вычисляется по формуле , где — ASCII-код отображаемого символа, — счетчик цикла, соответствующий номерам столбцов светодиодной матрицы. Индексу массива Map придается смещение, равное единице (Map[k+1]). Это необходимо для симметрирования изображения на светодиодной матрице (символ имеет ширину 6 точек, а матрица — 8). Таким образом, при будут заполнены средние 6 столбцов.
7. Программа заканчивается конструкцией вечного цикла.
3.11.4 Алгоритм процедуры обработки прерывания
В процедуре объявляется локальная переменная Code типа unsigned
int.
1. Формирование 16-разрядного кода Code осуществляется в соответствии со схемой на рисунке 3.11.4. Предложим команду, формирования управляющего кода.
Code=0x100 << K | Map[K];
Старший байт содержит одну единицу, в позиции K-го столбца, питание которого предстоит включить. Этот байт формируется путем сдвига шестнадцатеричного числа 0x100 на K разрядов влево. Младший байт занимает K-ый код управления светодиодами столбца из массива Map. Он внедряется операцией логического сложения.
2–4. Необходимо увеличить на единицу счетчик столбцов K и его обнулить, если в результате он стал равен семи.
5. Передача по SPI осуществляется присваиванием регистру S0SPDR управляющего кода Code. Как следует из схемы на рисунке 3.11.1, активными уровнями являются логические нули. Поэтому перед присваиванием переменную необходимо инвертировать:
S0SPDR=~Code;
6. Далее требуется дождаться завершения передачи по SPI, ожидая в цикле while аппаратной установки единицы в разряде SPIF регистра S0SPSR.
while (!(S0SPSR & 0x80)) ;
200
7.Получив подтверждение окончания передачи, то есть загрузки сдвиговых регистров, необходимо сформировать строб на входах RCK микросхем 74HC595, подключенных параллельно к линии P0.15. Для этого дать подряд команды на установку в единицу и сброс в ноль этой портовой линии. Длительность такого импульса даже при тактовой частоте микроконтроллера 60 МГц окажется больше минимально допустимого значения 24 нс. По нарастающему фронту сигнала RCK в выходные защелки двух регистра перепишется принятый код и на выводах Q0–Q7 установятся соответствующие логические уровни.
8.Инициализация системы прерываний состоит в сбросе флага в регистре T0IR и сбросе в ноль регистра VICVectAddr.
3.11.5 Реализация движения строки
Ниже рассматривается вариант получения анимированного изображения — эффекта «бегущей» строки. За основу принимается та же программа. Потребуются следующие константы и переменные:
а) строковая константа хранит движущиеся символы; б) целочисленная константа — ширина индикатора (число точек);
в) целочисленная константа — число кадров, в течение которых строка остается неподвижной;
г) целочисленная константа — длина строки (число символов);
Процедура обработки |
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
||||||
прерывания от таймера |
|
|
8 |
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
Инкремент K |
|
|
|
|||
|
Начало |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
9 |
|
|
|
|
Да |
||
1 |
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
K = LM |
|
|
|
|||||
|
I = T + k % L |
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||
2 |
|
|
|
|
|
|
|
|
|
Нет |
10 |
|
|||
|
|
|
|
Да |
|
|
|
|
K = 0 |
||||||
|
|
|
|
|
|
|
|
|
|
||||||
|
I >= 6N |
|
|
|
|
|
|
|
|
|
|
||||
|
3 I = I - 6N |
|
|
|
|
|
|
11 Инкремент T |
|||||||
|
|
Нет |
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||
4 |
|
|
|
|
|
|
|
|
|
Да |
12 |
|
|||
|
|
|
|
|
|
|
|
|
|
||||||
Формирование кода C |
|
|
|
|
|
|
|
|
T = 6N |
||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
||||||
|
для K % L и I |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Нет |
5 |
|
|
|
|
|
|
|
|
|
|
|
13 |
|
||
|
Передача по SPI С |
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
T = 0 |
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
6 |
|
|
|
|
|
|
14 |
|
|
|
|
|
|
||
|
|
|
|
Да |
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
||||||
|
Передача ? |
|
|
|
Инициализация |
|
|
|
|||||||
|
|
|
|
системы прерываний |
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
Нет |
|
|
|
|
|
|
|
|
|
|
|||
7 |
|
|
|
Возврат |
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
Строб на P0.15 |
|
|
|
|
|
|
|
|
|
|
Рисунок 3.11.5 – Схема алгоритма процедуры обработки прерывания для эффекта «бегущей строки»
201
д) целочисленная переменная — счетчик столбцов изображения;
е) целочисленная переменная — счетчик столбцов индикатора;
ж) массив байтов — карта индикатора, которая теперь будет хранить изображение всей строки, поэтому имеет размерность .
Все эти переменные и константы должны быть глобальными. Счетчикам K и T обязательно должны быть присвоены нулевые начальные значения. Предложим пример объявления.
const char Str[]="Превед!"; const int M=8, L=8;
const int N=sizeof(Str)-1; char Map[N*6];
int T=0, K=0;
В основной программе потребуется внести изменения в блок 6 (рисунок 3.11.2), отвечающий за формирование карты индикатора. Предлагается следующая реализация блока 6.
for (k=0;k<N;k++) for (i=0;i<6;i++)
Map[k*6+i]=Font_6x8_Data[Str[k]*6+i];
В процедуре обработки прерывания (рисунок ) кроме переменной C потребуется еще одна целочисленная переменная I, которая хранит номер индицируемого столбца карты. Изменения касаются блоков 1–4, 9–13. Прокомментируем их.
1. Из карты выбирается столбец, с номером вычисляемым по формуле
,
где обозначено остаток от отделения на .
2–3. Блоки предназначены для «цикличности» бегущей створки. Они обеспечивают то, что последний столбец будет сменяться первым. Если I окажется больше предельного значения 6N, он будет откорректирован.
Предлагается блоки 1–3 реализовать командами:
I=K % L+T;
if (I>=N*6) I-=N*6;
4. Формирование управляющего кода теперь осуществляется по правилу: столбец индикатора , столбец карты .
Code=0x100 << K % L | Map[I];
Назначение блоков 9–13 ясно из алгоритма. Здесь предложим запись на языке Си
if (++K==L*M)
{
K=0;
if (++T==6*N) T=0;
}
202