- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 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 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
следняя по-прежнему будет размещена в ПЗУ. Еще важнее то, что даже умножение чисел с плавающей точкой при компиляции, реализуется с использованием подпрограмм, которые тоже по умолчанию находятся в ПЗУ.
Для переноса подпрограмм и библиотечных функций в оперативную память придется вручную править сценарий редактора связей (Linker scatter file). Файл имеет расширение *.SCT.
Подключение сценария выполняется в свойствах проекта: Options for Target… Linker. Нужно снять флаг Use Memory Layout from Target Dialog и нажать кнопку Edit… (рисунок 2.3.16).
Приведем пример модифицированного сценария с небольшими комментариями. Добавленные строки выделены светло-серым цветом.
;**********************************************************
;** Scatter-Loading Description File generated by uVision *
;**********************************************************
LR_IROM1 0x00000000 0x00080000 { |
|
||
|
ER_IROM1 0x00000000 0x00080000 { |
; Область ПЗУ |
|
|
*.o (RESET, +First) |
|
|
|
*(InRoot$$Sections) |
|
|
|
*armlib/c_* (+RO) |
|
; Библиотечные функции |
|
.ANY (+RO) |
|
|
} |
|
|
|
|
RW_IRAM1 0x40000000 0x00008000 { |
; Область ОЗУ |
|
|
RAM_Func.o (+RO) |
; Функция пользователя |
|
|
*armlib* (+RO) |
|
; Подпрограммы |
|
.ANY (+RW +ZI) |
|
|
} |
|
|
|
} |
|
|
|
В этом примере подпрограммы перенесены в ОЗУ, в то время как библиотечные функции, занимающие гораздо больше места в памяти оставлены в ПЗУ.
2.4 Методика отладки программ
В этом разделе будут даны рекомендации по диагностике программ и выявлению ошибок. Основным инструментом является среда разработки Keil µVision и один из многочисленных внутрисхемных отладчик с интерфейсом JTAG, например J-Link. Возможна работа и в отсутствии внутрисхемной отладки, но симуляция не гарантирует выявление всех ошибок и не может заменить проверку программы в функционирующей системе. В то же время некоторые возможности доступны только в режиме симуляции.
Для отладки программы в системе инженер должен иметь в своем распоряжении базовый комплект лабораторных электроизмерительных приборов: осциллограф (желательно цифровой), вольтметр или мультиметр, частотомер, а также источник регулируемого постоянного напряжения и функ-
131
циональный генератор. Надо сказать, что в большой степени цифровой осциллограф может заменить другие измерительные приборы, выполняя функции измерения напряжения, интервалов времени и частоты.
Прежде всего, предлагается выполнить процедуру, названную авторами «быстрый поиск ошибок» (раздел 2.4.1). Эта процедура позволяет с минимальными затратами времени выявить самые грубые ошибки, которые часто встречаются на практике, причем делают совершенно неработоспособной программу и систему, которой она управляет.
Быстрый поиск не позволяет выявить ошибки в настройках периферийных устройств. Диагностике периферии посвящены разделы 2.4.2–2.4.13.
2.4.1 Быстрый поиск ошибок
Алгоритм процедуры быстрой отладки показан на рисунке 2.4.2. Напомним, что проверка программы выполняется нажатием Ctrl+F5 и F5. Перед началом любой диагностической операции необходимо остановить выполнение программы кнопкой Stop.
Ошибочный режим ядра. После запуска и остановки программы, прежде всего, следует обратить внимание на режим работы ядра (см. рисунок 2.4.1). Если после остановки программы ядро находится в режиме User/System, это нормально. Любой другой режим, чаще всего, следствие грубой ошибки, причины которых перечислены ниже.
Рисунок 2.4.1 – Индикация режима ядра
●Зависание в режиме Supervisor. При выполнении программы режим Supervisor, скорее всего, возник, как следствие переполнения счетчика команд, потому что в программе отсутствует вечный цикл. Напомним, что сброс кнопкой на панели инструментов (рисунок 2.3.10, 1) также переведет ядро в режим Supervisor. Ошибкой это не является.
●Зависание в режиме Abort всегда говорит об ошибке. Переход в режим Abort возникает в двух исключительных ситуациях: Data Abort и Prefetch Abort (см. раздел 1.6). Распознать возникшее исключение можно по команде, на которой произошло зависание.
Ели программная обработка этих исключений не реализована, то при Prefetch Abort зависание происходит на адресе 0x00000048, где размещена команда вечного цикла (см. файл Startup.s)
PAbt_Handler B PAbt_Handler
Data Abort дает зависание на следующей строке (адрес 0x0000004С)
DAbt_Handler B DAbt_Handler
132
|
|
Начало |
|
|
|
Остановить программу |
|
||
|
User/System |
Режим ядра |
Supervisor |
|
|
|
1 |
||
|
|
|
||
Да |
|
|
Нет вечного цикла |
|
Зависание? |
|
|
||
|
Нет |
Abort |
||
|
|
|||
Конец |
|
|
2 |
|
|
|
Индекс массива вне |
||
|
|
|
||
|
Нет |
Прерывание |
допустимого диапазона |
|
|
|
или |
||
|
|
используется? |
||
|
|
|
переполнение стека |
|
|
|
Да |
|
|
|
|
|
Всегда только Interrupt |
|
|
|
Точка останова |
3 |
|
|
в проц. обраб. прерыв. |
|||
|
Не сбрасывается флаг |
|||
|
Создать прерывающее |
|||
|
прерывания |
|||
|
|
событие |
||
|
|
|
||
|
Да |
Остановка? |
Нет |
|
|
|
4 |
||
|
|
|
||
|
|
|
Ошибка в настройке |
|
|
Возобновить работу |
|
системы прерываний |
|
|
программы и повторить |
|
|
|
|
прерывающее событие |
|
5 |
|
|
|
|
||
Да |
|
Нет |
Не включен запрос |
|
Остановка? |
прерывания |
|||
|
|
|||
|
|
|
||
|
|
7 |
|
|
Останов на команде |
Нет обнуления |
6 |
||
|
||||
ввода-вывода, |
|
VICVectAddr |
Нет прерывающего |
|
выполнение команды |
|
события (ошибка в |
||
ввода-вывода |
|
|
настройки периферии) |
|
Ввод-вывод |
Да |
|
|
|
|
|
|
||
верный? |
|
8 |
|
|
Нет |
Неверный режим |
|
||
портовой линии |
|
|||
|
|
Проверка настроек |
|
|
|
9 |
|
|
|||
периферии. |
|
|
|
|
|
|
Ошибка направления |
||
Пошаговая проверка |
|
|
||
|
|
портовой линии |
||
алгоритма |
|
|
||
|
|
|
|
|
|
|
|
||
|
|
|
|
|
10
Конец |
Не выбрана |
|
скорость порта |
||
|
Рисунок 2.4.2 – Схема алгоритма диагностирования наиболее распространенных ошибок в программах для микроконтроллера LPC2148
133
4
3
2
1
Рисунок 2.4.3 – Переход ядра в режим Data Abort при обращении к недопустимому адресу памяти (смещение 0x60000000)
Режим Abort (Data Abort) чаще всего возникает из-за выхода за допустимые границы индекса массива, которому ошибочно не присваивается начальное значение или не контролируется принадлежность диапазону.
Необходимо внимательно проследить, верно ли назначена размерность массивов, и всегда ли соответствуют ей индексы.
Если программа сложна настолько, что найти ошибку не удается, придется выполнить следующую последовательность действий:
а) считать адрес ошибочной команды из регистра R14; на рисун-
ке 2.4.3 это адрес 0x00000244 (2);
б) найти в окне дизассемблера этот адрес (3), уменьшенный на 8
(0x0000023C);
в) щелчок в окне дизассемблера подсветит строку желтым цветом и выделит синей стрелкой искомую Си-команду, приводящую к ошибке (4).
Исключения Prefetch Abort возникает при передаче управления команде по недопустимому адресу. Частая причина исключения — переполнение стека. Проблема решается уменьшением числа вложенных функций или увеличением области памяти, выделяемой под стек. Настройки стека доступны через инструмент Configuration Wizard Stack Configuration (Stack Size in Bytes). Объем стека задается для каждого режима ядра в отдельности. Скорее всего, переполнение возникает в режиме Interrupt или Fast Interrupt. Для этих режимов, прежде всего, и следует менять объем стека.
●Зависание процедуры обработки прерывания (режим Interrupt). Сразу заметим, что остановка могла произойти внутри процедуры обработки прерывания случайно. Ошибкой считается только непрерывная работа ядра в режиме Interrupt, когда бы ни остановили программу.
В процедуре обработки прерывания должна размещаться команда присваивания, сбрасывающая флаг запроса прерывания. Если такая команда отсутствует, прерывание будет выполняться циклически. В этом обычно и состоит причина ошибки.
●Зависание в режиме User/System. Программа всегда содержит вечный цикл. Если по прошествии нескольких секунд после запуска остановка
134
произошла в точке выше вечного цикла, это говорит о зависании программы. Чаще всего такое зависание возникает в случае неудачной инициализации внешних устройств. Например, когда ЖК модуль не отвечает на команды.
Ошибки, связанные с системой прерываний. Если прерывания не используются, этот этап поиска ошибок следует пропустить.
Необходимо установить точку останова на любой команде внутри процедуры обработки прерывания (рекомендуется на первой) и запустить программу. Далее дождаться прерывающего события или создать его. Если остановка не происходит или происходит лишь однажды, то можно предположить возникновение одной из следующих ошибок.
●Ошибка в настройке системы прерываний. Открыть окно настройки прерываний с помощью меню Peripherals Vectored Interrupt Controller
(рисунок 2.4.4). Основную часть окна занимает таблица, в которой перечислены все источники прерываний (1–2). Требуется убедиться, что:
а) прерывание от интересующего источника (1) разрешено (6); б) обычно, классифицировано как IRQ (3);
в) ассоциировано с нужным слотом (3) (только для IRQ); г) адрес обработчика задан (4), то есть не равен нулю.
●Отключен запрос прерывания. Запрос прерывания от каждого источника включается через управляющие регистры соответствующего периферийного устройства. Для проверки разрешено ли формирование запроса требуется открыть окно периферийного устройства. О проверке этих битов сказано ниже в разделах 2.4.2–2.4.13.
●Ошибка в настройке периферии. В том же окне можно обнаружить, что периферийное устройство (источник прерывания) вообще отключено или неверно настроено. Поэтому запросы прерывания не генерируются.
|
4 |
|
5 |
1 |
6 |
|
|
|
2 |
|
3 |
1 |
– прерывания от таймеров; |
4 |
– адрес обработчика прерывания; |
2 |
– вид прерывания (IRQ или FIQ); |
5 |
– флаг разрешения прерывания; |
3 |
– номер слота; |
6 |
– флаг запроса прерывания |
Рисунок 2.4.4 – Окно настройки системы прерываний
135
●Инициализация системы прерываний. Если оказывается, что прерывание возникает с появлением прерывающего события, но лишь однажды, скорее всего, пропущена команда обнуления регистра VICVectAddr. Лучше сделать эту команда в процедуре обработки прерываний последней. По невнимательности нередко обнуляют VICVectAddr0 вместо VICVectAddr.
Ошибки в настройке портовых линий. Возможно, программа рабо-
тает нормально, все периферийные устройства настроены верно, но ввод или вывод не происходит из-за ошибки в настройке режима или направления портовых линий.
●Неверная настройка режимов портовых линий. Все линии порта 0 кроме основной функции могут выполнять несколько альтернативных. Если альтернативная функция не выбрана, то линия является дискретным входомвыходом и отключена от периферийных устройств.
Для выявления ошибки следует воспользоваться окном Peripherals Pin Connection Block (рисунок 2.4.5). Окно представляет собой перечень линий порта 0 (1), напротив которых указан их текущий режим (2). По умолчанию установлен режим «GPIO Port 0.x» — это режим дискретного вводавывода. В меню (3) выбирается один из четырех возможных режимов каждой портовой линии. Нужно убедиться, что все необходимые альтернативные функции есть в списке (2), и назначены они верным портовым линиям (1).
1 – обозначения линий;
2 – режимы линий;
3 – меню выбора режима
2
1
3
Рисунок 2.4.5 – Окно настройки режимов портовых линий
● Для линий дискретного вывода должно быть задано направление. По умолчанию все линии настроены на ввод. Ошибка в настройке направления через IOxDIR или FIOxDIR приводит к тому, что дискретный сигнал на ножке не появится.
Проверить настройку можно в окне Peripherals GPIO Slow / Fast Interface Port 0/1 (рисунок 2.4.6). Верхний ряд флажков отвечает за направление. Установленный флажок соответствует режиму вывода.
136