- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 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. Завершить программу вечным циклом.
Схема процедуры обработки прерывания показана на рисунке 3.8.3.
1. Вывести в порт очередную кодовую комбинацию. Индекс элемента массива последовательно должен принимать значения 0, 1, 2, 3, 0, 1 и т. д. В то время как счетчик шагов n будет меняться от 0 до 10 и обратно до 0. Очевидно, что индекс массива можно вычислить как остаток от деления n на 4. Поэтому блок 1 реализуется командой
FIO0PIN=P[n%4];
2. Увеличить счетчик шагов n на величину приращения D.
3–5. Если n вышел за границы интервала [0; 10], сделать шаг в противоположном направлении вычитанием удвоенного D; далее изменить знак D. Это приведет к изменению порядка чередования кодовых комбинаций на противоположный и реверсу двигателя.
6. Завершить процедуру обработку прерывания сбросом флага запроса
(T0IR) и обнулением VICVectAddr.
3.9 Применение ШИМ для формирования низкочастотных аналоговых сигналов
3.9.1 Задание
Разработать программу, с помощью ШИМ формирующую на выходе AOUT учебной платы гармонический сигнал частой 2 Гц.
3.9.2 Основные сведения
Если обработать ШИМ-сигнал фильтром нижних частот, частота среза которого намного меньше частоты несущего колебания, то получим восстановленный модулирующий сигнал. Так ШИМ может использоваться для формирования низкочастотного аналогового сигнала. На плате EA-EDU-001 выход PWM2 микроконтроллера подключен к RC-фильтру нижних частот 1-го порядка (см. рисунок 3.9.1 R83=3 кОм, C39=22 мкФ). Частота среза фильтра примерно составляет 2,4 Гц (по уровню –3 дБ). Это позволит формировать лишь постоянное или медленно меняющее напряжение. Однако ограничение вызвано именно аналоговым фильтром, а не возможностями микроконтроллера. Практически возможно получить аналоговый сигнал с частотой, по крайней мере, до 20 кГц.
Рисунок 3.9.1 – Схема фильтра нижних частот
Другой фильтр позволит получить с помощью ШИМ сигнал, по крайней мере, в звуковом диапазоне частот.
На рисунке 3.9.2 (внизу) приведены осциллограммы ШИМ-сигнала, для которого длительность импульсов медленно меняется по гармоническо-
185
му закону. Выше показана осциллограмма гармонического напряжения частотой 2 Гц, полученного путем фильтрации. В данном случае частота следования импульсов в 50 раз превышает частоту модулирующего колебания ( Гц). При этом отчетливо видна высокочастотная составляющая в составе гармонического напряжения.
Осциллограмма для случая тысячекратного превышения ( кГц) показана на рисунке 3.9.3.
Для реализации генератора предлагается использовать таблицу дискретных отсчетов гармонического сигнала и изменение длительности модулированных импульсов по таймеру (многократно за период).
Введем следующие обозначения: , Гц — частота гармонического сигнала; — число модулированных импульсов, заключенных в периоде гармонического сигнала. — коэффициент, связывающий частоту импульсов и частоту модулирующего колебания.
Рисунок 3.9.2 – Осциллограммы ШИМ-сигнала (f0 = 100 Гц, M = 50, N = 50) и гармонического сигнала, полученного с помощью его фильтрации
Рисунок 3.9.3 – Осциллограмма гармонического напряжения, полученного с помощью фильтрации ШИМ-сигнала (f0 = 2 кГц, M = 1000, N = 50)
186
В частности, может меняться длительность каждого импульса, как на рисунке 3.9.2. Однако при большом это приведет к чрезмерному увеличению отсчетов генерируемого сигнала и, как следствие, объема памяти для хранения таблицы. Вполне допустимо длительность нескольких импульсов подряд оставлять неизменной. Тогда число градаций длительности импульсов и коэффициент заполнения (обозначать его ) будет меньше . Так сигнал на рисунке 3.9.2 получен при пачках из импульсов одинаковой длительности.
Опираясь на выражение (1.14.1), выразим значение регистра PWMMR0, определяющее период модулированных импульсов:
. (3.9.1)
Аналогично в соответствии с (1.13.3) пороговое значение таймера, задающее интервал постоянства коэффициента заполнения:
. (3.9.2)
Каждый дискретный отсчет, определяющий длительность импульса рассчитывается по формуле
, (3.9.3)
3.9.3 Алгоритм основной программы
Схема алгоритма показана на рисунке 3.9.4. В программе используется функция расчета синуса, поэтому кроме привычного описания регистров, файла LPC2148.h, необходимо подключить библиотеку математических функций.
#include <math.h>
1. Для управления ШИМ будут использованы , , , смысл которых был разъяснен выше. Объявить константы в Си-программе необходимо директивами
#define f 2.0 // Частота гармонического сигнала #define M 100 // Число импульсов ШИМ в периоде #define N 100 // Число градаций длительности в периоде
В программе потребуется объявить глобальные переменные: целочисленные счетчик k, и массив u из N элементов.
int k, u[N];
2.Перевести линию P0.7 в режим PWM2 (регистр PINSEL0).
3.Задать частоту ШИМ через регистр PWMMR0 (3.8.1). Рекомендуется выразить ее через объявленные константы, например
PWMMR0=15E6/f/M-1;
Здесь 15E6 обозначает входную частоту счетчика ШИМ по умолчанию.
4. Через регистр PWMMCR разрешить сброс счетчика ШИМ при совпадении с пороговым значением PWMMR0.
187
Основная программа |
7 |
Процедура обработки |
|
||
|
|
|
прерывания |
|
|
|
Начало |
Расчеты таблицы |
|
||
|
|
|
|||
|
отсчетов сигнала |
|
|
||
|
|
|
Начало |
|
|
|
1 |
|
|
|
|
|
|
8 |
|
|
|
|
Ввод f |
, M, N |
1 |
|
|
|
|
|
|||
|
0 |
|
k=0 |
|
|
|
|
|
PWMMR2=u[k] |
|
|
2 |
|
|
|
|
|
|
|
9 |
|
|
|
|
Настройка режима |
2 |
|
||
|
Настройка таймера: |
|
|||
|
|
|
|
||
портовой лини P0.7 |
Инкремент k |
|
|||
вкл. cброс и |
|
||||
|
|
|
|
|
|
3 |
|
|
запрос прерывания |
3 |
|
|
|
|
|
||
Задание частоты ШИМ |
10 |
Стробирование |
|
||
|
|
|
защелки ШИМ |
|
|
4 |
|
|
Задание порогового |
|
|
|
|
|
|
||
|
Настройка схемы |
значения для таймера |
|
|
|
|
совпадения ШИМ |
11 |
4 |
Да |
|
|
|
|
k=N |
|
|
5 |
|
|
Настройка системы |
|
5 |
Вкл. cч. ШИМ в |
прерываний |
|
|||
|
|
||||
|
Нет |
k=0 |
|||
синхронном режиме |
|
||||
12 |
|
|
|||
|
|
|
|
|
|
6 |
|
|
Запуск таймера |
6 |
|
Включить канал PWM2 |
|
|
|||
|
Инициализация |
|
|||
|
|
|
|
|
|
|
|
|
13 |
системы прерываний |
|
|
|
|
|
|
|
|
|
|
Пустая команда |
|
|
|
|
|
|
Конец |
|
Рисунок 3.9.4 – Схемы алгоритмов основной программы
ипроцедуры обработки прерывания от таймера
5.Включить счетчик ШИМ в синхронном режиме (с использованием защелок) через регистр PWMTCR.
6.Включить выход канала PWM2 (регистр PWMPCR). Управление фазой для всех каналов оставить отключенной.
7.Расчет таблицы выполнить по формуле (3.9.3), которая реализуется на Си следующим образом:
for (k=0; k<N; k++) u[k]=floor((PWMMR0-1)/2*
(sin(2*3.1415927*k/N)+1)+0.5);
8. Значение счетчика будет использоваться в дальнейшем, поэтому после цикла важно присвоить ему нулевое значение.
9–13. Блоки абсолютно идентичны соответствующим блокам программы генератора прямоугольного сигнала (практическое занятие №2). Отметим лишь, что присвоить задать пороговое значение (3.9.2) удобно командой
T0MR0=15E6/f/N-1;
3.9.4 Алгоритм процедуры обработки прерывания
Оформление процедуры обработки прерывания от схемы совпадения таймера рассматривалось в практическом занятии №2.
1–2. Загрузить новое значение в пороговый регистр PMWMR2. Оба блока реализуются одной командой Си
188