- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 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 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
проверяет неравенство и возвращает значение ; если оно справедливо и число 16 иначе.
Третий параметр функции 0x80 + k представляет собой сумму базового адреса и смещения. Смещением служит счетчик байтов k, которому дается приращение 16.
Функция Delay, рассмотренная в разделе 3.1.5 обеспечит задержку 5 мс, необходимую для завершения записи каждого блока.
3.21 Интерфейс RS-232. Прием и передача простых команд
3.21.1 Задание
Разработать программу, принимающую по интерфейсу RS-232 команду, кодируемую одним байтом. Команда содержит инструкцию для включения одного из трех светодиодов: символ «r» — красного, символ «g» — зеленого, символ «b» — синего. На каждый полученный байт должен быть послан ответ: символ «!», если команда распознана и символ «E», если не распознана (передан любой другой символ).
3.21.2 Алгоритм программы
Схема программы показана на рисунке 3.21.1. В программе потребуется объявить единственную переменную Byte для хранения байта данных, полученного по UART0.
|
|
|
Начало |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
«r» |
||
|
|
|
Настройка портовых |
|
|
|||
|
|
|
|
|
|
|
||
|
|
|
линий на вывод |
|
|
7 Зажечь красный |
||
|
|
|
|
|
|
|
||
|
|
2 |
|
|
|
светодиод; |
||
|
|
|
Настройка режима |
|
|
|||
|
|
|
|
|
передать «!» |
|||
|
|
|
линий P0.0 и P0.1 |
|
|
|||
|
|
|
|
|
|
|
||
|
|
3 Настройка UART |
|
|
«g» |
|
||
|
|
|
|
|
||||
|
|
|
|
|
|
|||
|
|
|
|
8 Зажечь зеленый |
||||
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
светодиод; |
|
|
Нет |
4 |
|
|
|
передать «!» |
||
|
|
|
Байт принят? |
|
|
«b» |
|
|
|
|
|
|
|
|
|||
|
|
|
|
Да |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
5 |
|
|
9 Зажечь синий |
|||
|
|
|
|
|
||||
|
|
|
Принять байт; |
|
|
светодиод; |
||
|
|
|
поместить в Byte |
|
|
|||
|
|
|
|
|
передать «!» |
|||
|
|
|
|
|
|
|
||
|
|
6 |
|
|
|
Иначе |
|
|
|
|
|
|
|
|
|||
|
|
|
Байт |
|
|
|
|
|
|
|
|
|
|
10 Передать «E» |
|||
|
|
|
|
|
|
|
Рисунок 3.21.1 – Схема программы приема однобайтных команд по интерфейсу RS-232 с ответом
232
1.Перевести в режим вывода (регистр IO0DIR) портовые линии P0.7– P0.9, к которым подключен трехцветный светодиод.
2.Выбрать режим TxD и RxD для портовых линий P0.0, P0.1 (регистр
PINSEL0).
3.Выполнить настройку UART:
а) установить бит DLAB в регистре U0LCR (присвоить U0LCR значение 0x80). 1. Перевести в режим вывода (регистр IO0DIR) портовые линии P0.7–P0.8, к которым подключен трехцветный светодиод.
2.Выбрать режим TxD и RxD для портовых линий P0.0, P0.1 (регистр
PINSEL0).
3.Выполнить настройку UART:
а) установить бит DLAB в регистре U0LCR (присвоить U0LCR значение
0x80).
б) выбрать одну из стандартных скоростей (например, 9600 бит/с) через регистры U0DLM, U0DLL, U0FDR. При этом руководствоваться таблицей 1.19.1. Напомним, что по умолчанию тактовая частота периферийных устройств МГц.
г) сбросить в ноль бит DLAB регистра U0LCR; в том же регистре выбрать восьмибитный режим с одним стоповым битом без контроля четности.
д) включить буферы установкой в единицу бита FIFO EN в регистре
U0FCR.
Блоки 4–10 поместить в вечный цикл.
4. Дождаться наличия данных в буфере приемника путем циклического тестирования бита RDR регистра U0LSR
while ((U0LSR & 0x1)==0) ;
5.Считать байт из регистра U0RBR в переменную Byte.
6.Проанализировать результат через конструкцию switch…case.
switch (Byte)
{
case 'r': ... ; break; case 'g': ... ; break; case 'b': ... ; break; default: ... ;
}
7–10. Каждая ветвь содержит команду записи в порт для включения соответствующего светодиода и команду передачи ответа. Передача выполняется путем записи символьной константы в регистр U0THR, например,
U0THR='!';
Для проверки программы следует воспользоваться утилитой
232Analyzer (см. раздел 2.6.4).
233
3.21.3 Автоматическая настройка скорости
Для проверки работы UART в режиме автоматического определения скорости следует исключить команды выбора скорости. Вместо этого после настройки UART0 включить команду
U0ACR=1;
После запуска программы и установки связи через терминал передать символ «a». Если скорость определена верно, этот символ будет правильно распознан программой, как недопустимая команда, на что она ответит символам «E». Если скорость не определится, скорее всего, получим «мусор». Чтобы повторить попытку необходимо сбросить программу микроконтроллера.
3.22 Интерфейс RS-232.
Передача пакета с использованием прерываний
3.22.1 Задание
Разработать программу, выполняющую передачу по интерфейсу RS-232 массива байтов, расположенного в оперативной памяти микроконтроллера. Запросом на передачу служит символ «t» принимаемый по каналу RS-232 от персонального компьютера.
3.22.2 Основные рекомендации
Для обнаружения готовности канала UART для приема или передачи воспользуемся системой прерываний. Как известно, микроконтроллер LPC2148 воспринимает любое прерывание от UART, как вызванное одним источником. Поэтому процедура обработки прерываний должна содержать ветвления для идентификации прерывающего события. Если прерывающим событием является получение запроса (принят символ «t»), то необходимо инициировать процесс передачи массива. Другим возможным прерывающим событием является опустошение буфера передатчика. В этом случае в него следует направить очередной блок из 16 байт.
3.22.3 Алгоритм программы
Алгоритм основной программы показан на рисунке 3.22.1. В программе потребуются несколько глобальных переменных:
а) массив байтов Data, элементам которого здесь же присваиваются произвольные начальные значения;
char Data[]={0,1,2,3,... };
б) целочисленный счетчик байтов n.
Рекомендуется ввести обозначение N — число элементов в массиве Data. Это можно сделать следящей директивой.
#define N sizeof(Data)
1–2. Первые два блока подробно рассмотрены в предыдущей программе и здесь не комментируются.
3. Настройка прерываний состоит из включения прерываний от приемника и передатчика UART через регистр U0IER. Требуется установить би-
ты THRE и RBR.
234
Процедура обработки прерывания Начало
1
i= 0
2
Считать
идентификатор |
|
|
прерывания в IntID |
|
|
3 |
IntID |
|
|
|
|
|
Иначе |
0x04, |
0x02
7 |
i < 16 |
|
n < N |
|
Нет |
11 |
|
Инициализация |
|
системы прерываний |
|
Конец |
|
0x0C |
|
4 |
Принят |
|
символ «t» |
|
Нет |
Да
8
i= i + 1
9
Передача Data[n]
10 n = n +1
Основная программа Начало
1 Настройка режимов
P0.0 и P0.1
2
Настройка UART
3
Настройка прерываний
4
Пустая команда
Да
5
Передача Data[0]
6
n = 1
Рисунок 3.22.1 – Схема программы обмена данными через RS-232 с использованием прерываний
Далее требуется настроить систему прерываний через регистры
VICVectAddr0, VICVectCntl0, VICIntEnable (раздел 1.11.5).
4. Основная программа завершается конструкцией пустого вечного
цикла.
Схема процедуры обработки прерываний на том же рисунке 3.22.1
1.Объявить локальную переменную–счетчик i, которая будет изменяться от 0 до 15 и содержать номер байта в блоке из шестнадцати. Счетчику нужно присвоить нулевое начальное значение. Здесь же потребуется локальная переменная IntID для хранения кода, идентифицирующего прерывающее событие.
2.Присвоить переменной IntID содержимое четырех младших битов регистра U0IIR. Воспользоваться наложением маски.
235