- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 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 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
18. Панель инструментов для управления точками останова. Назначение наиболее часто используемых пунктов меню и соответ-
ствующих кнопок приведены в таблице 2.3.1. Способы вызова диалоговых окон, необходимых для слежения за состоянием микроконтроллера и его периферийных устройств приведены в таблице 2.3.2.
Таблица 2.3.2 – Основные диалоговые окна отладчика Keil μVision 4
Ячейки памяти |
View Registers Window |
|
Просмотр регистров |
View Memory Window Memory 1–4 |
|
Просмотр локальных переменных |
View Watch Windows Locals |
|
Просмотр глобальных переменных |
View Watch Windows Watch 1–2 |
|
Окно дизассемблера |
View Disassembly Window |
|
Хронометраж |
View Analysis Windows |
|
Performance Analyzer |
||
|
||
Логический анализатор |
View Analysis Windows |
|
Logic Analyzer |
||
|
||
Периферийные устройства |
Peripherals … |
Остановимся на главных операциях отладки. После перехода в режим отладки (Ctrl+F5) курсор устанавливается на первую строку основной программы. Программист может сразу начать пошаговое выполнение программы (F10/F11) или же установить точку останова (F9) на интересующей строке и запустить программу (F5). При достижении этой точки выполнение программы будет приостановлено и управление передано программисту.
Отметим, что возможно пошаговое выполнение не только команд Си, но и ассемблера. Для этого переместить фокус ввода (щелчок мышью) в окно дизассемблера.
В ходе отладки программист просматривает и при необходимости модифицирует регистры процессора (2), а также локальные и глобальные переменные через Watch-окно. Доступ к большинству управляющих регистров периферии открывается через меню Peripherals …. Многочисленные диалоговые окна настройки, связанные с периферийными устройствами будут рассмотрены в разделе 2.4 «Методика отладки программ».
2.3.7 Основные отладочные инструменты среды Keil µVision 4
Окно просмотра переменных Watch (рисунок 2.3.11) служит для наблюдения за значениями переменных или массивов и их редактирования. Окно содержит таблицу из двух колонок: имена переменных (1) и значения (2, 3), которые могут быть отображены в шестнадцатеричной или десятичной форме. Добавление новой переменной к списку осуществляется нажатием кнопки F2 или двойным щелчком по пустой строке (см. подсказку «double-click or F2 to add»). Кроме окна Watch есть окно Locals, в котором отображен список локальных переменных текущей функции.
Хронометраж позволяет измерить время выполнения участка программы и доступен только в режиме симуляции (рисунок 2.3.12). Здесь отоб-
127
ражается общее время выполнения программы (2), а также отдельных подпрограмм (3). Время рассчитывается исходя из числа прошедших машинных тактов и тактовой частоты, заданной в свойствах проекта Options for Target `Target 1` Target Xtal (MHz). Сброс счетчика времени производится кнопкой (1).
|
|
1 |
– имена переменных; |
|
|
2 |
– элементы массива в |
|
2 |
|
десятичном представ- |
|
|
лении; |
|
|
|
|
|
1 |
3 |
3 |
– шестнадцатеричное |
|
|
значение переменной |
|
|
|
|
|
|
|
|
|
1
2
3
Рисунок 2.3.11 – Окно просмотра переменных Watch
1 – кнопка сброса (обнуление счетчика времени);
2 – общее время выполнения программы;
3 – время выполнения подпрограмм
Рисунок 2.3.12 – Окно хронометража Performance Analyzer
Логический анализатор, так же как и хронометраж доступен только в режиме симуляции. Инструмент позволяет получить осциллограммы сигналов на выводах микроконтроллера и графики изменения во времени переменных и регистров. Окно логического анализатора с осциллограммой сигнала на выводе P0.7 и кода цифро-аналогового преобразователя показано на рисунке 2.3.13.
1
2 |
3 |
1 – кнопка вызова диалога настроек; |
2 – выбор масштаба; |
3 – экранный курсор |
Рисунок 2.3.13 – Окно логического анализатора (Logic Analyzer)
128
1
4
6
3 2
5
7
1 – имена регистров или переменных;
2–3 – кнопки добавления или удаления сигнала; 4 – способ представления
сигнала (аналоговый, двоичный, временная диаграмма);
5 – выбор диапазона по амплитуде;
6– маска (через логическое
«И»);
7– сдвиг право
Рисунок 2.3.14 – Окно настройки логического анализатора
Настройка осуществляется кнопкой Setup (1). В окне настройки (рисунок 2.3.14) можно добавить сигнал кнопкой (2) или удалить кнопкой (3). При добавлении вводится имя переменной или регистра. Для просмотра осциллограммы логического уровня на портовой линии имя вводится по шаб-
лону «PortX.X».
Здесь же можно задать логическую обработку регистра — маскирование (6) и смещение на несколько разрядов вправо (7). Это позволяет выделить несколько интересующих разрядов «из середины» регистра. Также задаются предельные значения по оси ординат (5).
Масштаб настраивается кнопками (3). Для автоматического выбора масштаба служит кнопка All. Щелчком левой кнопки мыши по осциллограмме вызывается экранный курсор (2) — передвижная временная метка.
2.3.8 Управление распределением памяти
Задачи распределения памяти решает реактор связей (Linker). Управляя его работой можно добиваться размещения данных и фрагментов программы по определенным адресам в оперативной или постоянной памяти.
В простейшем случае используется простая схема распределения памяти: данные размещаются в ОЗУ, начиная с адреса 0x40000000; основная программа, все функции и константы, объявленные через const, — в ПЗУ, после векторов прерываний, то есть, начиная с адреса 0x00000040.
Для устранения задержек при обращении к ПЗУ можно перенести часть кода в память данных. Для этого необходимо оформить фрагмент программы, как функцию, сохранить ее в отдельный файл и прикрепить файл к проекту. Затем в окне проекта (рисунок 2.3.4) изменить свойства этого файла. В поле Memory Assignment требуется задать диапазон адресов 0x40000000– 0x40007FFF, который по умолчанию обозначен IRAM1 (рисунок 2.3.15).
129
Рисунок 2.3.15 – Настройка размещение подпрограммы в оперативной памяти
1 |
2 |
3
1 – флаг отключения сценария; 2 – имя файла сценария; 3 – редактор файла сценария
Рисунок 2.3.16 – Окно настройки редактора связей (Linker)
После этого в программу будет автоматически внедрен код, копирующий данную функцию из ПЗУ в ОЗУ. Копирование будет производиться в ходе инициализации микроконтроллера, а запускаться функция будет из оперативной памяти.
Такой способ настройки распределения памяти не решает проблем с быстродействием функций стандартных библиотек. Если пользовательская функция, находящаяся в ОЗУ, вызывает стандартную функцию sqrt, то по-
130