- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 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 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
3.Записать конструкцию множественного ветвления (switch…case). Создать три ветви: 0x04 — буфер приемника заполнен; — 0x02; 0x0C — в буфер приемника поступил, по крайней мере, один байт; 0x02 — буфер передатчика пуст.
4.Если прерывающим событием является получение байта, проверить байт в U0RBR на равенство символу «t».
5–6. Если условие выполнено, передать нулевой элемент массива, записав его в регистр U0THR и присвоить счетчику единицу, так чтобы передача была продолжена с первого элемента массива. Теперь завершение передачи элемента Data[0] приведет к новому прерыванию с идентификатором
0x02.
7.Записать цикл с предусловием для передачи 16 байт подряд. Условие прекращает передачу, когда отправлен последний элемент.
8–10. Тело цикла содержит инкремент счетчика i, а также передачу очередного элемента массива и инкремент счетчика байтов n.
11.Процедура обработки прерывания завершается обнулением реги-
стра VICVectAddr.
3.23 Интерфейс RS-232. Прием пакета переменной длины
3.23.1 Задание
Разработать программу для приема пакета чисел в формате IEEE754 float переменной длины по интерфейсу RS-232 и отображение принятых чисел на ЖКИ в формате X.X.
3.23.2 Основы реализации
Предлагается принимать данные в виде пакета, имеющего структуру, показанную на рисунке 3.23.1. Кадр начинается с известного заголовка 0x7А80A1A2. Заголовок используется для кадровой синхронизации приемниками и передатчика, то есть для обнаружения приемником начала кадра. Вероятность случайного совпадения с заголовком четырехбайтной последовательности внутри кадра очень мала. К тому же, код 0x7А80A1A2 в формате IEEE754 соответствует неопределенности (NaN), которая вряд ли вообще встречается в кадре. Вторым словом передается четырехбайтная константа N, показывающая длину (число четырехбайтных полей) остальной части кадра. Далее следуют числа в формате IEEE754 float.
Номера |
|
|
|
|
|
|
|
|
|
|
байтов: |
0 |
3 |
4 |
7 |
8 |
11 |
12 |
15 |
4N+4 |
4N+7 |
|
0x7F80A1A2 |
unsigned int N |
float D[0] |
|
float D[1] |
... |
float D[N-1] |
|||
|
|
Заголовок |
|
Число слов |
Слово 0 |
|
Слово 1 |
|
Слово N-1 |
Рисунок 3.23.1 – Формат кадра
При необходимости можно включить в пакет еще одно целочисленное четырехбайтное слово для контроля ошибок. Например, это может быть циклический код CRC32.
236
3.23.3 Алгоритм программы
Приема и расшифровка кадра расположены в основной программе, поскольку процесс приема протекает достаточно медленно.
К программе подключаются файлы STDIO.h и "LCD.c". В программе объявлены следующие константы:
а) S — строка из трех символов для индикации;
б) N — беззнаковая целочисленная переменная (число полей в кадре); в) i — целочисленный счетчик;
г) k — целочисленный счетчик байтов в кадре (начальное значение 0) д) Frame — структура объединяющего типа следующей структуры:
union
{
unsigned char Bytes[400]; unsigned int Words[100]; float Floats[100];
} Frame;
Это позволит обращаться к кадру как побайтно, так и в режиме четырехбайтных слов, причем в целочисленном формате или в формате с плавающей точкой.
1.Инициализация ЖКИ производится функцией LCDInit(), разработанной ранее.
2.Портовые линии P0.0 и P0.1 необходимо перевести в режим TxD0 и
RxD0.
3.Настройка UART0 состоит в следующем:
а) Разрешить доступ к настройке скорости (бит DLAB регистра
U0LCR);
б) Рассчитать необходимые величины, задающие частоту UART по формулам (1.19.1, 1.19.2). Или воспользоваться таблицей 1.19.1 Результаты занести в регистры U0DLM, U0DLL, U0FDR.
в) включить передачу восьми бит и запретить доступ к защелкам делителя скорости (регистр U0LCR).
г) включить буфер приемопередатчика (младший бит регистра
U0FCR).
4. Организовать ожидание принятого байта, опрашивая в цикле флаг готовности в регистре состояния линии U0LSR. Все остальные блоки выполняются только в случае появления принятого байта.
237
|
Начало |
|
|
|
|
|
|
|
|
Нет |
9 |
|
1 |
|
|
|
k=8 |
|
Инициализация |
|
|
|
|
|
|
ЖКИ |
|
|
Да |
|
|
|
|
|
|
|
2 |
|
|
|
10 |
|
Настройка режима |
|
|
Сохранить длину |
|
|
линий P0.0 и P0.1 |
|
|
N=Words[1]=Bytes[7:4] |
|
|
3 |
|
|
|
|
|
Настройка UART |
|
|
|
|
|
|
|
|
Нет |
11 |
|
|
|
|
|
k>7+4N |
Нет |
4 |
|
|
|
Да |
|
Байт принят? |
|
|
||
|
|
|
|
||
|
|
Да |
|
12 |
k=0 |
|
|
|
|
||
|
5 |
|
|
13 |
|
|
Сохранение байта |
|
|
||
|
в Bytes[k] |
|
Очистить дисплей |
||
|
|
|
|
||
Да |
6 |
Заг. не |
Нет |
14 |
Да |
|
|
|
i=0; i<N; i++ |
||
|
совпал и k=3 |
|
|||
|
|
|
|
||
|
|
Нет |
|
15 |
|
|
8 |
|
|
|
|
|
|
|
Формирование строки |
||
|
Инкремент k |
|
|||
|
|
на основе Floats[i+2] |
|||
|
|
|
|
||
7 |
|
|
|
16 |
|
Сдвиг |
|
|
|
|
|
|
|
|
Индикация строки в |
||
Words[0]=Bytes[3:0] |
|
|
|||
|
|
|
позиции 4i |
||
с потерей мл. байта |
|
|
|
|
|
|
|
|
|
|
Рисунок 3.23.2 – Схема программы приема по UART кадра переменной длины
5. Считать байт из регистра U0RBR и поместить его в k-ый байт структуры Frame.
Frame.Bytes[k]=U0RBR;
После сброса k=0, следовательно, начнется заполнения кадра.
6.Условие 6 обнаружит кадровую рассинхронизацию, то есть несовпадение заголовка. Через логическое умножение заголовки сравниваются только при . То есть когда заголовок только что принят.
7.Если заголовок не совпал, требуется сдвинуть последние три байта
спотерей «самого старого» нулевого, освободив третью ячейку. Заметим, что счетчик байтов k при этом не инкрементируется. Значит, следующий принятый байт будет записан в ту же третью ячейку, чтобы с тремя уже имеющимися образовать заголовок. Счетчик как бы зависает на значении «три», а пакет сдвигается побайтно до тех пор, пока не встретятся четыре байта подряд, совпадающие с заголовком. Сдвиг осуществляется обращением к кадру в режиме слова:
Frame.Words[0]>>=8;
238