/
Author: Мясников В.И.
Tags: компьютерные технологии вычислительная техника микропроцессоры информатика программное обеспечение лабораторный практикум
ISBN: 978-5-8158-1929-0
Year: 2018
Text
ПРОГРАММНОЕ
ОБЕСПЕЧЕНИЕ
ВСТРАИВАЕМЫХ
СИСТЕМ
в. и. мясников
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
ВСТРАИВАЕМЫХ СИСТЕМ
Лабораторный практикум
Йошкар-Ола
ПГТУ
2018
УДК 681.3
ББК 32.97
М 88
Рецензенты:
технический директор СКБ «Хроматэк» В. С. Устюгов',_____
канд. техн, наук, доцент кафедры ПиП ЭВС ПГТУ \В. В. Коткин\
Печатается по решению
редакционно-издательского совета ПГТУ
Мясников, В. И.
М 88 Программное обеспечение встраиваемых систем: лабораторный
практикум / В. И. Мясников. - Йошкар-Ола: Поволжский государ-
ственный технологический университет, 2018. - 148 с.
ISBN 978-5-8158-1929-0
Приведены необходимые теоретические сведения об аппаратном по-
строении и программном обеспечении микропроцессорного стенда SDK-
2.0, в основе которого лежит однокристальный микроконтроллер
LPC2292, имеющий в своем составе разнообразные устройства, предна-
значенные для ввода, обработки и вывода информации в цифровом и ана-
логовом виде.
Для студентов направления подготовки 09.04.01 «Информатика и вы-
числительная техника».
УДК 681.3
ББК 32.97
ISBN 978-5-8158-1929-0
© Мясников В. И., 2018
© Поволжский государственный
технологический университет, 2018
ОГЛАВЛЕНИЕ
Предисловие............................................4
Введение...............................................5
Общие сведения о стенде................................7
Техника безопасности при выполнении лабораторных работ.9
1. АРХИТЕКТУРА СТЕНДА SDK-2.0. ИНТЕГРИРОВАННАЯ
СРЕДА РАЗРАБОТКИ......................................11
1.1. Теоретическая часть............................11
1.2. Порядок выполнения работы......................35
1.3. Содержание отчета..............................36
1.4. Контрольные вопросы............................36
2. ДИСКРЕТНЫЕ ПОРТЫ ВВОДА/ВЫВОДА.....................37
2.1. Теоретическая часть...........................37
2.2. Порядок выполнения работы.....................53
2.3. Содержание отчета.............................55
2.4. Контрольные вопросы...........................55
3. ТАЙМЕРЫ. КОНТРОЛЛЕР ПРЕРЫВАНИЙ....................56
3.1. Теоретическая часть...........................56
3.2. Порядок выполнения работы.....................72
3.3. Содержание отчета.............................73
3.4. Контрольные вопросы...........................74
4. УПРАВЛЕНИЕ ПОСЛЕДОВАТЕЛЬНЫМ ИНТЕРФЕЙСОМ............76
4.1. Теоретическая часть...........................76
4.2. Порядок выполнения работы................... 106
4.3. Содержание отчета............................108
4.4. Контрольные вопросы..........................108
5. КЛАВИАТУРА.......................................109
5.1. Теоретическая часть..........................109
5.2. Порядок выполнения работы....................124
5.3. Содержание отчета............................126
5.4. Контрольные вопросы..........................126
6. ГРАФИЧЕСКИЙ ЖИДКОКРИСТАЛЛИЧЕСКИЙ ИНДИКАТОР 128
6.1. Теоретическая часть..........................128
6.2. Порядок выполнения работы................... 143
6.3. Содержание отчета............................144
6.4. Контрольные вопросы..........................144
Заключение...........................................146
3
ПРЕДИСЛОВИЕ
Микропроцессорные системы, которые непосредственно вза-
имодействуют с объектом управления или контроля, принято
называть встроенными (embedded). В связи с появлением боль-
шого количества разнообразных микроконтроллеров, встроенные
системы в последнее время широко внедрились почти во все об-
ласти деятельности человека.
Данный лабораторный практикум посвящен вопросам разра-
ботки программного обеспечения для учебного стенда SDK-2.0.
Поэтапное обучение осуществляется, начиная со структуры и
принципиальной схемы стенда, путем постепенного усложнения
программной части.
Лабораторный практикум включает в себя 6 лабораторных ра-
бот, каждая из которых начинается с теоретической части, после
которой описан порядок проведения работы и приведена струк-
тура отчета по ней. Далее следуют контрольные вопросы и учеб-
но-методическое обеспечение.
В первой работе описана структура стенда SDK-2.0 и исполь-
зуемое инструментальное программное обеспечение, приведен
пример простой программы. Цель - научиться работать со стен-
дом: компилировать и отлаживать исходные тексты программ,
загружать их в память стенда при помощи инструментальных
средств.
Остальные лабораторные работы посвящены отдельным со-
ставным частям микроконтроллера: дискретным портам вво-
да/вывода, таймерам, контроллеру прерываний, универсальному
асинхронному приемо-передатчику, а также модулям стенда: све-
тодиодным индикаторам, клавиатуре, графическому жидкокри-
сталлическому индикатору. В работах рассматривается как аппа-
ратная часть модулей, так и особенности составления
программного обеспечения для них.
Лабораторный практикум адресован студентам, обучающимся
по направлению подготовки 09.04.01 «Информатика и вычисли-
тельная техника», а также студентам других специальностей, ин-
тересующимся разработкой встраиваемых приложений.
4
ВВЕДЕНИЕ
В настоящее время довольно стремительными темпами внед-
ряются в нашу жизнь дешевые и мощные микроконтроллеры.
Микроконтроллеры, используемые в различных устройствах, вы-
полняют функции интерпретации данных, поступающих с клави-
атуры пользователя или от датчиков, определяющих параметры
окружающей среды, обеспечивают связь между различными
устройствами системы и передают данные другим приборам.
Разработка систем на базе микроконтроллеров - микропроцес-
сорных систем (МПС) - это как аппаратная, так и программная
задача.
Микропроцессорные системы, которые непосредственно вза-
имодействуют с объектом управления или контроля, принято
называть встроенными. Встраиваемые вычислительные системы
являются важнейшим элементом любой современной системы
автоматики, медицинского или бытового прибора, устройства
связи. Во всех этих устройствах одним из основополагающих
принципов внутренней организации и применения является
принцип программируемости. Традиционное разделение вычис-
лительных устройств на аппаратную и программную составляю-
щие определило существование и активное развитие соответ-
ствующих технологий проектирования этих частей.
Микроконтроллеры являются неотъемлемыми компонентами
современных устройств и систем, прежде всего потому, что их
высокая надежность, относительно низкая стоимость, гибкость
применения (модифицируемость), возможность реализации
сложных алгоритмов управления достаточно простыми средства-
ми и возможность создания автоматических систем с качественно
новыми «интеллектуальными» свойствами позволяют получить
исключительно высокие технико-экономические и тактико-
технические характеристики разрабатываемых систем.
Быстрое удешевление микроконтроллеров привело к целесо-
образности замены ими некоторых периферийных схем. Появи-
5
лась возможность предобработки локальных данных и пересылки
ведущему микроконтроллеру только результатов. Это привело к
широкому внедрению последовательных интерфейсов. Топология
развитых систем управления приобрела характер сети локальных
ведомых микроконтроллеров, связанных между собой и с ведо-
мым микроконтроллером через последовательные интерфейсы.
Значительное улучшение характеристик собственно микро-
контроллеров связано с внедрением RISC-архитектур, Flash-
памяти программ и EEPROM-памяти данных, прецизионных бло-
ков АЦП и ЦАП. Главная трудность разработки систем на базе
микроконтроллеров необходимость понимания как аппаратных
средств, так и программного обеспечения.
Создание программного обеспечения встроенной системы
существенно отличается от программирования информацион-
ных систем общего назначения. Здесь используются специаль-
ные технические решения и инструментальные средства на всех
уровнях и этапах процесса проектирования. Следует отметить
появление даже специального термина, определяющего данную
область программирования, - встроенное программное обеспе-
чение.
Лабораторный практикум как раз и посвящен разработке
встроенных систем на базе микроконтроллера, имеющего на кри-
сталле такие функциональные блоки, как АЦП, ЦАП, EEPROM,
контроллеры 12С и UART и т.д. В состав микропроцессорного
стенда SDK-2.0 входят также клавиатура, индикатор, динамик.
Освоение методов проектирования устройств на базе данного
стенда позволит студентам стать хорошими специалистами в об-
ласти разработки встраиваемых систем.
6
ОБЩИЕ СВЕДЕНИЯ О СТЕНДЕ
Учебный лабораторный комплекс SDK-2.0 предназначен для
изучения принципов организации микропроцессорных систем,
структуры и функционирования базовых компонентов (памяти,
контроллеров ввода-вывода, подсистемы памяти и т.д.), получе-
ния навыков программирования встраиваемых систем различного
назначения.
Отличительными чертами SDK-2.0 является высокая произво-
дительность процессорного ядра, ориентация на одну из наиболее
динамично развивающихся архитектур - ARM7, большое разно-
образие периферийных блоков, включая часы реального времени,
энергонезависимую память EEPROM, графическую консоль, кон-
троллер Ethernet, контроллер беспроводных сетей ТЕЕЕ 802.15.4,
порты CAN 2.0 и RS-485.
Вычислительное ядро-.
- центральный процессор имеет широко распространенную
архитектуру ARM 7;
- значительный объем памяти программ и данных, наличие
энергонезависимой памяти EEPROM позволяют реализо-
вывать сложные системные программные комплексы, в
том числе файловые системы и операционные системы
реального времени;
- развитая структура подсистемы временной синхрониза-
ции - встроенные часы реального времени, таймеры-
счетчики - обеспечивают возможность глубокого иссле-
дования принципов и проблем организации систем реаль-
ного времени, планирования и синхронизации процессов
и т.п.;
- аппаратный сторожевой таймер (watchdog) для защиты от
зацикливания при сбоях
Система ввода-вывода:
- большое количество дискретных входов-выходов с воз-
можностью задавать образцовые тестовые воздействия;
7
- быстродействующие аналоговые входы и выходы рабо-
тающие, в том числе, в режиме ПДП.
Коммуникационная подсистема.
- большой выбор коммуникационных интерфейсов:
CAN 2.0, RS-485, RS-232, IEEE 802.15.4, Ethernet
10/100Base-TX;
- ресурсов стенда достаточно для реализации полнофунк-
ционального стека протоколов TCP/IP, включая WEB-
сервер.
Возможности разработки и отладки ПО:
- возможность загрузки и запуска тестовых программ в
ОЗУ контроллера, без перепрограммирования FLASH;
- возможность интерактивной встроенной отладки в рамках
технологий JTAG и Embedded ICE;
- обновление встроенного системного программного обес-
печения во FLASH-памяти производится с персонального
компьютера по стандартному каналу RS-232, без приме-
нения специальных программаторов.
Технические и эксплуатационные характеристики:
- тип основного процессора - LCP2292;
- память программ FLASH - 256 Кбайт;
- статическое ОЗУ - 512 Кбайт;
- память EEPROM - 4 Кб;
- часы реального времени с резервным питанием;
- клавиатура - кнопочная 4*4;
- ЖКИ - графический FSTN, 122x32;
- звукоизлучатель.
Ввод-вывод:
- аналоговые входы - 8-канальный АЦП, 10 разрядов, 0...5 В;
- аналоговые выходы - 2 канала на базе ШИМ, 10 разрядов,
0...5 В;
- дискретные входы-выходы - 20 каналов ТТЛ.
8
ТЕХНИКА БЕЗОПАСНОСТИ ПРИ ВЫПОЛНЕНИИ
ЛАБОРАТОРНЫХ РАБОТ
1. Общие требования безопасности
Опасные производственные факторы: воздействие на челове-
ка электрического тока, электрического поля, рентгеновского из-
лучения, ультрафиолетового излучения.
Действие факторов: вследствие неисправности кабеля, элек-
трической вилки (розетки) или замыкания в цепи, пользователь
компьютера попадает под напряжение.
1.1. Студенты допускаются к работе в лаборатории после про-
хождения ими вводного инструктажа с оформлением соответ-
ствующей записи в журнале по технике безопасности, первично-
го инструктажа на рабочем месте с записью в журнале по охране
труда. Инструктаж проводит заведующий лабораторией.
1.2. Запрещается оставлять рабочие места и ходить по лабора-
тории во время занятия.
1.3. Запрещается самостоятельно устранять неисправности
оборудования.
1.4. Запрещается находиться в лаборатории в верхней одежде.
2. Требования безопасности перед началом работы
2.1. К работе на стенде допускаются только лица, прошедшие
инструктаж по правилам его использования.
2.2. Необходимо проверить наличие всех составляющих рабо-
чего места стенда.
2.3. Следует убедиться в отсутствии видимых повреждений
аппаратуры и рабочего места. Визуально проверить исправность
штепсельной розетки, целостность проводов питания, штеп-
сельной вилки. О выявленной неисправности сообщить препо-
давателю.
2.4. Убрать с рабочего места лишние предметы (сумки, папки
и прочее).
2.5. Включать стенд можно только после разрешения препо-
давателя.
9
3. Требования безопасности во время работы
3.1. При работе со стендом и пользовании записями в тетра-
ди (книге) последняя должна быть хорошо освещена (не менее
400 люкс) и находиться перед клавиатурой.
3.2. При внезапном отключении электроэнергии в сети необ-
ходимо выключить стенд.
3.3. Во время эксплуатации при повреждении штепсельного
соединения, токопроводящего кабеля, появления дыма, обнару-
жении замыкания на корпус немедленно отключить стенд и до-
ложить о поломке преподавателю.
3.4. Запрещается вскрывать аппаратуру и производить ее ре-
монт.
3.5. Студенты обязаны бережно относиться к оборудованию,
вычислительной технике, раздаточному материалу, мебели.
3.6. Не использовать программные средства, не относящиеся
к теме занятия.
3.7. В случаях затруднений обращаться к преподавателю.
4. Требования безопасности в аварийной обстановке
4.1. При необходимости выключить рубильник.
4.2. Сообщить о случившемся преподавателю.
4.3. Не пользоваться стендом до полного устранения неис-
правности.
4.4. При получении травмы и внезапном заболевании немед-
ленно известить об этом руководителя.
5. Требования безопасности по окончании работы
5.1. Выключить стенд.
5.2. Привести в порядок рабочее место, сдать рабочее место
преподавателю.
5.3. Обо всех замечаниях и недостатках в работе стенда сооб-
щить преподавателю.
6. Ответственность
6.1. Ответственность за выполнение инструкции несет зав. ла-
бораторией.
10
ЛАБОРАТОРНАЯ РАБОТА № 1
АРХИТЕКТУРА СТЕНДА SDK-2.0.
ИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ
Цель работы - освоить процесс создания программного
обеспечения для стенда и порядок работы с ним.
В процессе выполнения работы необходимо изучить:
- структурную схему стенда SDK-2.0;
- состав программного обеспечения стенда;
- инструментальную среду разработки (IDE);
- программу-загрузчик;
- порядок работы со стендом.
1.1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
Общие сведения о SDKAA
Стенд представляет собой одноплатное устройство, с внеш-
ним источником питания для сети с переменным напряжением
220 В. На плате находятся (рис. 1.1):
- микроконтроллер LCP2292 на базе ядра ARM 7 TDMI;
- интерфейс пользователя, состоящий из графического
дисплея, клавиатуры и звукового излучателя;
- сетевая подсистема, включающая в себя два порта
CAN-2.0, один канал RS-485, один канал IEEE 802.15.4
и один канал Ethernet 10/100 Base-TX;
- часы реального времени и микросхема энергонезави-
симой памяти с интерфейсом 12С;
- подсистема ввода-вы вода, включающая в себя 8 кана-
лов АЦП и 20 каналов дискретного ввода-вывода.
На рисунке 1.2 приведено размещение основных элементов
на плате стенда.
11
Подсистема HMI
Г рафический ЖКИ
122x32
SDK 2.0
ОЗУ
512Кб
Микроконтроллер
LCP 2292
ARM 7 TDMI-S
Клавиатура
Звукоизлучатель
Светодиоды
Системный супервизор
EEPROM
RTC
WDT
АЦП
8 каналов
ЦАП
2 канала
Порты
дискретного
ввода-вывода
20 каналов
Рис. 1.1. Структура стенда
ЛKG
SW2 - «RESET» кнопка полного рестарта системы;
JP1 - джампер полного рестарта системы;
JP2 - «ISP» джампер перевода системы в режим ISP
Рис. 1.2. Размещение элементов на плате стенда SDK-2.0
12
Инструментальная среда разработки (IDE) pVision3
компании Keil
Рассмотрим, как в среде pVision3 создать проект, скомпи-
лировать программу и запустить отладчик. Коснемся только
самых основных моментов и возможностей. Предполагается,
что пакет программ Keil pVision3 установлен на компьютере.
Вначале необходимо создать на диске папку проекта. Путь
к проекту должен содержать наименование группы и фамилию
студента. Желательно, чтобы каждый проект находился в от-
дельной папке, например:
C:\OCPB\IBTm-1 l\Petrov\ARM_Lab-l\....
В папке проекта организовать дополнительную папку для
файлов исходных текстов на языке С (папка Source) и папку
для заголовочных файлов (папка Include). Правила, что следу-
ет помещать в заголовочные файлы, приведены в приложении.
Запуск //Vision3
Для запуска инструментальной среды разработки следует
дважды щелкнуть на иконке программы pVision3. Появится
главное окно среды. После запуска среды закрыть все су-
ществующие проекты (если таковые имеются), иначе могут
возникнуть трудности на этапе отладки программы. Для
этого в меню Project нажать Close Project.
Набор исходных текстов в среде
Исходные тексты разработанных программ могут быть
набраны в разных редакторах, в частности для набора в
pVision3 необходимо выбрать в меню File пункт New..., в
появившемся окне набрать исходный текс и сохранить его с
нужным расширением (.с, .h, ...) в соответствующих папках
проекта (Source или Include).
Создание проекта
Выберите в меню Project пункт NewProject...,
В окне диалога укажите папку, в которой будет сохранен
новый проект. В строке Имя файла введите имя проекта и
13
нажмите кнопку Сохранить. После этого появится окно выбо-
ра производителя микроконтроллера, открыть папку Philips,
выбрать тип микроконтроллера LPC2292 и нажать кнопку ОК
(рис. 1.3).
Рис. 1.3. Выбор целевого микроконтроллера
На вопрос о подключении Startup-файла ответить Да
(рис. 1.4).
Рис. 1.4. Включение в проект файла Startups
14
Файл Startup.s предназначен для начальной настройки мик-
роконтроллера в среде Keil uVision, он представляет собой
инициализирующий код на языке ассемблера. Данный код вы-
полняется при включении питания или сбросе микроконтрол-
лера и содержит следующие основные процедуры инициали-
зации:
- конфигурация системы синхронизации микропроцессор-
ного ядра и модулей системы;
- инициализация внешней шины микроконтроллера и вызов
функции REMAP;
- инициализация периферийных модулей, влияющих на ра-
ботоспособность системы;
- выделение и инициализация стека для всех режимов рабо-
ты микроконтроллера;
- инициализация данных в ОЗУ;
- передача управления в main() функцию приложения.
Стартовый код будет различным в зависимости от конкрет-
ного устройства и используемого компилятора (Startup.s
предоставляется компанией-производителем компилятора),
поэтому при настройке проекта необходимо убедиться в том,
что используется корректный файл.
В соответствии со структурой микропроцессорной систе-
мы, ее характеристиками (наличие внешней памяти, требуе-
мое быстродействие, размер стека, требуемая частота для не-
которых используемых периферийных модулей, например,
USB и т.д.) выполняется настройка параметров файла
Startup.s.
Для стенда SDK-2.0 следует выполнить настройки файла
Startup.s, представленные ниже.
15
Настройка файла Startup
Открыть файл Startup.s для редактирования и в нижней ча-
сти окна выбрать вкладку Configuration Wizard (рис. 1.5).
Рис. 1.5. Редактирование файла Startup.s
Настройка стека
Для настойки стека микроконтроллера нужно установить
значения вкладки Stack Configurations, как показано на ри-
сунке 1.6:
Option
[stack Configuration (Stack Sizes in Bytes)
Undefined Mode
Supervisor Mode
Abort Mode
Fast Interrupt Mode
Interrupt Mode
User/System Mode
S VPBDIV Setup
Value
0x0000 0004
0x0000 0004
0x0000 0004
0x0000 0004
0x0000 0080
0x0000 0400
P
Рис. 1.6. Настройка стека
16
Настройка делителя шины VPB
Схема формирования сигналов синхронизации работает от
встроенного генератора (G), реализованного на кварцевом ре-
зонаторе частотой Fosc = 12 МГц (рис. 1.7).
Рис. 1.7. Фрагмент схемы с кварцевым резонатором Y1 (12 МГц)
В основе схема лежит модуль фазовой автоподстройки ча-
стоты (PLL), который работает на частоте Fcco и вырабатывает
два тактовых сигнала: cclk - тактовый сигнал процессора и
VPB Clock (pclk) - тактовый сигнал для периферии. Частота
модуля PLL задается при помощи двух программируемых ко-
эффициентов- М (умножителя) и Р (делителя). На рисунке 1.8
приведена схема формирования тактовых сигналов.
17
Рис. 1.8. Формирование тактовых сигналов
Ограничения на величины коэффициентов и частот:
FOsc= 10 МГц-25 МГц;
Fcco= 156 МГц-320 МГц;
cclk= 10 МГц-60 МГц;
М = 1 - 32;
Р = 2,4, 8, 16;
VPBDIV = 1,2, 4.
Соотношения для тактовых частот:
М =cclk/FOsC;
P = FCCo/(FoSC*M*2);
Fcco= Fosc* M * 2 * P;
cclk =Fcco/(2*P) = M*Fosc;
VPB Clock = cclk / VPBDIV.
Задание частоты работы периферийной шины. К данной
шине (имя шины VPB) подключена вся периферия микро-
контроллера (кроме контроллера прерываний). Частота шины
задается путем деления частоты процессоры cclk (CPU Clock),
равной 48 МГц (задание cclk см. ниже в настройках PLL) на
коэффициент VPBDIV. При настойке делителя, как показано
на рисунке 1.9 (вкладка VPBDIV Setup), частота VPB Clock
(pclk) = 12МГц:
Option Value
К Stack Configuration (Stack Sizes in Bytes)
- p
VPBDIV: VPB dock VPB Clock-CPU Clock/4
XCLKDIV: XCLK Pm XCLK Pin - CPU dock / 4
ffl PIL Setup F
Рис. 1.9. Настройка делителя шины VPB
18
Настройка схемы фазовой автоподстройки частоты
Настройка схемы PLL позволяет получить из частоты квар-
цевого резонатора FosC (10 МГц + 25 МГц) требуемую частоту
работы процессора - cclk (10 МГц + 60 МГц) путем задания
коэффициентов М и Р. Значение частоты процессора выби-
рается из расчета возможностей процессора и необходимо-
стей периферии (например, продиктовано необходимостью
получения определенной скорости UART).
В стенде установлен кварцевый резонатор с Fosc = 12 МГц,
следовательно, в соответствии с рисунком 1.10 при установ-
ленных коэффициентах М (MSEL) и Р (PSEL) на вкладке PLL
Setup частота процессора составит - cclk = 48MHz:
Option Value
® Stack Configuration (Stack Sizes in Bytes)
P
MSEL: PLL Multiplier Selection
PSEL: PLL Divider Selection
4
2
S MAM Setup
Рис. 1.10. Настройка умножителя частоты
Настройка модуля ускорения памяти (МАМ)
Если модуль ускорителя памяти включен, то он пытается
считать очередную инструкцию, которая будет необходима в
следующем такте, чтобы предотвратить простой центрального
процессора.
Данный модуль позволяет увеличить производительность
микроконтроллера. Для настойки модуля ускорения памяти
нужно установить значения вкладки МАМ Setup, как показано
на рисунке 1.11.
19
Option Value
S Stack Configuration (Stack Sizes in Bytes)
S VPBOIV Setup
IS PLL Setup
- 22IEEZ!3
MAM Control
MAM Timing
S External Memory Controler (EMC)
F
P
P
Fully Enabled
4
P
Рис. 1.11. Настройка модуля ускорения памяти
Настройка контроллера внешней памяти (ЕМС)
Для контроллера ЕМС внешняя память представляется в
виде четырех банков (BankO - ВапкЗ) емкостью по 16 Мбайт
каждый. Микроконтроллер в зависимости от того, к какому
банку идет обращение, вырабатывает соответствующий сигнал
разрешения CSi.
В качестве банков могут применяться различные виды па-
мяти, а также внешние устройства с соответствующим интер-
фейсом. Каждый банк может быть активизирован с заданием
параметров соответствующего устройства. Для каждого банка
настраиваются следующие параметры: величина задержки при
переключении банков, величина удержания сигнала записи
(можно работать с медленными устройствами), работа с
8-разрядными устройствами, ширина шины данных устройств
(8, 16, 32). В стенде SDK-2.0 в адресном пространстве BankO
расположено ОЗУ с шириной шины данных 16, в адресном
пространстве Bankl - контроллер Ethernet, в Bank2 и ВапкЗ
соответственно первый и второй контроллеры графического
дисплея. Пример настройки контроллера внешней памяти на
вкладке External Memory Controller показан на рисунке 1.12:
активизирован BankO на 16 бит, Bank2 и ВапкЗ на 8 бит, у всех
банков одинаковые параметры по времени доступа.
20
g)Ette Edit tyew groject Debug Flash Peripherals loots JVCS Window tk'P
Ф Ш nil M jCs|T.net 1 3 л *
S :_j Target 1
e ts common
f) mainx
mitx
,H| interruptx
Я ta DRIVERS
lt*| systimerx
*1 kdx
Э i STARTUP
Ц Startups
□ I (U Ч) Ф
Expand Al | Colapse Al | He» |
Option
BE Stack Configuration (Stack Sues in Bytes)
ffi VPBDIV Setup
S PLL Setup
Э MAM Setup
(3 External Memory Controller (EMC)
В Bank Configuration 0 (BCFGO)
IDCY: Idle Cycles
WST1: Wait States 1
WSTZ Wait States 2
RBLE: Read Byte Lane Enable
WP: Write Protect
BM: Burst ROM
MW: Memory Width
S Bank Configuration 1 (BCFG1)
F Bank Configuration 2 (BCFG2)
IDCY: Idle Cycles
WSH: Wait States 1
WSTZ Wait States 2
WP: Write Protect
81.1- Burst ROM
MW: Memory Width
В Bank Configuration 3 (BCFG3)
IDCY: Idle Cycles
WST1: Wait States 1
WSTZ Wait States 2
RBLE: Read Byte Lane Enable
WP: Write Protect
BM: Burst ROM
MW: Memory Width
Text Ed tor Д Configuration Wizard Г
Рис. 1.12. Настройка контроллера внешней памяти
Настройка проекта
1. Для наглядности работы файлы с исходными текстами
можно размещать в различных группах. Для создания новой
группы нужно щелкнуть правой кнопкой мышки в окне
Project Workspace и в контекстном меню выбрать пункт New
Group (рис. 1.13).
21
Рис. 1.13. Создание новой группы
Н Open List File
М Open М$р File
ЕЦ Open File
|*»| Rebuild target
P l Build target F7
M Translate File
[X] -opbuM
Add Files to Group ‘Text'
£ Manage Components
Remove Group ’Text' and it’s Fites
РП Include Dependencies
Рис. 1.14. Добавление файлов в группу
22
2. Для добавления файлов в группу следует щелкнуть
правой кнопкой мышки на имени группы и в контекстном ме-
ню выбрать пункт Add Files to Group В появившемся
диалоговом окне выбрать подключаемые файлы (можно не-
сколько) и нажать кнопку Add (рис. 1.14).
3. Для того чтобы проект компилировался в НЕХ-файл,
нужно щелкнуть правой кнопкой мышки на имени проекта и в
контекстном меню выбрать пункт Options for Target
(рис. 1.15).
Project Workspace
В q a | Options for Target 'Target Г
-В
в a ii
В
Open Map File
Rebuild target
Build target
[Х, stop byild
New Group
> J Add Files to Group...
Manage Components
Pl Include Dependencies
Рис. 1.15. Переход к опциям проекта
Затем надо выбрать вкладку Output и установить флажок
Create HEX File. Нажать кнопку ОК (рис. 1.16).
23
Рис. 1.16. Задание опции компиляции в НЕХ-файл
Рис. 1.17. Указание компилятору путей для поиска заголовочных файлов
24
4. Для указания компилятору путей для поиска заголо-
вочных файлов проекта нужно открыть окно настроек проекта.
Выбрать вкладку С и нажать кнопку справа от поля
Include Paths (рис. 1.17).
В появившемся окне нажать кнопку New (Insert), а затем
кнопку (рис. 1.18). В следующем окне выбрать папку с за-
головочными файлами и нажать кнопку ОК. После того как
все пути указаны, нажать кнопку ОК и сохранить настройки
проекта (нажать кнопку ОК).
Рис. 1.18. Выбор папки с заголовочными файлами
Написание простой программы
Ниже приведен пример простого проекта, мигающего све-
тодиодом DI (Power/Status). Схема подключения светодиода
приведена на рисунке 1.19.
Проект включает два исходных файла (main.c, Icd.c) и два
заголовочных файла (led.h и Ipc2292.h). Вставьте файлы в про-
ект и загрузите в стенд.
25
/**-------------------------------------------------
Проект: SDK-2.0
Название: Головная программа.
Файл: main.c
----------------------------------------------------♦/
Рис. 1.19. Схема подключения светодиода «Powcr/Status» к порту Р0.20
микроконтроллера
Фаги main.c
#include "led.h"
/*------------------------------------------------
Функция Main
--------------------------------------------------*/
void main ( void)
26
unsigned long i;
init_led_status();// инициализация порта светодиода
while ( 1 )
{
led_status( LED_ON );// светодиод включен
for (i = 0; i < 1000; i++);// делаем задержку
led_status( LED_OFF );// светодиод выключен
for (i = 0: i < 1000; i++);// делаем задержку
}
}
Файл led.c
Проект: SDK-2.0
Название: Управление статусным светодиодом
----------------------------------------------------------------------*/
#include "lpc2292.h"
#include "led.h”
lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
// Инициализация порта статусного светодиода
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
void init_led_status( void)
{
IO0DIR |= P_20; //порт включаем на выход
}
lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
И Управление статусным светодиодом
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
void led_status ( unsigned char mode )
{
if ( mode == LED_ON )
TOOSET = P_20; И включаем светодиод
else
IO0CLR = P_20; // выключаем светодиод
}
Файл led.h
27
Проект: SDK-2.0
Название: Управление статусным светодиодом
---------------------------------------------------♦/
#ifndef_LED_H
fdefine _LED_H
#defme LED_ON 1 И светодиод включен
#define LED_OFF О И светодиод выключен
extern void init_led_status ( void );
extern void led_status ( unsigned char mode );
#endif // _LED_H
Компиляция проекта
Скомпилируйте программу, выбрав в меню Project пункт
Build Target или нажав на клавиатуре клавишу F7. Соответ-
ствующая кнопка есть и на панели инструментов (рис. 1.20).
J Budd target^
Рис. 1.20. Кнопки компиляции проекта
В процессе компиляции выявляются синтаксические ошиб-
ки, описание которых отображается в выходном окне с указа-
нием номера строки, где они обнаружены. Для быстрого пере-
хода на строку с ошибкой следует в выходном окне выделить
нужную строку и дважды щелкнуть левой клавишей мыши.
В окне исходного кода появится стрелка-указатель на эту
строку.
Перейти в режим отладки возможно только после устране-
ния всех ошибок, найденных при компиляции.
Также в процессе компиляции могут отобразиться в выход-
ном окне предупреждения, которые, впрочем, не мешают со-
28
зданию загрузочного модуля. Однако следует внимательно
проанализировать предупреждения, что позволит предупре-
дить алгоритмические ошибки, например, в операторе условия
вместо сравнения (= =) использован оператор присвоения (=).
Использование программы отладки (Debug) /Aision3
Отладчик позволяет отладить разработанный алгоритм убе-
диться в правильности его функционирования, оценить быст-
родействие и т.д.
Запуск отладчика возможен для скомпилированного проек-
та. Запуск осуществляется путем выбора в меню Debug пункта
Start/Stop Debug Session или нажатием соответствующей
кнопки на панели инструментов (рис. 1.21).
й&Н 0 < | 3 М
(Л ®
ф I * * I Г^|Start/Stop Debug Session] 3'
Рис. 1.21. Кнопка запуска/остановки отладчика
Код программы загрузится в симулятор, и будет выполнена
его часть от вектора сброса до функции main().
В окне проекта Project Workspace активной станет вкладка
Regs, на которой можно просмотреть содержимое всех реги-
стров процессора. В ней можно:
• просмотреть регистры для любого из режимов процес-
сора;
• открыть регистры CPSR и SPSR, чтобы узнать значения
флагов;
• увидеть внутренние параметры симулятора, такие как по-
траченное количество тактов и текущее время выполнения;
• изменить содержимое регистра, сделав тройной щелчок на
его значении и введя новое;
29
После входа в функцию main() для управления выполнени-
ем программы можно использовать следующие клавиши:
Fl 1 - выполнение одной строки программы,
F10 - выполнение блока или функции,
F5 - запуск программы на полной скорости,
Esc - останов программы.
Чтобы команды пошагового выполнения были доступны,
окно исходного текста программы должно быть активным.
Те же действия можно выполнить путем нажатия соответ-
ствующей кнопки на панели инструментов отладчика
(рис. 1.22). Если панель инструментов отладчика не отобража-
ется на экране, ее можно вызвать выбором пункта Debug Tool
bar в меню View.
йт •'»?: 11 Ф s: VlShO =r Л
у -.УЧУ ’-•<
Г 2 3 4'
1 - запуск программы
2 - выполнение одной строки программы
3 - выполнение блока или функции
4 - Serial Windows #1
Рис. 1.22. Панель инструментов отладчика
Задание точки останова
Поставьте курсор на строку программы, нажатием правой
клавиши мыши вызовите контекстное меню и выберите пункт
Insert/Remove Breakpoint. Нажмите F5, чтобы выполнить
профам му до этой строки.
Выполнение до определенного места программы
Это самый быстрый способ перехода к произвольному ме-
сту программы.
Поставьте курсор на строку программы, вызовите кон-
текстное меню и выберите в нем пункт Run to Cursor line.
После этого программа будет выполняться до тех пор, пока не
достигнет указанной строки.
30
Просмотр значений переменных
В окне исходного текста установите курсор на переменную
i. Вызовите контекстное меню и выберите в пункте Add “i” to
Watch Window...подпункт#! (рис. 1.23).
П О\ММ\МарГТУ\<
01
02
03
04
05
06
07
08
09
10
11
12
Проект:
Наэвамт
Файл:
SDK-2. |
Головш
Min.cl
Show Disassembly at 0x1 AE
Set Program Counter
Insert '«include < LPC22xx.H>'
•( } Run to Cursor line
«include <led.h>
Go To Line
5^ Insert/Remove Breakpoint
F Enable/Disable Breakpoint
Clear complete Code Coverage Info
|l3 void main(void)
1401
Go To Definition Of 'i‘
Go To Reference To
15
I16
|l7
18
I19
21
123
24
unsigned long :
inic_led_statu:i
while ( T )
led_scacus( LI
for ( 1 - 0; ;
led_stacus( LI
Add "i” to Watch Window-
Execution Profiling
Outlining
Advanced
Функгуо» Mam
for ( 1 " 0; t
Рис. 1.23. Выбор переменной для вывода в окно значений
Чтобы увидеть значение переменной в меню View, выбери-
те Watch & Call Stack Window и в окне Watches перейдите к
вкладке Watch #1 (рис. 1.24). Локальные переменные находят-
ся на вкладке Locals.
dype F2to edt>
1 Value
|\ Locals Д Watch #1 Д Watch «2 Д Cal Stack / r —-
' '' ----- '*______ Fi^hiMflHKNH - P.
Рис. 1.24. Окно вывода значений переменных
31
Просмотр содержимого ячеек памяти
Выбрав в меню View пункт Memory Window, откройте ок
но просмотра памяти (рис. 1.25).
Рис. 1.25. Окно содержимого памяти
Просмотр встроенных периферийных устройств
Откройте несколько окон из меню Peripherals (рис. 1.26
1.27).
Рис. 1.26. Окно векторов контроллера прерываний
32
Рис. 1.27. Окно регистров порта РО
Важное замечание!
При отладке могут возникнуть затруднения, связанные:
1) с подачей сигналов на внешние входы микроконтроллера;
2) отображением выходных сигналов, подаваемых на
внешние выводы микроконтроллера;
3) обработкой прерываний по событиям на внешних входах
и от встроенных контроллеров;
4) симуляцией работы некоторых строенных контроллеров.
Преодолеть отмеченные трудности возможно различными
путями, в частности:
1) внешние сигналы можно подавать путем установки О
или 1 (установкой галочки) на входах Pins в соответствующем
окне порта ввода/вывода;
2) выходные сигналы можно посмотреть в соответствую-
щих окнах портов ввода/вывода только в пошаговом режиме
или в режиме останова программы. Чтобы посмотреть измене-
ния выходного сигнала в процессе выполнения программы,
можно перенаправить его в последовательный порт (если он
не занят) путем записи в регистр SBUFi;
3) обработка внешнего прерывания зависит от типа вызо-
ва прерывания - по фронту или уровню входного сигнала. Ес-
ли прерывание вызывается фронтом входного сигнала (пере-
падом из 1 в 0), то переход на подпрограмму обработки
прерывания можно выполнить путем последовательной уста-
новки и сброса соответствующего бита порта ввода/вывода;
33
4) обработка прерываний от встроенных контроллеров за-
висит от того, поддерживает ли IDE соответствующий встро-
енный блок.
В отладчике есть много других функций, тем не менее, рас-
смотренных выше функций будет достаточно для выполнения
практических упражнений.
Загрузка исполняемого модуля
Для доставки исполняемого модуля в стенд SDK-2.0 необ-
ходима специальная программа LPC2000 Flash Utility, постав-
ляемая бесплатно фирмой Philips. Запустите программу
(рис. 1.28).
Рис. 1.28. Программа загрузки микроконтроллера
Дня загрузки модуля необходимо выполнить следующее:
1. Установите перемычку ISP mode на стенде и перезапу-
стите SDK-2.0.
2. Выберите файл с вашим загрузочным модулем в формате
HEX.
3. Выберите тип микроконтроллера (LPC2292).
34
4. Нажмите кнопку Read Device ID и убедитесь в том, что
связь со стендом работает.
5. Нажмите кнопку Upload to Flash.
6. Дождитесь окончания загрузки и снимите перемычку ISP
mode.
7. Перезапустите стенд SDK-2.0.
Перед работой необходимо подключить стенд к сети -220В
через адаптер питания и подключить его к ПК с помощью ка-
беля RS-232.
Все программы для микроконтроллеров, ПО которых не
управляется операционной системой, должны либо «завер-
шаться» бесконечным циклом, либо строиться таким образом,
чтобы они работали по бесконечному алгоритму. В противном
случае при окончании программы процессор начнет неконтро-
лируемую выборку данных из памяти и будет интерпретиро-
вать их как команды, что может вызвать нежелательные по-
следствия или даже привести к выходу устройства из строя.
Поэтому, если программа должна выполнять конечное число
циклов, ее необходимо завершить оператором while(l); или
for(;;);.
1.2. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
1. Изучите структурную схему стенда SDK-2.0. Восполь-
зуйтесь комплектом документации к SDK-2.0 и данным
пособием.
2. Изучите описание инструментального программного
обеспечения. Воспользуйтесь руководством пользовате-
ля SDK-2.0 и справочной системой Keil Software.
3. Изучите структуру примера программы на языке С.
4. Изучите порядок работы с загрузчиком.
5. Подключите стенд к компьютеру. Включите стенд.
6. Создайте проект. Задайте опции файла Startup.s (частоту
процессора, рабочие банки системы), данные получите у
преподавателя.
35
7. Оттранслируйте пример простейшей программы и загрузи-
те ее в SDK-2.0.
8. Внесите ошибки в простейшую программу и попробуйте ее
оттранслировать.
9. Скомпилируйте и загрузите программу в симулятор
Debugger. Изучите процесс отладки программ в симуляторе.
1.3. СОДЕРЖАНИЕ ОТЧЕТА
Для написания отчета необходимо изучить предложенную ли-
тературу. Отчет должен содержать:
- описание учебного комплекса:
• архитектуры стенда;
• аппаратных блоков стенда;
- описание инструментария:
• процесса загрузки;
• опций компилятора;
• возможностей отладчика (симулятора);
- исходный текст программы с комментариями.
1.4. КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Поясните структуру стенда SDK-2.0.
2. Зачем ставить while(l); или while(l) {} в программу?
3. Что такое интегрированная среда разработки IDE?
4. Что такое НЕХ-файл?
5. Какие функции есть у отладчика?
6. Какие источники синхросигнала могут быть использованы
в микроконтроллере LPC2292?
7. Перечислите изменяемые пользователем параметры, опре-
деляющие частоту синхронизации микропроцессорного яд-
ра микроконтроллера LPC2292.
Учебно-методическое обеспечение
1. Учебный стенд SDK-2.0. Руководство пользователя.
2. LPC21 хх Инструкция пользователя.pdf.
3. Мясников В. И. Проектирование встраиваемых микропроцессор-
ных систем: учебное пособие. Йошкар-Ола: МарГТУ, 2010. 400 с.
36
ЛАБОРАТОРНАЯ РАБОТА № 2
ДИСКРЕТНЫЕ ПОРТЫ ВВОДА/ВЫВОДА
Цель работы - освоить методы работы с портами общего
назначения (GPIO).
В процессе выполнения работы необходимо изучить:
- аппаратную часть:
• структуру процессора;
• адресное пространство процессора;
• схему порта;
• принципиальные схемы отдельных блоков стенда;
- программную часть:
• организацию ввода дискретной информации;
• организацию вывода дискретной информации.
2.1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
Структура микроконтроллера и карта памяти
Структура микроконтроллера приведена на рисунке 2.1.
LPC2292 состоит из ARM7TDMI-S центрального процессора,
локальной шины ARM7 для контроллера встроенной памяти,
скоростной шины (АНВ), к ней подключены контроллер пре-
рываний и контроллера внешней шины, периферийной шины
VPB, к которой подключена остальная периферия. Шина VPB
соединяется с шиной АНВ через мост.
Карта памяти LPC2292 содержит несколько различных об-
ластей памяти, показанных на рисунке 2.2.
АНВ периферия размещена в 2-мегабайтовом диапазоне ад-
ресов в самой вершине 4-гигабайтного адресного пространства
ARM. Каждое АНВ периферийное устройство занимает 16 ки-
лобайт в адресном пространстве АНВ. VPB периферия также
размещена в 2-мегабайтовом диапазоне адресов, начинающих-
37
ся с адреса 3.5 Гб. Каждое VPB периферийное устройство за-
нимает 16 килобайт в адресном пространстве VPB.
Рис. 2.1. Структура микроконтроллера
Встроенное статическое ОЗУ LPC2292 содержит 16 КБ, в
котором могут размещаться как данные, так и программы.
СОЗУ поддерживает 8-разрядный, 16-разрядный и 32-
разрядный доступ.
Встроенная система FLASH памяти LPC2292 включает
256 кБ. Эта память может использоваться также для хранения
38
данных и кода программ. Программирование Flash памяти
может быть выполнено несколькими способами: по встроен-
ному последовательному интерфейсу JTAG, используя ISP и
UART0, или непосредственно из выполняющейся программы.
Прикладная программа, используя IAP функции, может также
стереть и/или программировать Flash, во время выполнения
программы, предоставляя большую степень гибкости для хра-
нения данных, модернизации программного обеспечения и т.д.
4.0 ГБ
3.75 ГБ
3.5 ГБ
2.0 ГБ
АНВ периферия
VPB периферия
Зарезервировано
для внешней памяти
OxFFFFFFFF
OxFOOOOOOO
ОхЕООООООО
Загрузочный блок
(переопределен на внутреннюю flash)
0x80000000
Зарезервировано
для внутренней памяти
1.0 ГБ
0.0 ГБ
16 КБ внутреннее СОЗУ
Энергонезависимая
встроенная память на 256 КБ
0x40003FFF
0x40000000
0x00040000
0x0003FFFF
0x00000000
Рис. 2.2. Карта адресного пространства микроконтроллера
39
Дискретные порты ввода-вывода
Дискретные (цифровые) порты используются для вво-
да/вывода дискретных значений - логического «О» или «1».
Порты ввода/вывода общего назначения (General Purpose
Input Output - GPIO) предназначены для обмена данными либо
для управления внешними устройствами. Каждый из портов
может быть настроен как на передачу, так и на прием инфор-
мации. По наличию сигнала (или фронта сигнала) на некото-
рых портах, можно установить прерывание.
Альтернативная функция
Рис. 2.3. Схема двунаправленного порта с двухтактным выходом
Порты ввода/вывода микроконтроллера LPC2292 подклю-
чены к шине периферийных устройств, т.е. быстродействие
переключения портов определяется частотой периферийной
шины (pclk).
40
Кроме исполнения функции порта ввода/вывода, внешние
выводы микросхемы могут быть задействованы для связи с
внутренними периферийными модулями микропроцессора, а
также с подсистемами процессорного ядра, схем памяти и
управления (с контроллером прерываний, блоком интерфейса
внешней памяти и т.п.). Данные функции называются альтер-
нативными. Обычно, когда вывод порта используется для вы-
полнения альтернативной функции, основные схемы перево-
дятся в состояние ввода или вообще отключаются.
На рисунке 2.3 представлена схема двунаправленного порта
с двухтактным выходом.
Данная схема может работать в режиме ввода или вывода.
Переключение порта в режим ввода осуществляется записью
«1» в регистр «направления порта». В этом случае оба транзи-
стора переводятся в закрытое состояние и порт вывода не вли-
яет на входной сигнал. В двунаправленных портах резисторы
pullup и pulldown подключаются только в режиме ввода, для
чего на вход соответствующей схемы управления подключает-
ся выход регистра «направления порта» («1» - ввод).
Настройка портов ввода/вывода МК LPC2292
Микроконтроллер LPC2292 имеет четыре порта (РО. PI, Р2,
РЗ), каждый из которых содержит 32 линии ввода/вывода. Для
настройки портов ввода/вывода на необходимую функцию в
микроконтроллере LPC2292 используется блок конфигуриро-
вания выводов.
Практически каждый вывод микроконтроллера имеет 2-4
функции. Например, вывод 42 (рис. 2.4) может быть разрядом
порта ввода/вывода общего назначения GPIO (Р0.0), линией
передачи UARTO (TxDO) или выходом для ШИМ1 (PWM1).
Для назначения одной из этих функций используется данный
блок. Этот блок содержит 3 регистра: PINSELO, PINSEL1,
PINSEL2. Описание данных регистров приведено в табли-
41
це2.1. Конфигурирование порта РО разрядами регистра
PINSEL0 представлено в таблице 2.2.
P2 27/D27/BOOT1 I ПГ
Р228Л3281 17
Р229/029 I 18
Р2 30/D30/AIN4 I 1S
Р2 31/D31/AIN5 I 20
РО 25/RO1 I 21
TD1 I 22
РО 27/A1NO/CAPO VMAT0 1 I 23
PI 17/TRACEPKT1 I 24
РО 28/A1N1/CAP0 2/МАТО 2 I 25
VSSI 26
РЗ 29/BLS2/AIN6 | 27
РЗ 28/BLS3/AIN7 I 28
РЗ 27/WE I 29
P326/CS1 Г 30
УЗ Г 31
РО 29/AIN2/CAP0 3/МАТО 3 I 32
РО 3O/AIN3/EINT3/CAPO О I 33
PI 16HRACEPKT0 I ЗГ~
P325/CS2I______2Ь_
P324/CS31 35
iiiwi
ВгдйгггггВ^ яг г
я .2 £ I « г
Рис. 2.4. Назначение некоторых выводов микроконтроллера LPC2292
Таблица 2.1
Регистры блока конфигурирования выводов
Название Описание Значение после сброса
P1NSELO Регистр 0 конфип рирования для порта Р0(0-15) 0x00000000
PINSEL1 Регистр 1 конфигурирования для порта РО( 16-31) 0x15400000
PINSEL2 Регистр 2 конфигурирования для порта Р1 (16-31). Р2(О-31). РЗ (0-31) В зависимости от порта
42
Таблица 2.2
К'оифшурироваиис порта РО разрядами регистра PINSEL0
PINSEL0 Pin Name Function when 00 Function when 01 Function when 10 Function when 11 Reset Value
1:0 РО.О GPIO Port 0.0 TxD (UART0) PWM1 Reserved 00
3:2 Р0.1 GPIO Port 0.1 RxD (UART0) PWM3 EINTO 00
5:4 Р0.2 GPIO Port 0.2 SCL (l2C) Capture 0.0 (TIMER0) Reserved 00
7:6 РОЗ GPIO Port 0.3 SDA (l2C) Match 0.0 (TIMER0) EINT1 00
9:8 Р0.4 GPIO Port 0.4 SCK (SPIO) Capture 0.1 (TIMER0) Reserved 00
11:10 Р0.5 GPIO Port 0.5 MISO (SPIO) Match 0.1 (TIMER0) Reserved 00
13:12 Р0.6 GPIO Port 0.6 MOSI (SPIO) Capture 0.2 (TIMER0) Reserved 00
15:14 Р0.7 GPIO Port 0.7 SSEL (SPIO) PWM2 EINT2 00
17:16 Р0.8 GPIO Port 0.8 TxD UART1 PWM4 Reserved 00
19:18 Р0.9 GPIO Port 0.9 RxD(UARTI) PWM6 EINT3 00
21:20 РОЮ GPIO Port 0.10 RTS(UARH) Capture 1.0 (TIMER1) Reserved 00
23:22 Р0.11 GPIO Port 0.11 CTS (UART1) Capture 1.1 (TIMER1) Reserved 00
25:24 Р0.12 GPIO Port 0.12 DSR(UARH) Match 1.0 (TIMER1) Reserved 00
27:26 Р0.13 GPIO Port 0.13 DTR (UART1) Match 1.1 (TIMER1) Reserved 00
29:28 Р0.14 GPIO Port 0.14 CDIUART1) EINT1 Reserved 00
31:30 Р0.15 GPIO Port 0.15 RI(UART1) EINT2 Reserved 00
Таблица 2.3
Конфигурирование порта РО ра грядами регистра PINSEL1
PINSEL1 Pin Name Function when 00 Function when 01 Function when 10 Function when 11 Reset Value
1:0 Р0.16 GPIO Port 0.16 EINTO Match 0.2 (TIMER0) Capture 0.2 (TIMER0) 00
3:2 Р0.17 GPIO Port 0.17 Capture 1.2 (TIMER 1) SCK(SPI1) Match 1.2 (TIMER1) 00
5:4 Р0.18 GPIO Port 0.18 Capture 1.3 (TIMER1) MISO (SPI1) Match 1.3(TIMER1) 00
7:6 Р0.19 GPIO Port 0.19 Match 1.2 (TIMER1) MOSI (SPI1) Match 1.3 (TIMER1) 00
9:8 Р0.20 GPIO Port 0.20 Match 1.3(TIMER1) SSEL (SPI1) EINT3 00
11:10 Р0.21 GPIO Port 0.21 PWM5 Reserved Capture 1.3 (TIMER1) 00
13:12 Р0.22 GPIO Port 0.22 Reserved Capture 0.0 (TIMER0) Match 0.0 (TIMER0) 00
15:14 Р0.23 GPIO Port 0.23 RD2 (CAN Controller 2) Reserved Reserved 00
17:16 Р0.24 GPIO Port 0.24 TD2 (CAN Controller 2) Reserved Reserved 00
19:18 Р0.25 GPIO Port 0.25 RD1 (CAN Controller 1) Reserved Reserved 00
21:20 Р0.26 Reserved 00
23:22 Р0.27 GPIO Port 0.27 AINO (A/D Converter) Capture 0.1 (TIMER0) Match 0.1 (TIMER0) 01
25:24 Р0.28 GPIO Port 0.28 AIN1 (A/D Converter) Capture 0.2 (TIMER0) Match 0.2 (TIMER0) 01
27:26 Р0.29 GPIO Port 0.29 AIN2 (A/D Converter) Capture 0.3 (TIMER0) Match 0.3 (TIMER0) 01
29:28 РОЗО GPIO Port 0.30 AIN3 (A/D Converter) EINT3 Capture 0.0 (TIMER0) 01
31:30 Р0.31 Reserved 00
В таблице 2.4 приведена часть таблицы конфигурирования
портов Pl, Р2 и РЗ разрядами регистра P1NSEL2. Пояснение к
таблице: Pins Р2.7:0 означает выводы портов с Р2.7 по Р2.0
включительно.
Как видно из таблицы 2.1, регистры PINSEL0 и PINSEL1 от-
вечают за конфигурирование порта РО, а регистр PINSEL2 - за
конфигурирование портов Pl, Р2 и РЗ.Это связано с тем, что
порты Pl, Р2 и РЗ используются для таких альтернативных
функций, как внешняя шина, интерфейсы отладки и т.д., кото-
рые конфигурируются сразу для большого числа портов одно-
временно. Например, при работе с внешней шиной конфигури-
руются сразу шина адреса, шина данных и шина управления.
Регистры PINSEL0 и PINSEL1 на конфигурирование каждо-
го разряда порта РО выделяется по 2 бита, например, содержи-
мое регистра PINSEL0 для вывода 42 (порт Р0.0) может конфи-
гурироваться (табл. 2.2) как GPIO PortO.О (1:0 установлены 00)
или как TxD UART0 (0:1 =01), или как PWM1 (0:1 = 10).
Как видно из таблицы 2.4, биты 5 и 4 отвечают за конфигу-
рацию сразу нескольких выводов. Так, выводы с Р2.27 по
Р2.16 (Pins Р2.27:16) конфигурируются как порты вво-
да/вывода общего назначения при битах 5:4 регистра
P1NSEL2, равных 00, 01, 11, или как разряды внешней шины
данных с D27 по D16 при битах 5:4, равных 10.
При сбросе блок управления выводами конфигурирует все
выводы как входы портов общего назначения.
Когда выводы сконфигурированы как порты ввода/вывода
общего назначения, работа с ними осуществляется при помощи
четверки регистров для каждого порта: lOiPIN, lOiSET, JOiDIR,
lOiCLR. Например, порт Р0 управляется регистрами IO0PIN,
IO0SET, IO0DIR, IO0CLR. Каждый вывод порта управляется
соответствующим битом регистров четверки. Эти биты опреде-
ляют направление передачи данных, используются для установ-
ки или сброса вывода, а также отражают его состояние.
45
Таблица 2.4
Конфтлрирование портов Pl, Р2, РЗ разрядами регистра PINSEL2
P1NSEL2 Описание Значение после сброса
1:0 Зарезервировано 00
2 = 0, выводы Р 1.36:26 используются как порты ввода/вывода общего назначе- ния = 1, Р1.31:26 26 используются как Debug порт P1.26/RTCK
3 = 0, выводы Р 1.25:16 используются как порты ввода вывода общего назначения = 1, выводы Р1.25:16 используются как Trace порт Р1.20/ TRACESYNC
5:4 PinsP2.7:0 11=Р2.7:0 0xorl0 = D7:0 PinPl.O 11 = Р1.0 0xorl0 = CS0 Pin Pl .1 11 = P1.1 OxorlO = OE Pin P3.31 11 = P3.31 Ox or 10 = BLSO PinsP2.15:8 00 or 11 = P2.15:8 01orl0 = D15:8 PinP3.30 00orll=P3.30 01orl0 = BLSl Как в 1:0
PinsP2.27:16 Ox or 11 = P2.27:16 10 = D27:16 Pins P2.29:28 Ox or 11= P2.29:28 or Reserved 10 = D29:28 Pins P2.31:30 Ox or 11 = P2.31:30or AIN5:4 10 = D31:30 Pins P3.29:28 Ox or 11 = P3.29:28or AIN6;7 1O = BLS2:3
6 Если биты 5:4 не равны 10. то бит управляет выводом Р3 .29: = 0, Р3.29 - порт общего назначения, = 1, Р3.29 - аналоговый вход AIN6. 1
Продолжение табл. 2.4
PINSEL2 Описание Значение после сброса
7 Если биты 5:4 не равны 10, то бит управляет выводом Р3.28: = 0, вывод Р3.29 - порт общего назначения. = 1, вывод Р3.29 - аналоговый вход AIN7. 1
8 = 0. вывод Р3.27 используется как порты ввода вывода общего назначения = 1, вывод Р3.27 используются как WE 0
10:9 Зарезервировано -
11 = 0, вывод Р3.26 используется как порты ввода/вывода общего назначения = 1, вывод Р3.26 используются как CS1 0
12 Зарезервировано -
13 Если биты 25:23 не равны 111, то бит управляет выводом Р3.28: = 0, вывод Р3.23 - порт общего назначения, = 1. вывод P3.23-XCLK. 0
15:14 = 00, вывод Р3.25 - порт общего назначения, = 01, вывод Р3.25 - CS2, = 10, = 11 - зарезервировано 00
17:16 = 00, вывод Р3.24 - порт общего назначения. = 01, вывод P3.24-CS3, = 10, = 11 - зарезервировано 00
19:18 Зарезервировано -
Окончание табл. 2.4
PINSEL2 Описание Значение после сброса
20 Если биты 5:4 не равны 10, то бит управляет выводами Р3.29: 28 = 0. выводы Р3.29:28 - порты общего назначения. = 1, зарезервировано. 0
21 Если биты 5:4 не равны 10, то бит управляет выводом РЗ.ЗО = 0, вывод РЗ.ЗО - порт общего назначения. = 1. вывод РЗ.ЗО - аналоговый вход AIN4. 1
22 Если биты 5:4 не равны 10, то бит управляет выводом Р3.31 = 0, вывод Р3.31 - порт общего назначения, = 1, вывод РЗ.31 - аналоговый вход AIN5. 1
23 = 0. вывод Р3.0/А0 используются как порт ввода/вывода общего назначения = 1. вывод Р3.0/А0 используются как адресная линия АО
24 = 0. вывод Р3.1/А1 используются как порт ввода вывода общего назначения = 1. вывод Р3.1/А1 используются как адресная линия А1
27:25 Управление количеством адресных линий на выводах P3.23/A23/XCLK и Р3.22:2/А22:2 000 = нет управления ЩА; 100 = Al 1:2 - адресные линии; 001 = АЗ :2 - адресные линии; 101 = А15:2 - адресные линии; 010 = А5:2 - адресные линии; 110 = А19:2 - адресные линии; 011 = А7:2 - адресные линии; 111= А23:2 - адресные линии;
31:28 Зарезервировано -
Биты регистра IODIR позволяют индивидуально конфигу-
рировать каждый вывод в качестве входа (0) или выхода (1).
Если вывод является выходом, его состоянием можно управ-
лять с помощью регистров IOSET и IOCLR. Запись 1 в биты
этих регистров приводит к установке или сбросу соответству-
ющего вывода.
Внимание', для сброса вывода необходимо в бит регистра
IOCLR записать 1, а не 0.
Состояние вывода GPIO можно определить в любой мо-
мент, считав содержимое регистра IOPIN.
В таблице 2.5 представлено описание вышеперечисленных
регистров:
Таблица 2.5
Регистры управления портами общего назначения
Название Описание
lOiPIN Текущее состояние выводов i-ro порта (i =О...З).
lOiSET Управляет состоянием выводов, настроенных на выход. Установ- ка “1” в бите регистра переводит соответствующий вывод i-ro порта в единичное состояние. Установка “0” не оказывает ника- кого эффекта.
IGiDIR Задает направление каждого вывода i-ro порта ввода/вывода: “0” - входной, “1”- выходной.
IQiCLR Управляет состоянием выводов, настроенных на выход. Установ- ка “1” в бите регистра сбрасывает соответствующий вывод i-ro порта. Установка “0” не оказывает никакого эффекта.
Пример
В заголовочном файле lpc2292.h двадцатый разряд 32-
разрядного числа определен как
#define Р_20 0x00100000L.
Возможные операции настройки, установки, сброса и чтения 20-го
разряда порта РО:
IOODIR |= Р_20; //порт Р0.20 включаем на выход
IOOSET = Р_20; // порт Р0.20 устанавливаем в состояние «1»
IO0CLR = Р_20; // порт Р0.20 сбрасываем в состояние «0»
IOODIR &= ~Р 20; //порт Р0.20 включаем на вход
49
if (IOOPIN & P_20)... // если на входе порта Р0.20 состояние «1» ..
Рассмотрим схемы подключения светодиодов и переключа-
телей к портам ввода/вывода стенда SDK-2.0.
На рисунке 2.5 представлен фрагмент принципиальной
схемы стенда, на котором отображен принцип управления све-
тодиодами. Светодиоды управляются как отдельными сигна-
лами (KB_LED_COLO ... KB_LED_COL3), так и сигналами
разрешения (LED_ROWO и LED_ROW1), управляющими
группами светодиодов.
1K
RP29
KB LED COLO
KB LED COL1
kB-LEETddiJ:
КВ LED COLO
кв . :l'
7 • -
D17 H*L-34GD
КВ LED COL2
LED R0W1
D19
tSJ D20
dTT
RP30
1K
~Р18~
C34GD
RP31 ЮК
ВС817 ЗС817
L-34GD
L-34GD
L-34GD
Рис. 2.5. Фрагмент схемы управления светодиодами
UI-* ,
тяге-! AL-M&C)'
На рисунке 2.6 представлен фрагмент принципиальной
схемы, на котором показано подключение сигналов
KB_LED_COLO ... KB_LED_COL3 и LED.ROWO,
LED_ROW1 к портам микроконтроллера.
Чтобы зажечь светодиод, необходимо:
1) сконфигурировать соответствующий порт на выход
(сигналы KB_LED_COLO ... KB_LED_COL3 подклю-
чены к портам Р2.16 ... Р2.19 соответственно; сигналы
50
LED_ROWO и LED_ROW1 подключены к Р2.20 и Р2.21
соответственно);
2) подать на порт, к которому подключен светодиод, еди-
ничный уровень сигнала;
3) разрешить соответствующую четверку путем подачи
единичного сигнала в порт Р2.20 или Р21.
51
На рисунке 2.7 представлен фрагмент принципиальной
схемы, содержащей два DIP переключателя: SW3, состоящий
из 4-х независимых переключателей, и SW4 из 8-и переключа-
телей. Состояние переключателей может быть прочитано мик-
роконтроллером: сигналы Р0 04, ..., Р2 28, ... подключены к
соответствующим портам микроконтроллера - Р0.4, . . . , Р2.28
... , а также выведены на внешний разъем J2. На рисунке 2.8
показана схема более детальная схема одного переключателя.
Рис. 2.7. Фрагмент схемы подключения переключателей SW3 и SW4
Рис. 2.8. Схема подключения одного переключателя
52
Данные DIP переключатели позволяют задавать фиксиро-
ванные значения сигналов на входах. При разомкнутом пере-
ключателе вход микроконтроллера будет притянут к логиче-
ской единице (через резистор на +3,ЗВ). При замыкании
переключателя (как показано на рис. 2.8) на соответствующем
входе микроконтроллера появляется логический ноль.
2.2. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
1. Изучите структурную схему и карту адресного про-
странства микроконтроллера.
2. Изучите схему порта ввода/вывода.
3. Изучите регистры конфигурирования портов микро-
контроллера.
4. Изучите регистры управления портами ввода/вывода
общего назначения.
5. Изучите принципиальную схему подключения светодио-
дов к микроконтроллеру.
6. Изучите принципиальную схему подключения переклю-
чателей к микроконтроллеру.
7. Разработайте блок-схему вывода данных на линейку све-
тодиодов (ЛС: D14...D21) в зависимости от информации
на переключателе SW4 (см. табл. 2.6). Информацию за-
давать движками 16...9 (в табл. 2.6 обозначены как
S0...S7) переключателя SW4, тем самым подавая О (ON)
или 1 (OFF) на порты Р2.28... РЕП микроконтроллера.
8. Напишите программу по составленному алгоритму.
9. Откомпилируйте ее, создайте загрузочный файл.
10. Проверьте работоспособность алгоритма в Debug.
И. Подключите стенд к PC, подайте питание, загрузите
файл в стенд.
12. После утверждения результатов работы преподавате-
лем напишите отчет.
53
Таблица 2.6
Задания для лабораторной работы
№ варианта Задание
1 Если S7...S0 - 01010101, то ЛС выключена. Если S7...S0 = 00011000, то на ЛС перемещающийся включенный св/д сверху вниз. Остальные комбинации не влияют на текущее состояние ЛС.
2 Если S7...S0 = 10101010, то на ЛС включены соответствующие светодиоды; если S7...S0 - 10000001, то на верхней четверке пере- мещающийся выключенный св/д снизу вверх. Остальные комби- нации не влияют на текущее состояние ЛС.
3 Отобразить на ЛС в двоичном коде (младший разряд снизу) коли- чество установленных в «1» разрядов на S7...S0
4 Отобразить на ЛС в двоичном коде (младший разряд снизу) коли- чество сброшенных в «0» разрядов на S7...S0
5 Если S7...S0 = 11001100, то на ЛС поочередно загораются четвер- ки светодиодов D17-D14hD21 - D18. Остальные комбинации не влияют на текущее состояние ЛС.
6 Если S7...S0 =11111100, то на ЛС светодиоды D17 - D14 отобра- жают работу двоичного счетчика по модулю 16. Изменение состо- яния S7...S0 останавливает счетчик
7 При любом изменении состояния S7...S0 перемещать один за- жженный светодиод на ЛС сверху вниз
8 При любом изменении состояния S7...S0 перемещать один за- жженный светодиод на ЛС снизу вверх
9 При увеличении количества установленных в «1» S7...S0 пере- мещать один зажженный светодиод на ЛС сверху вниз
10 При уменьшении количества установленных в «1» S7...S0 пере- мещать один зажженный светодиод на ЛС снизу вверх
И Если S7...S0 = 11111111, то на ЛС включен нижний светодиод. Если S7...S0 - 10011001, то на ЛС отобразить мигающие чередую- щиеся включенные и выключенные светодиоды. Остальные ком- бинации не влияют на текущее состояние ЛС.
12 На D17 - D14 отобразить 0000, если S3...SO <= S7...S4, и 1111, если S3...S0 > S7...S4
13 На D21 - D18 отобразить 0101, если S3...SO == S7...S4, и 0101, если они не равны
14 На D17 - D14 отобразить результат поразрядной операции (S3...SO) & (S7...S4)
15 На D21 - D18 отобразить результат поразрядной операции (S3...S0) л (S7...S4)
54
2.3. СОДЕРЖАНИЕ ОТЧЕТА
Для написания отчета необходимо изучить литературу,
предложенную в конце раздела.
Отчет должен содержать:
- описание архитектуры:
• используемой аппаратной части;
-описание программной части:
• блок-схему программы работы со светодиодами по
заданному алгоритму;
• исходный текст программы.
2.4. КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Рассчитать ограничивающий резистор светодиода.
2. Рассчитать потенциал на входе микроконтроллера при
замкнутом и разомкнутом переключателе (см. рис. 2.8).
3. Какая конфигурация у портов микроконтроллера при вклю-
чении питания?
4. В чем заключается отличие шины АНВ от шины VPB?
5. Как настроить микроконтроллер для работы с внешней па-
мятью?
Учебно-методическое обеспечение
1. Учебный стенд SDK-2.0. Руководство пользователя.
2. LPC2xxx. Руководство пользователя.
3. Мясников В.И. Проектирование встраиваемых микропроцессор-
ных систем: учебное пособие. Йошкар-Ола: МарГТУ, 2010. 400 с.
4. Программа-терминал Terminal.exe.
55
ЛАБОРАТОРНАЯ РАБОТА № 3
ТАЙМЕРЫ. КОНТРОЛЛЕР ПРЕРЫВАНИЙ
Цель работы - освоение принципов функционирования
таймеров, организации обработки прерываний.
В процессе выполнения работы необходимо изучить:
- аппаратную часть:
• структуру таймеров микроконтроллера;
• структуру контроллера прерываний;
- программную часть:
• программирование режимов таймера;
• программирование контроллера прерываний;
• принципы обработки прерываний;
• включение процедуры обработки прерывания в
программу.
3.1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
Таймеры/счетчики
Микроконтроллер имеет два (ТО и Т1) идентичных 32-
разрядных таймера.
Каждый таймер предназначен для подсчета тактов синхро-
сигнала периферии (pclk). В схему таймера включены модуль
совпадения и модуль захвата, которые могут генерировать
сигналы запросов прерывания.
Имена регистров таймеров, которые использует заголовоч-
ный файл lpc2292.h, приведены в таблице 3.1.
Структурная схема таймера ТО представлена на рисунке 3.1.
Так как описание будет относиться к обоим таймерам, имя
таймера в имени регистров будем опускать.
32-битовый счетчик таймера (ТС) увеличивается, когда
счетчик предварительного делителя (PC) достигает своей ко-
нечной величины. Если он не сброшен до достижения своего
предела, то счетчик таймера после значения OxFFFFFFFF при-
56
мет значение 0x00000000. Это событие не вызовет прерыва-
ния, однако если необходимо обнаруживать такие ситуации, то
может использоваться регистр совпадения.
Таблица 3.1
Имена регистров таймеров
Регистры таймера ТО Регистры таймера Т1
T0IR T1IR
T0TCR T1TCR
ТОТС Т1ТС
T0PR T1PR
ТОРС Т1РС
T0MCR T1MCR
T0MR0 T1MR0
T0MR1 T1MR1
T0MR2 T1MR2
T0MR3 T1MR3
T0CCR T1CCR
T0CR0 T1CR0
T0CR1 T1CR1
T0CR2 T1CR2
T0CR3 T1CR3
T0EMR T1EMR
32-разрядный счетчик предварительного делителя делит ча-
стоту pclk на заданный коэффициент и передает ее на счетчик
таймера. Счетчик предварительного делителя увеличивается
по каждому импульсу pclk. Когда он достигает значения со-
храненного в регистре предварительного делителя (PR), счет-
чик таймера увеличивается, а счетчик предварительного дели-
теля сбрасывается на следующем импульсе pclk. Таким
образом, счетчик таймера увеличивается по каждому импульсу
pclk, если регистр предделителя = 0, и на каждые 2 импульса
pclk, если регистр предделителя = 1, и т.д.
Регистр управления таймером (TCR) используется, чтобы
управлять функциями счета таймера. Таймер может быть
остановлен или перезагружен через этот регистр. TCR имеет
два разряда (табл. 3.2).
57
Рис. 3.1. Структурная схема таймера/счетчика ТО
Регистр управления таймером - TCR
Таблица 3.2
Бит Функция Описание
0 Разрешение счета = 1: счетчик таймера и счетчик предваритель- ного делителя разрешены; = 0: счетчики запрещены.
1 Сброс счетчиков Сброс счетчиков. После установки этого бита по следующему положительному перепаду на pclk счетчик таймера и счетчик предвари- тельного делителя сбрасываются. При сбросе счетчиков также автоматически очищается и этот бит.
Модули захвата и совпадения являются аппаратными моду-
лями и позволяют решить ряд задач, не загружая процессор.
58
Наибольшую эффективность они обеспечивают при работе с
внешними периодическими или непериодическими сигналами.
Модуль захвата служит для точной фиксации момента
свершения внешнего события (приход фронта сигнала) на вход
САР. По событию захвата устанавливается флаг CR, по кото-
рому может вырабатываться запрос на прерывание. Данный
модуль может использоваться:
- для фиксации времени (момента) внешнего события
(фронта);
- определения частоты и длительности импульсов внешне-
го сигнала, фазового сдвига нескольких сигналов.
Модуль совпадения позволяет генерировать высокоточные
временные сигналы на выходах МАТ. По событию генерации
сигнала устанавливается флаг MR, по которому может выра-
батываться запрос на прерывание. Данный модуль может ис-
пользоваться:
- для формирования одиночных импульсов с программи-
руемой длительностью;
- формирования периодических последовательностей
импульсов с программируемой частотой, длительно-
стью, фазовым сдвигом (в случае нескольких выходных
сигналов);
- формирования сигналов с широтно-импульсной модуля-
цией (ШИМ). При ШИМ частота сигнала остается по-
стоянной, а длительность импульса программируется.
Регистр прерывания IR содержит биты флагов прерывания
совпадения и биты флагов прерывания захвата. Описание ре-
гистра приведено в таблице 3.3.
Если происходит генерация запроса прерывания, то соот-
ветствующий бит будет установлен в 1. Иначе бит будет равен
0. Запись логической 1 в бит регистра IR сбросит соответ-
ствующий запрос. Запись нуля не вызывает никакого эффекта.
59
Таблица 3.3
Регистр прерывания IR
Бит Функция Описание
0 Прерывание по регистру MR0 Флаг прерывания по совпадению в канале 0.
1 Прерывание по регистру MR1 Флаг прерывания по совпадению в канале 1.
2 Прерывание по регистру MR2 Флаг прерывания по совпадению в канале 2.
3 Прерывание по регистру MR3 Флаг прерывания по совпадению в канале 3.
4 Прерывание по регистру CR0 Флаг прерывания по захвату в канале 0.
5 Прерывание по регистру CR1 Флаг прерывания по захвату в канале 1.
6 Прерывание по регистру CR2 Флаг прерывания по захвату в канале 2.
7 Прерывание по регистру CR3 Флаг прерывания по захвату в канале 3.
Например:
#define flagCR2 6 //привяжем флаг fCR2 к номеру разряда
//регистра TR (прерывание по регистру CR2)
T1IR 1= (1« flagCR2);//c6poc запроса на прерывание по входу
//С АР 1.2
На рисунке 3.2 приведена схема модуля захвата. Когда на
внешнем выводе CAPi происходит событие (изменение сигна-
ла), то текущее значение счетчика таймера ТС переписывается
в соответствующий регистр захвата СК, откуда оно может
быть прочитано программно. Фиксация события не зависит от
времени перехода на подпрограмму прерывания.
Регистр управления модулем захвата CCR управляет ка-
налами захвата. С помощью этого регистра можно разре-
шить работу канала, указать событие, по которому произво-
дится захват (по переднему или заднему фронту, или по
60
обоим), и разрешить генерацию запроса на прерывание при
захвате.
Описание регистра CCR приведено в таблице 3.4.
Регистр управления
модулем захвата
CCR
Рис. 3.2. Схема модуля захвата
На рисунке 3.3 приведена схема модуля совпадений. Мно-
горазрядный цифровой компаратор непрерывно сравнивает
изменяющийся во времени код счетчика таймера ТС с кодом,
который записан в регистре совпадения МК. В момент равен-
ства этих кодов устанавливается флаг запроса прерывания в
регистре IR в бите для данного регистра и изменяется сигнал
на соответствующем выводе MATj.
61
Таблица 3.4
Регистр управления модулем захвата - CCR
Бит Функция Описание
0 Захват по подъему на CAPO - 1: при изменении на входе уровня с 0 на 1 в CR0 загружается значение ТС; -0: нет реакции на изменение уровня
1 Захват по спаду на CAPO = 1: при изменении на входе уровня с 1 на 0 в CR0 загружается значение ТС; = 0: нет реакции на изменение уровня
2 Разрешение прерывания по CAPO = 1: при загрузке значения в регистр CR0 происходит генерация запроса на прерывание — 0: прерывание по CAPO запрещено
3 Захват по подъему на САР1 = 1: при изменении на входе уровня с 0 на 1 в CR1 загружается значение ТС; = 0: нет реакции на изменение уровня
4 Захват по спаду на САР1 - 1: при изменении на входе уровня с 1 на 0 в CR1 загружается значение ТС; -0: нет реакции на изменение уровня
5 Разрешение прерывания по САР1 - 1: при загрузке значения в регистр CR1 происходит генерация запроса на прерывание - 0: прерывание по САР1 запрещено
6 Захват по подъему на САР2 - 1: при изменении на входе уровня с 0 на 1 в CR2 загружается значение ТС; -0: нет реакции на изменение уровня
7 Захват по спаду на САР2 - 1: при изменении на входе уровня с 1 на 0 в CR2 загружается значение ТС; = 0: нет реакции на изменение уровня
8 Разрешение прерывания по САР2 = 1: при загрузке значения в регистр CR2 происходит генерация запроса на прерывание — 0: прерывание по САР2 запрещено
9 Захват по подъему на САРЗ - 1: при изменении на входе уровня с 0 на 1 в CR3 загружается значение ТС; = 0: нет реакции на изменение уровня
10 Захват по спаду на САРЗ = 1: при изменении на входе уровня с 1 на 0 в CR3 загружается значение ТС; = 0: нет реакции на изменение уровня
11 Разрешение прерывания по САРЗ - 1: при загрузке значения в регистр CR3 происходит генерация запроса на прерывание - 0: прерывание по САРЗ запрещено
62
Рис. 3.3. Схема модуля совпадений
Регистр управления модулем совпадения MCR использует-
ся для определения действий при совпадении значения соот-
ветствующего регистра с содержимым счетчика таймера. Опи-
сание регистра приведено в таблице 3.5.
Регистр выходов совпадения EMR задает реакцию выходов
МАТ при событии совпадения. В таблице 3.6 представлено
описание регистра EMR.
63
Таблица 3.5
Регистр управления модулем совпадения MCR
Бит Функция Описание
0 Разрешение прерывания по MR0 = 1: если ТС примет значение, равное MR0, произойдет запрос прерывания; = 0: прерывание по MR0 запрещено
1 Сброс по MR0 - 1: если ТС примет значение равное MR0, ТС сбросит- ся в 0; - 0: сброс по совпадению MR0 не произойдет
2 Стоп по MR0 - 1: если ТС примет значение, равное MR0, ТС будет остановлен; - 0: останов по совпадению MR0 не произойдет
3 Разрешение прерывания по MR1 - 1: если ТС примет значение, равное MR1, произойдет запрос прерывания; - 0: прерывание по MR1 запрещено
4 Сброс по MR1 — 1: если ТС примет значение, равное MR1, ТС сбро- сится в 0; = 0; сброс по совпадению MR1 не произойдет
5 Стоп по MR1 = 1: если ТС примет значение, равное MR1, ТС будет остановлен; = 0: останов по совпадению MR1 не произойдет
6 Разрешение прерывания по MR2 - 1: если ТС примет значение, равное MR2, произойдет запрос прерывания; - 0: прерывание по MR2 запрещено
7 Сброс по MR2 - 1: если ТС примет значение, равное MR2, ТС сбро- сится в 0; - 0: сброс по совпадению MR2 не произойдет
8 Стоп по MR2 - 1: если ТС примет значение, равное MR2, ТС будет остановлен; - 0: останов по совпадению MR2 не произойдет
9 Разрешение прерывания по MR3 = 1; если ТС примет значение, равное MR3, произойдет запрос прерывания; = 0; прерывание по MR3 запрещено
10 Сброс по MR3 — 1: если ТС примет значение, равное MR3, ТС сбро- сится в 0; = 0; сброс по совпадению MR3 не произойдет
11 Стоп по MR3 = 1: если ТС примет значение, равное MR3, ТС будет остановлен; = 0: останов по совпадению MR3 не произойдет
64
Таблица 3.6
Регистр выходов совпадения EMR
Бит Функция Описание
0 Состояние выхода МАТО Состояние выхода (не вывода) МАТО
1 Состояние выхода МАТ1 Состояние выхода (не вывода) МАТ1
2 Состояние выхода МАТ2 Состояние выхода (не вывода) МАТ2
3 Состояние выхода МАТЗ Состояние выхода (не вывода) МАТЗ
5,4 Управление выхо- дом МАТО Задает функционирование выхода совпадения в соответствии с табл. 3.7
7,6 Управление выхо- дом МАТ1 Задает функционирование выхода совпадения в соответствии с табл. 3.7
9,8 Управление выхо- дом МАТ2 Задает функционирование выхода совпадения в соответствии с табл. 3.7
11,10 Управление выхо- дом МАТЗ Задает функционирование выхода совпадения в соответствии с табл. 3.7
Таблица 3.7
Задает функции выхода
EMR[ 11:10], EMR[9:8], EMR[7:6], EMR[5:4], Функция
00 Ничего не делать
01 Сбросить сигнал при совпадении (будет уста- новлен логический 0)
10 Установить сигнал при совпадении (будет уста- новлена логическая 1)
И Переключить при совпадении (значение изме- нится на противоположное)
Например, приведенный ниже фрагмент программы выво-
дит в порт РО. 12 сигнал частотой 2 кГц (меандр - сигнал син-
хронизации для ЖКИ). Данный вывод микроконтроллера име-
ет следующие альтернативные функции: GPIO Port 0.12 /
DSR1 / МАТ 1.0. Предполагаем, что частота периферийной
шины микроконтроллера (настройка в файле Startup.s) состав-
ляет 12 МГц. Для выполнения задания необходимо настроить
65
порт РО. 12 на альтернативную функцию МАТ 1.0 путем запи-
си в разряды 25:24 регистра P1NSEL0 соответственно 1:0 (вто-
рая альтернативная функция, см. табл. 3.8).
Таблица 3.8
Альтернативные функции порта 1*0
PINSEL0 Pin Name Function when 00 Function when 01 Function when 10 Function when 11 Reset Value
1:0 Р0 0 GPIO Port 0 0 TxD(UARTO) PWM1 Reserved OO
3:2 Р0 1 GPIO Port 0.1 RxD (UART0) PWM3 EINT0 00
5:4 Р02 GPIO Port 0 2 SCL(I2C) Capture 0 0 (TIMERO) Reserved OO
7:6 РОЗ GPIO Port 0 3 SDA (l2C) Match 0 0 (TIMERO) EINT1 00
98 Р04 GPIO Port 0 4 SCK(SPIO) Capture 0 1 (TIME R0) Reserved 00
11.10 Р05 GPIO Port 0.5 MISO (SPIO) Match 0 1 (TIMERO) Reserved 00
13:12 рое GPIO Port 0 6 MOSI (SPIO) Capture 0 2 I TIMERO) Reserved 00
15:14 Р0.7 GPIO Port 0.7 SSEL(SPIO) PWM2 EINT2 00
17 16 Р0 8 GPIO Port 0 8 TxD UART1 PWM4 Reserved OO
19:18 РОЭ GPIO Port 0.9 RxD(UARTI) PWM6 EINT3 00
21:20 РОЮ GPIO Port 0.10 RTS (UART1) Capture 1 0 (TIMER1) Reserved 00
23:22 Р0 11 GPIO Port 0 11 CTS (UART1) Capture 1.1 (TIMER1) Reserved 00
25.24 РО 12 GPIO Port 0.12 DSR(UARTI) Match 1.0(TIMER1) Reserved 00
27:26 РО 13 GPIO Port 013 DTR(UARTI) Match 1 1 (TIMER1) Reserved 00
2928 Р0 14 GPIO Port 0.14 CD(UART1) EINT1 Reserved 00
31:30 РОЮ GPIO Port 0 15 Rl (UART1) EINT2 Reserved 00
PINSEL1 Pin Name Function when 00 Function when 01 Function when 10 Function when 11 Reset Value
to P0 16 GPIO Port 016 EiNTO Match 0.2 (TIMERO) Capture! 2 (TIMERO) 00
3:2 P0 17 GPIO PortO 17 Capture 1.2 (TIMER1) SCK(SPII) Match 1.2 (TIMER 1) 00
5:4 P0 18 GPIO PortO 18 Capture 1.3 (TIMER 1) MISO (SPI1) Match 1.3(TIMER1) 00
7:6 P0 19 GPIO PortO 19 Match 1 2 (TIMER 1) MOSI (SPI1) Match 1.3(TIMER1) 00
9:8 P0.20 GPIO Port 0 20 Match 1.3 (TIMER1) SSEL(SPH) EINT3 00
11:10 P0.21 GPIO Port 0.21 PWM5 Reserved Capture 1.3(TIMER1) 00
13:12 P0.22 GPIO Port 0 22 Reserved Capture 0 0 (TIMERO) Match 0 0 (TIMERO) 00
15:14 P0 23 GPIO Port 0.23 RD2(CAN Controller 2) Reserved Reserved 00
17:16 P0 24 GPIO Port 0 24 TD2 I CAN Controller 21 Reserved Reserved 00
19:18 P0.25 GPIO Port 0 25 RD1 (CAN Controller 1) Reserved Reserved 00
21:20 P0.26 Reserved 00
23:22 P0.27 GPIO Port 0 27 AINO (A/D Converter) Capture 0.1 (TIMERO) Match 0.1 (TIMERO) 01
25:24 P0 28 GPIO Port 0 28 AIN1 (A/D Converter) Capture 0.2 (TIMERO) Match 0.2 (TIMERO) 01
27:26 P0.29 GPIO Port 0 29 AIN2 (A/D Converter) Capture 0.3 (TIMERO) Match 0.3 (TIMERO) 01
29:28 P0 30 GPIO Port 0 30 AIN3 (A/D Converter) EINT3 Capture 0.0 (TIMERO) 01
31:30 P031 Reserved 00
66
Чтобы получить меандр частотой 2 кГц, следует сформи-
ровать частоту совпадения 4 кГц, по которой функция выхода
будет переключаться на противоположное значение. Для
формирования частоты совпадения 4 кГц можно коэффици-
ент предделителя таймера Т1 выбрать равным 0 (регистр
T1PR =0), а в регистр совпадения T1MR0 записать число 3000
(12 МГц / 4 кГц = 3000). В регистр управления Т1MCR следует
записать условие сброса счетчика при достижении содержи-
мого T1MR0. Для разрешения счета счетчиком таймера Т1ТС
в регистр управления счетчиком T1TCR запишем 1.
/*очищаем биты, отвечающие за функцию порта Р0.12 */
PTNSEL0 &= ~(3 « 24)
//вывод Р0.12 настраиваем как выход совпадения МАТ 1.0
PTNSEL0 1= (2 « 24)
T1PR =0;// коэффициент предделителя
Т1MR0 = 3000; // регистр совпадения
/*очищаем биты, отвечающие за функцию выхода МАТ 1.0 */
T1EMR &= ~(3«4);
/* переключать выход МАТЕО при совпадении Т1 на T1MR0*/
T1EMR 1= (3« 4);
/* сброс Т1 при совпадении с T1MR0 */
T1MCR 1=(1 « 1);
Z/T1MCR 1= (3 « 0); // если еще и разрешить прерывание
Т1 TCR = 1; // запуск счета
КОНТРОЛЛЕР ВЕКТОРНЫХ ПРЕРЫВАНИЙ (VIC)
Основные возможности:
• 32 входа запроса прерываний;
• 16 векторных входа запроса прерываний;
67
• 16 уровней приоритетов, динамически назначаемых на за-
просы прерываний;
• программные прерывания.
ОПИСАНИЕ
Контроллер векторных прерываний (VIC) имеет 32 входа
запроса прерываний, программно определяемые в одну из ка-
тегорий: быстрое прерывание FIQ и векторные IRQ. Про-
граммное управление позволяет динамически назначать и
настраивать приоритеты прерываний от разных периферийных
устройств.
В таблице 3.9 представлены источники прерываний микро-
контроллера с привязкой к номерам каналов прерывания. Но-
мер канала используется при разрешении прерывания от ис-
точника. Для этого в регистр разрешения прерывания
VICIntEnable записывается 1 в разряд, соответствующий но-
меру источника:
VICIntEnable 1= (1 « VIC_TIMERO); //разрешить прерывание
//от таймера ТО
Для запрещения прерывания по какому-либо каналу следу-
ет записать 1 в соответствующий разряд регистра
VICIntEnClear. После сброса процессора все прерывания за-
прещены.
Запрос быстрого прерывания (FIQ) имеет наивысший прио-
ритет. Самое быстрое время реакции на FIQ достигается, если
только один запрос назначен в категорию FIQ.
Для отнесения источника прерывания к одной из категорий
(FIQ или IRQ) служит регистр VICIntSelect. Запись 1 относит
соответствующий запрос к категории FIQ, запись 0 - к катего-
рии IRQ. После сброса процессора все разряды регистра обну-
ляются.
Векторные IRQ имеют средний приоритет. Шестнадцать из
32 запросов могут быть назначены в эту категорию. Любой из
68
32 запросов может быть назначен на любой из 16 слотов век-
торных IRQ, среди которых слот 0 имеет самый высокий при-
оритет, а слот 15 - самый низкий.
Таблица 3.9
Номера каналов источников прерывания
№ Источник прерывания Номер канала прерывания Примечание
1. VIC WDT 0 Охранный таймер
2. VIC.SW 1 Программное прерывание
3. VIC_DEBUGRX 2 Встроенный отладчик прием
4. VIC_DEBUGTX 3 Встроенный отладчик перед.
5. VIC.TIMERO 4 Таймер ТО (все флаги)
6. VIC.TIMERl 5 Таймер Т1 (все флаги)
7. VIC^UARTO 6 UART 0 (все флаги)
8. VIC.UARTl 7 UART 1 (все флаги)
9. VIC_PWM0 8 Модуль ШИМ (все флаги)
10. I2C 9 Модуль I2C
11. VIC_SP1 10 Модуль SP1
12. 11 Резерв
13. VIC_PLL 12 Блокировка PLL
14. VIC.RTC 13 Модуль RTC
15. VIC_EINT0 14 Внешнее прерывание EINT0
16. VIC_EINT1 15 Внешнее прерывание EINT1
17. VIC_EINT2 16 Внешнее прерывание E1NT2
18. VIC_EINT3 17 Внешнее прерывание E1NT3
19. VIC. AD 18 АЦП
20. VIC_CANERR 19 CAN err
21. VIC_CANTX1 20 CAN Тх 1
22. VIC_CANTX2 21 CAN Тх 2
23. VIC_CANTX3 22 CAN Тх 3
24. VIC_CANTX4 23 CAN Тх 4
25. 24-25 Резерв
26. VIC_CANRX1 26 CAN Rx 1
27. VIC_CANRX2 27 CAN Rx 2
28. VIC_CANRX3 28 CAN Rx 3
29. VIC_CANRX4 29 CAN Rx 4
30. 30-31 Резерв
69
Для задания приоритета прерывания (для привязки источ-
ника прерывания к слоту) служат 16 регистров управления
вектором VICVectCntIO -ь VICVectCntU5. Каждый из реги-
стров отвечает за свой слот. В таблице 3.10 приведено описа-
ние регистра управления вектором.
Таблица 3.10
Регистр управления вектором
Номер бита Описание После сброса
0. .4 Номер канала источника прерывания, связанный с этим слотом 0
5 = 1 - слот вектора IRQ разрешен 0
Например:
VICVectCntl2 = 0x20 I VIC_TIMER0; //привязка таймера ТО к
И второму слоту и разрешение этого слота.
Для обслуживания прерывания необходимо связать источ-
ник прерывания с соответствующей подпрограммой обработки
прерывания. Для хранения адресов подпрограмм прерывания
служат 16 регистров адреса вектора VICVectAddrO + VlCVec-
tAddrl5. Каждый из регистров привязан к своему слоту. Под-
программа обслуживания векторного прерывания должна объ-
являться с помощью расширения языка _____irq.
Например:
void TimerTO_TRQ(void) _irq //объявление п/п обработки прерыв-я
{
}
VICVectAddr2 = (unsigned) TimerT0_IRQ // адрес обработчика
// загружаем в адреса вектора второго слота
Естественно, что для обслуживания прерывания от какого-
либо модуля в данном модуле должно быть разрешено преры-
70
вание. Так, для таймера ТО должны быть установлены соот-
ветствующие биты регистра T0IR. Как видно из табл. 3.9, под
все прерывания таймера (от модуля захвата CAPO САРЗ, от
модуля совпадений МАТО МАТЗ) отведен один канал, по-
этому, если от таймера должно обслуживаться несколько пре-
рываний, следует в обработчике прочитать соответствующий
регистр модуля для идентификации источника прерывания.
Выход из прерывания.
Перед выходом из прерывания необходимо сбросить все
флаги прерываний периферийного устройства, сгенерировав-
шего запрос на прерывание. Кроме того, в конце обработчика
прерывания необходимо выполнить холостую операцию запи-
си в общий регистр адреса прерывания VICVectAddr. Эта опе-
рация указывает модулю VIC на окончание обработки преры-
вания и разрешает обработку отложенных прерываний.
Например, в конце подпрограммы обработки прерывания
по модулю захвата таймера ТО, должно быть:
TOTR 1= (1« flagCR2);//c6poc запроса на прерывание по входу
//С АР 1.2
VICVectAddr = 0; // фиктивная запись - конец обработки прерыв-я
Ниже приведен пример части программы, осуществляющей
инициализацию модуля VIC, а также определение подпро-
граммы обработки прерывания от модуля совпадений МАТ2
таймера ТО.
/*очищаем биты, отвечающие за функцию порта Р0.28 */
PINSEL1 &=~(3« 24)
/* вывод Р0.28 настраиваем как выход совпадения МАТО.2 */
PINSEL1 1= (3 « 24)
// сброс ТО при совпадении с T0MR2
T0MCR 1=(1 «7);
71
// разреш. прерывания по MR2
T0MCR 1=(1«6)
//привязка таймера ТО ко второму слоту и разрешение этого слота
VICVectCntl2 = 0x20 I VIC_TIMER0;
// адрес обработчика загружаем в адреса вектора второго слота
VICVectAddr2 = (unsigned) TimerT0_IRQ
//разрешить прерывание от таймера ТО
VICIntEnable = (1 « VIC_TTMER0);
TOTCR = 1; // запуск таймера ТО
//описание п/п обработки прерывания
void TimerTO_IRQ(void) _irq
{
//сброс запроса на прерывание по совпадению регистра MR2
T0IR 1= (1« flagMR2);
// фиктивная запись - конец обработки прерывания
VICVectAddr = 0;
}
3.2. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
1. Изучите структуру таймеров микроконтроллера.
2. Изучите структуру системы прерывания микроконтрол-
лера.
3. Изучите структуру программы, содержащей обработчик
прерывания (см. рис. 3.4).
4. Составьте алгоритм программы моргания светодиодами
в заданном темпе (номера светодиодов и частоту см. в
табл. 3.11). Отсчет временных интервалов осуществлять
с помощью системы прерываний.
72
5. Напишите программу по составленному алгоритму.
6. Откомпилируйте ее, создайте загрузочный файл.
7. Подключите стенд к компьютеру. Включите стенд.
8. Загрузите программу в стенд. Убедитесь в ее работоспо-
собности.
Рис. 3.4. Алгоритм связи подпрограммы и основной программы
3.3. СОДЕРЖАНИЕ ОТЧЕТА
Для написания отчета необходимо изучить литературу,
предложенную в конце раздела.
73
Отчет должен содержать:
-описание аппаратной части:
• описание архитектуры используемого в програм-
ме таймера;
• описание архитектуры системы прерывания;
-описание программной части:
• структуру программы;
• блок-схему разработанной подпрограммы;
• исходные тексты на С.
Таблица 3.11
Задания для лабораторной работы
№ варианта Задание
Используемый таймер Прерывание по регистру Частота морга- ния (Гц) Номера светодиодов
1 ТО MR1 1 1-4
2 Т1 MR2 2 5-8
3 то MR3 3 1,2, 5,6
4 Т1 MR4 4 3.4
5 то MR1 5 1.3. 5, 7
6 Т1 MR2 6 2. 4. 6. 8
7 то MR3 7 1,4
8 Т1 MR4 8 5, 8
9 то MR1 1 1.3. 5, 7
10 Т1 MR2 2 2. 4. 6. 8
И то MR3 3 1,2,5,6
12 Т1 MR4 4 2, 3, 6, 7
13 то MR1 5 5-8
14 Т1 MR2 6 3,4,7, 8
15 то MR3 7 5,6
3.4. КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Как задать частоту, подаваемую на таймер?
2. Для чего введен режим захвата?
74
3. Для чего введен режим совпадения?
4. Какие регистры отвечают за систему прерываний?
5. Как устанавливаются приоритеты прерываний?
6. Что такое вектор прерывания, где он располагается?
7. Что необходимо задать при программировании контрол-
лера прерываний?
8. Как включается процедура обработки прерывания в про-
грамму?
Учебно-методическое обеспечение
1. Учебный стенд SDK-2.0. Руководство пользователя.
2. LPC2xxx. Руководство пользователя.
3. Мясников В.И. Проектирование встраиваемых микропроцессор-
ных систем: учебное пособие. Йошкар-Ола: МарГТУ, 2010. 400 с.
4. Программа-терминал Terminal.exe.
75
ЛАБОРАТОРНАЯ РАБОТА № 4
УПРАВЛЕНИЕ ПОСЛЕДОВАТЕЛЬНЫМ
ИНТЕРФЕЙСОМ
Цель работы - освоение принципов передачи данных по
последовательному интерфейсу.
В процессе работы необходимо изучить:
- аппаратную часть:
• асинхронную передачу, временные диаграммы;
• стандартный интерфейс RS-232C;
• структуру последовательного интерфейса (UART)
LPC2292;
• режимы работы UART;
- программную часть:
• алгоритм приема данных по UART;
• алгоритм передачи данных по UART;
• организация последовательного обмена по UART;
• реализация драйвера.
4.1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
Общие сведения
Наиболее распространенный вид связи с внешними устрой-
ствами - последовательный обмен. В этом случае байт данных
передается по единственному проводу бит за битом с обеспе-
чением синхронизации между приемником и источником дан-
ных. Очевидное преимущество последовательной передачи
данных состоит в том, что она более помехоустойчива (нет
взаимной наводки, как в случае параллельной передачи) и тре-
бует небольшого количества линий связи.
Режимы приемопередачи. Последовательная передача ин-
формации между МПС и внешним устройством (ВУ) может
76
осуществляться как в одну, так и в другую сторону. Вслед-
ствие этого различают три режима приемопередачи: дуплекс-
ный, полудуплексный, симплексный.
Дуплексный режим означает возможность одновременного
приема и передачи информации. Следовательно, для обеспе-
чения данного режима приемопередачи необходимо два про-
вода под передачу данных: один в одну сторону, другой - в
обратную.
Полудуплексный режим означает поочередную передачу
данных в обе стороны. В данном режиме можно обойтись все-
го одним проводом для передачи данных в обоих направле-
ниях.
Симплексный режим означает одностороннюю передачу
данных (передача только в одном направлении).
Режимы последовательной передачи данных. Использо-
вание последовательных линий связи с внешними устройства-
ми возлагает на контроллеры последовательного обмена до-
полнительные, по сравнению с контроллерами для
параллельного обмена, функции. Во-первых, возникает необ-
ходимость преобразования формата данных из параллельного
в последовательный при передаче данных во ВУ и из последо-
вательного в параллельный при приеме данных от ВУ. Во-
вторых, требуется реализовать соответствующий режиму ра-
боты внешнего устройства способ обмена данными. Возмож-
ны два режима последовательной передачи данных: синхрон-
ный, асинхронный.
Синхронный режим последовательного обмена. При син-
хронной последовательной передаче каждый передаваемый
бит данных сопровождается импульсом синхронизации, кото-
рый передается по отдельному проводу.
Асинхронный режим последовательного обмена. Асин-
хронная последовательная передача данных означает, что у
передатчика и приемника нет общего генератора синхроим-
77
пульсов и что синхронизирующий сигнал не посылается вме-
сте с данными. Следовательно, между передатчиком и прием-
ником могут быть протянуты всего два провода (в полудуп-
лексном или симплексном режиме): один для передачи данных
и один общий проводник.
Чтобы приемник узнал о моментах начала и завершения пе-
редачи всего пакета, а также каждого из бит данных, необхо-
димо выполнение двух условий:
1) скорость передачи и скорость приема должны быть
одинаковыми, т.е. частота генератора синхроимпуль-
сов приемника должна совпадать с частотой анало-
гичного генератора передатчика;
2) формат передачи должен быть стандартизован.
Для реализации первого условия введен ряд стандартных
скоростей: (1200, 2400, 4800, 9600, 19200, ...) бит/с.
Стандартный формат асинхронной последовательной пере-
дачи данных содержит N пересылаемых бит информации
(7 или 8 бит) и 3-4 дополнительных бита: стартовый бит -
«Start», бит паритета (контроль по четности или по нечетно-
сти)-«Р» и 1, 1.5 или 2 стоповых бита-«Stop» (рис.4.1,а).
Нет \start/ Do У D, У D2 У D3 Y D4 У D5 У D6 У D7 Y Р /Stop ’ Нет
ПОСЫЛКИ '----* 1---и----°----------°-----и----°-----и-----°-----' посылки
а)
1 О О 0 1 1 1 0 0 ______
Нет \start/ D0A D, D2 D3 / D4 * D5 * D6 \ P /stop*
ПОСЫЛКИ * ' '----1-----1----' 1 '
6)
Рис. 4.1. Формат посылки при асинхронной передаче (а) и пример посылки (б)
Контроль по четности/нечетности означает следующее:
значение данного бита (0 или 1) формируется таким образом.
78
чтобы сумма единиц в слове (данные плюс бит паритета) была
только четной/нечетной. Обнаружение приемным устройством
иного значения суммы единиц является признаком ошибки.
Бит паритета может отсутствовать. Когда передатчик бездей-
ствует, на линии сохраняется уровень сигнала, соответствую-
щий логической 1. На рисунке 4.1,6 приведен пример посылки
при N=8 с контролем по четности: посылается байт информа-
ции D7...Do = 01110001. Бит контроля по четности Р=0, так как
в пересылаемом байте четное число единиц.
Передатчик может начать пересылку символа в любой мо-
мент времени (асинхронный режим) посредством генерирова-
ния стартового бита, т. е. перевода линии в состояние логиче-
ского 0 на время, точно равное времени передачи бита. Затем
происходит передача битов символа, начиная с младшего. За
старшим битом следует дополнительный бит контроля по чет-
ности. Далее с помощью стопового бита линия переводится в
состояние логической 1. При единичном бите контроля столо-
вый бит не изменяет состояния сигнала на линии.
Промежуток времени от начала стартового бита до конца
стопового бита (стоповых бит) называется кадром. Сразу по-
сле стоповых битов передатчик может посылать новый стар-
товый бит, если имеется другой символ для передачи; в про-
тивном случае уровень логической 1 может сохраняться на
протяжении всего времени, пока бездействует передатчик.
Интерфейс RS-232C
Интерфейс RS-232C является последовательным асинхрон-
ным интерфейсом, обеспечивающим дуплексный режим при-
емопередачи.
Изначально интерфейс был предназначен для подключения
аппаратуры, передающей или принимающей данные (DTE),
например, компьютера, к связной аппаратуре каналов данных
(DCE) - обычно к модему. Полная схема соединения приведе-
на на рисунке 4.2.
79
DTE
Рис. 4.2. Полная схема соединения по RS-232C
В настоящее время RS-232C широко используется для связи
внешних устройств с компьютером на расстоянии до 15 мет-
ров без использования модема. Схема подключения внешнего
устройства к компьютеру представлена на рисунке 4.3.
Модемный кабель
Рис. 4.3. Схема соединения ВУ по RS-232C
Рис. 4.4. Соединение по RS-232C нуль-модемным кабелем
Интерфейс также позволяет исключить канал удаленной
связи вместе с парой устройств DCE путем соединения с по-
мощью нуль-модемного (безмодемного) кабеля. Такая связь
используется, например, при соединении двух компьютеров
(рис. 4.4).
80
Стандарт RS-232C описывает управляющие сигналы ин-
терфейса, пересылку данных, электрический интерфейс и ти-
пы разъемов.
Стандарт RS-232C регламентирует применение 9-штырь-
ковых (DB-9P - вилка, DB-9S - розетка) или 25-штырьковых
(DB-25P - вилка, DB-25S - розетка) разъемов, за каждым кон-
тактом у которых закреплены определенные сигналы.
Назначение сигналов интерфейса RS-232C:
SG - сигнальная земля;
TxD - передаваемые последовательные данные (выход);
RxD - принимаемые последовательные данные (вход);
RTS - уведомление приемника о наличии данных для пере-
дачи (выход);
CTS - уведомление передатчика о готовности принять дан-
ные (вход);
DSR - приемник включен и готов к работе (вход);
DTR - передатчик включен и готов к работе (выход);
DCD - вход сигнала обнаружения несущей удаленного
модема;
RI - вход индикатора вызова (звонка).
Электрический интерфейс стандарта RS-232C использует
несимметричные передатчики и приемники - сигнал передает-
ся относительно общего провода. Логической 1 соответствует
напряжение в диапазоне -12 . . .-3 В. Логическому нулю соот-
ветствует диапазон +3 ... + 12 В. Диапазон -3...+3 В - зона
нечувствительности, обусловливающая гистерезис приемника:
состояние линии будет считаться измененным только после
пересечения данной зоны. Интерфейс не обеспечивает гальва-
нической развязки устройств, поэтому разность потенциалов
между их схемными землями (SG) должна быть менее 2 В.
При более высокой разности потенциалов возможно неверное
восприятие сигналов.
81
Пример передачи буквы А в коде ASCII (буква А имеет код
0x41, иначе 41 h или в двоичном представлении = 0Ь01000001)
через интерфейс RS-232C приведен на рисунке 4.5. Формат
передачи: 8 бит данных без бита четности, 2 стоповых бита.
На рисунке 4.5,а показан эквивалентный ТТЛ-сигнал при пе-
редаче буквы А, а на рисунке 4.5,6 показан сигнал в том виде,
в каком он существует на линиях интерфейса RS-232C.
Рис. 4.5. Представление кода буквы А сигнальными уровнями ТТЛ (а)
и уровнями интерфейса RS-232C (б)
Преобразование ТТЛ-уровней в уровни интерфейса RS-
232С и наоборот обычно производится специальными микро-
схемами - драйверами линии.
Контроллеры последовательного канала в LPC2292
Общее описание контроллеров
В LPC2292 реализовано два контроллера последовательно-
го канала: UART0 и UART1. Их основные характеристики:
82
- входные и выходные буферы FIFO на 16 байт;
- настраиваемый уровень контроля заполнения входного
буфера FIFO на 1,4, 8 или 14 байт;
- встроенный генератор тактовой частоты.
На модуль UART0 поступают принимаемые последова-
тельные данные (RxDO) и выходят передаваемые последова-
тельные данные (TxDO). Модуль UART1 практически иденти-
чен UART0, за одним исключением: UART1 дополнительно
содержит набор модемных сигналов для организации аппарат-
ного подтверждения (квитирования: сигналы RTS, CTS, DSR,
DTR, DCD, RI). На рисунке 4.6 приведена структура модуля
UART без узла сигналов квитирования. Обозначение реги-
стров приведено без приставки Ux, где х - номер модуля
UART: 0 или 1.
FIFO
Рис. 4.6. Структура модуля UART
83
Скорость передачи по последовательному каналу задается
частотой Baud Rate, которая вырабатывается из частоты пери-
ферийной шины путем деления ее на коэффициент, записан-
ный в регистры DLM и DLL делителя. Передаваемые данные
записываются в регистр THR буфера FIFO передатчика. Для
преобразования в последовательный код передаваемые данные
передаются в регистр сдвига TSR и далее на вывод TxD. Ин-
формация об опустошении как регистра THR, так и регистра
TSR передается в узел прерывания interrupt, который (при раз-
решении соответствующего прерывания в регистре IER) уста-
новит флаг прерывания. Принимаемые данные в последова-
тельном виде поступают через вход RxD на регистр сдвига
RSR, из которого в параллельном виде передаются в буфер
FIFO приемника. Процессор может прочитать их через регистр
RHR. Информация о поступлении входных данных в регистр
RHR и степени заполненности буфера FIFO приемника пере-
дается в узел прерывания interrupt, который (при разрешении
соответствующего прерывания в регистре IER) установит флаг
прерывания. Настройка приемного буфера FIFO осуществля-
ется через регистр FCR. Узел управления линией позволяет
задать формат передаваемых и принимаемых данных, прочи-
тать статус линии (ошибки приема) и передать информацию
об ошибках в узел прерывания interrupt.
Для работы с модулем последовательного обмена необхо-
димо выполнить следующие настройки и реализовать модуль
приема/передачи данных:
1. Настройка соответствующих портов на альтернативные
функции RxD и TxD.
2. Задание формата передаваемых и принимаемых данных
(стоп биты, паритет и т.д.).
3. Задание скорости обмена по последовательному каналу.
84
4. Задание режима работы буферов приема и передачи
(разрешение работы буферов, степень заполненности
буфера приемника).
5. Задание режима работы с прерываниями (разре-
шить/запретить прерывания).
6. При работе по прерыванию - настройка контроллера
векторных прерываний (приоритет, привязка вектора к
подпрограмме обработки прерывания и т.д.).
7. Модуль приема/передачи данных от последовательного
порта включает драйвер обмена данными и API функ-
ций ввода/вывода. Драйвер состоит из подпрограммы
обработки прерывания и двух циклических буферов об-
мена с основной программой.
Рассмотрим данные пункты подробнее.
1. Настройка портов на альтернативную функцию
На рисунке 4.7 приведена схема подключения узла RS232 к
портам микроконтроллера. Узел подключен к модулю UART0.
Так входные данные поступают на порт Р0.1, имеющий аль-
тернативную функцию RxDO, выходные данные UARTTXD0
- на порт Р0.0, имеющий альтернативную функцию TxDO.
На рисунке 4.8 приведена принципиальная схема узла
RS232C. Она состоит из приемопередатчика ADuM1201AR,
осуществляющего гальваническую изоляцию внешних сигна-
лов от микроконтроллера. Питание изолированной части схемы
осуществляется от изолирующего источника VA-050501 (вход-
ное напряжение +5 В, выходное +5 В изолированное от входно-
го). Преобразователь уровней SP202EET преобразует TTL сиг-
налы (0/+5 В) в уровни интерфейса RS232C (-10 В/+10 В).
За конфигурацию портов РО.О и Р0.1 отвечает регистр
PINSEL0 (табл. 4.1):
85
Рис. 4.7. Фрагмент схемы подключения модуля RS232C к микроконтроллеру
Рис. 4.8. Фрагмент схемы модуля RS232C
НН
Таблица 4.1
Регистр PINSEL0[3:0]
Настройка портов может быть осуществлена следующим
образом:
#define U0-PINSEL (0x00000005) //настройка PINSEL0 на UART0
#define UO.PTNMASK (OxOOOOOOOF) И маска PINSELO для UART0
PINSELO &- ~ U0 P1NMASK; //очистим биты конфигурации для
//РО.ОиРО 1
PINSELO 1= U0_PINSEL: // настройка на альтернативные
//функции TxD (UART0) и RxD (UART0)
2. Задание формата передаваемых и принимаемых
данных
Задание формата данных осуществляется через регистр
LCR. Формат регистра приведен в таблице 4.2.
Например, для модуля UART0:
#define DLAB (1«7) И LCR[7] - доступ к делителю
#define N_bits_8 0x3
UOLCR = 0;
UOLCR 1= N_bits_8 I DLAB: // 8 бит, 1 стоп, нет паритета,
//разрешить доступ к делителю
Установлен формат 8 бит, 1 столовый бит, без контроля па-
ритета, разрешить доступ к делителю для задания скорости.
После установки скорости работы по последовательному пор-
ту необходимо запретить доступ к делителю (разрешить до-
ступ к буферу данных):
UOLCR &= * DLAB: // запретить доступ к делителю
88
Таблица 4.2
Формат регистра LCR
Биты Функция Описание После сброса
1:0 Длина слова 00 - слово имеет длину 5 бит 01 - слово имеет длину 6 бит 10 - слово имеет длину 7 бит 11 - слово имеет длину 8 бит 0
2 Количество стопо- вых бит 0-1 столовый бит 1-2 стоповых бита 0
3 Контроль передачи 0 - Запретить контроль 1 - Разрешить контроль 0
5:4 Тип контроля (бит паритета) 00 - Контроль по нечётности 01 - Контроль по четности 10 - Бит паритета всегда равен "0" 11 - Бит паритета всегда равен "1". 0
6 Останов передачи 0 - Запретить останов передачи 1 - Разрешить останов передачи. По установке этого бита на выводе TxD всегда будет 0 0
7 DLAB -доступ к делителю 0 - Доступ к буферу данных 1 - Доступ к делителю 0
3. Задание скорости обмена по последовательному
каналу
В восьмиразрядные регистры DLL и DLM записываются
младшая и старшая часть делителя частоты, позволяющего
задавать скорость обмена по последовательному каналу. Для
доступа к регистрам бит DLAB регистра LCR должен быть
установлен в 1. Значение делителя частоты D высчитывается
по следующей формуле:
D = pclk /(16 • V),
где pclk - частота периферийной шины;
V - требуемая скорость обмена в битах в секунду.
89
Например, для задания скорости 9600 бит/с при частоте пе-
риферийной шины 12 МГц значение делителя равно:
D= 12000000/(16 • 9600)~ 78
Для модуля UAR.T0 задание скорости будет выглядеть:
#define BaudRate 9600 // скорость передачи бит/с
#define pclk 12000000 // частота периферийной шины
U0LCR l=DLAB;// разрешаем доступ к делителю
U0DLL = pclk / (16 * BaudRate); // младший байт
U0DLM = (pclk / (16 * BaudRate)) » 8; //старший байт
U0LCR &= - DLAB; // запрет доступа к делителю
4. Задание режима работы буферов приема и передачи
Регистр FCR управляет функционированием FIFO буферов
приемника и передатчика (табл. 4.3).
Таблица 4.3
Формат регистра управлением буферами FIFO (FCR)
Биты Функция Описание После сброса
0 FIFO Разрешен 1 - Разрешает работу Rx и Тх FIFO буферов 0
1 Сброс Rx FIFO Запись 1 в этот бит удалит все слова из Rx FIFO буфера и сбросит указатель. Этот бит самоочищается 0
2 Сброс Тх FIFO Запись 1 в этот бит удалит все слова из TxD FIFO буфера и сбросит указатель. Этот бит самоочищается 0
5:3 Зарезерви- рован Зарезервирован -
7:6 Уровень за- полнения RxD FIFO буфера до установки запроса на прерывание 00 - Уровень заполнения - 1 слово 01 - Уровень заполнения - 4 слова 10 - Уровень заполнения - 8 слов 11 - Уровень заполнения - 14 слов Эти два бита определяют уровень заполнения FIFO буфера приемника UART, по достиже- нии которого активируется запрос на преры- вание 0
90
Например:
UO FCR = 1; // разрешение работы буферов, уровень заполнения Rx
FIFO до вызова прерывания - 1 слово
5. Задание режима работы с прерываниями
Регистры IER, IIR задают функционирование модуля при
возникновении прерывания. В таблицах 4.4 и 4.5 описаны
форматы данных регистров.
Таблица 4.4
Формат регистра разрешения прерывания IER
Биты Функция Описание После сброса
0 RDA преры- вание по готовности данных 0 - Запретить прерывание по готовности дан- ных RxD (RDA) 1 - Разрешить прерывание по готовности дан- ных RxD. При этом также будет разреше- но прерывание по просрочке приема слова (CTI) 0
1 THRE пре- рывание по пустому бу- феру 0 - Запретить прерывание при опустошении буфера передатчика (THRE) 1 - Разрешить прерывание при опустошении буфера передатчика (THRE) 0
2 RLS преры- вание по измене- нию статуса RxD 0 - Запретить прерывание по изменению статуса RxD (RLS) 1 - Разрешить прерывание по изменению статуса линии RxD (RLS) 0
7:3 Зарезерви- рован Зарезервирован -
Регистр IIR содержит код статуса запроса прерывания, ко-
торый показывает источник и приоритет прерывания. Преры-
вания заморожены на период доступа к IIR. Если прерывание
происходит во время чтения этого регистра, то оно отобразит-
ся только при следующем чтении из него.
91
Таблица 4.5
Формат регистра идентификации прерывания 11R
Биты Функция Описание После сброса
0 Ожидается прерывание 0 - один или более источника прерывания ак- тивны 1 - нет ожидающих прерывания запросов Для 11 R[0] активным является низкий уровень. Источник запроса может быть определен по значению IIR[3:1 ]. 1
3:1 Идентифи- катор пре- рывания 011 - изменение статуса Rx (RLS) 010 - готовность данных Rx (RDА) 110 - просрочка приема слова (CTI) 001 - буфер передатчика пуст (THRE) 0
5:4 Зарезерви- ровано Зарезервировано -
7:6 FIFO Раз- решен Эти биты эквивалентны FCR[0] 0
Прерывания обрабатываются следующим образом. Прочи-
тав идентификатор прерывания, программа обработки преры-
вания может установить причину и методы ее обработки, а
также пути снятия данного запроса. IIR должен быть прочитан
до завершения программы обработки прерывания для сброса
приоритета прерывания.
Прерывание по изменению статуса Rx имеет самый высо-
кий приоритет, если хотя бы один из 4-х признаков ошибки
установлен для Rx входа UART: ошибка переполнения (ОЕ),
ошибка паритета (РЕ), ошибка окна (FE) и останов передачи
(BI).
Условие ошибки, вызвавшее прерывание, можно опреде-
лить по значению LSR[4:1]. Данный запрос на прерывание
сбрасывается после чтения регистра LSR.
92
Прерывание по готовности данных Rx (RDA) (IIR[3:1 ]=010)
разделяет средний уровень приоритета с прерыванием по про-
срочке приема слова (CTI) (IIR[3:1 ]=110). Это прерывание ак-
тивно, когда объем Rx FIFO буфера достигает уровня заполне-
ния заданного FCR[7:6], и сбрасывается, когда объем буфера
становится меньше уровня заполнения. Когда активируется
прерывание RDA, процессор может считать блок данных раз-
мером, равным уровню заполнения.
Прерывание по просрочке приема слова - CTI
(11 R[3:1 ]=110) занимает средний уровень и активно, если Rx
FIFO буфера содержит, по меньшей мере, одно слово дан-
ных, и нет активности Rx FIFO буфера от 3,5 до 4,5 времени
слова. Любая активность Rx FIFO буфера (запись или чте-
ние из RSR) очистит этот запрос. Это прерывание может ис-
пользоваться для выборки RBR после полного получения
сообщения, если его длина не кратна уровню заполнения.
Например, если в микроконтроллер посылается сообщение
из 105 слов, а уровень заполнения равен 10, то процессор
получит 10 прерываний RDA, приводящих к приему 100
слов, и 1 прерывание CTI (в зависимости от программы об-
работки прерывания), приводящее к приему оставшихся 5
слов.
THRE прерывание (IIR[3:1]=001) - имеет наинизший
уровень приоритета и активируется по опустошении FIFO
буфера передатчика, при определенных условиях проведе-
нии его инициализации. Эти условия инициализации пред-
назначены, чтобы позволить THR FIFO заполниться данны-
ми, и не допустить появления многих запросов THRE при
запуске системы. Условия инициализации осуществляют
задержку одного слова минус бит остановки всякий раз, ко-
гда THRE=1 и не было, по крайней мере, двух слов в THR
93
начиная с последней установки THRE=1. Эта задержка
обеспечивается, чтобы дать время центральному процессору
записать данные в THR без прерывания THRE. Прерывание
THRE произойдет немедленно, если THR FIFO содержал два
или более слова, а в настоящее время THR пуст. Сброс за-
проса THRE происходит при записи в THR, или при чтении
из IIR.
В таблице 4.6 приведены сведения о приоритетах прерыва-
ний по UART.
Таблица 4.6
Приоритеты прерываний
IIR[3:0] Приоритет Тип прерывания Источник прерывания Сброс запроса
0001 - нет нет -
оно Наивыс- ший Изменение статуса Rx ОЕ или РЕ или FE или BI Прочесть LSR
0100 Средний Rx данные готовы Готовность Rx данных или пре- вышение уровня заполнения FIFO (FCR[0] =1) Прочесть RBR или чтение из FIFO до границ уровня заполне- ния
1100 Средний Просрочка приема слова Превышение интервала ожи- дания для приема слова Прочесть RBR
0010 Минималь- ный THRE Буфер передат- чика пуст Прочесть I1R или записать в THR
Для определения статуса линии и в частности причины воз-
никновения прерывания по изменению статуса Rx следует
прочитать регистр LSR (табл. 4.7).
94
Таблица 4.7
Формат регистра статуса линии LSR
Биты Функция Описание После сброса
0 Готовность принятых данных (RDR) 0 - RBR пуст 1 - RBR содержит корректные данные LSR[0] установлен, когда RBR содержит непрочи- танные слова, и очищается, когда RBR FIFO буфер очищается 0
1 Ошибка пере- полнения (ОЕ) 0 - Переполнения не было 1 - Произошло переполнение. Ошибка пере- полнения происходит, если при полностью заполненном FIFO буфере приемника при- нимается очередное слово. В этом случае принятое слово теряется и устанавливается бит LSR[ 1 ]. Чтение регистра LSR сбрасыва- ет этот признак 0
2 Ошибка пари- тета (РЕ) 0 - Ошибки паритета не было 1 - Произошла ошибка паритета. Ошибка пари- тета происходит, если в принимаемом слове бит паритета не соответствует заданным условиям в регистре LCR. Время возникно- вения этой ошибки зависит от состояния FCR[0]. Ошибка паритета соответствует слову, доступному в настоящий момент для чтения из BRB FIFO буфера. Чтение реги- стра LSR сбрасывает этот признак -
3 Ошибка окна (FE) 0 - Ошибки окна не было 1 - Произошла ошибка окна. Если столовый бит в принимаемом слове равен логическо- му 0, происходит ошибка окна. Время воз- никновения этой ошибки зависит от состоя- ния FCR[0]. Ошибка окна соответствует слову, доступному в настоящий момент для чтения из BRB FIFO буфера. Чтение реги- стра LSR сбрасывает этот признак 0
4 Останов пере- дачи (В1) 0 - Остановки передачи не было 1 - Произошёл останов передачи. Когда на RxD присутствует только низкий уровень (все 0) для одной полной передачи слова (старт, данные, паритет, останов), происходит 0
95
Окончание табл. 4.7
Биты Функция Описание После сброса
событие останов передачи. Как только оста- нов передачи обнаружен, приемник перехо- дит в режим ожидания, пока RxD не перей- дет в высокое состояние (все 1). Время возникновения этой ошибки зависит от со- стояния FCR[0], Она соответствует слову, доступному в настоящий момент для чтения из BRB FIFO буфера. Чтение регистра LSR сбрасывает этот признак
5 Опустошение буфера пере- датчика (THRE) 0 - THR содержит корректные данные 1 - THR пуст. THRE устанавливается при обна- ружении пустого THR буфера и сбрасывает- ся при записи в THR 1
6 Передатчик пуст (ТЕМТ) 0 - THR и/или TSR содержит корректные дан- ные 1 - THR и TSR пусты. ТЕМТ устанавливается при обнаружении обоих пустых регистров THR и TSR и сбрасывается при записи в THR или в TSR 1
7 Ошибка Rx FIFO (RXFE) 0 - RBR не содержит ошибок Rx или FCR[0]_0 1 - RBR содержит, по крайней мере, одну ошибку Rx UART 0
Пример задания режима работы с прерываниями для моду-
ля UART0:
U0ETR = 0x05; // разрешение прерывания по приему и
//изменению статуса линии
6. Настройка контроллера векторных прерываний
Настройка для модуля UART0:
а) разрешение прерывания от модуля UART0
VICIntEnable = (1 « VIC_UART0); //разрешить прерывание
//от модуля UART0;
96
b) задания приоритета прерывания (для привязки ис-
точника прерывания к слоту). Слот 0 имеет самый высокий
приоритет, а слот 15 имеет самый низкий
VICVectCntl3 = 0x20 I (VIC_ UART0); //привязка модуля
//UART0 к третьему слоту и разрешение этого слота;
с) привязка источника прерывания к соответствующей
подпрограмме обработки прерывания. Пусть подпрограмма
обработки прерывания объявлена как UART0IRQ с расшире-
ния языка __irq. Тогда в регистр адреса вектора VICVectAddr3
должен быть записан адрес подпрограммы:
VTCVectAddr3 = (unsigned) UART0_TRQ; // адрес обработчика
// загружаем в адреса вектора третьего слота;
d) подпрограмма обработки прерывания должна закан-
чиваться сбросом флагов прерываний периферийного устрой-
ства, сгенерировавшего запрос на прерывание, если флаги не
сбрасываются при чтении соответствующих регистров, как
описано в таблице 4.7.
Кроме того, в конце обработчика прерывания необходимо
выполнить холостую операцию записи в общий регистр адреса
прерывания VICVectAddr:
VICVectAddr = 0; // фиктивная запись - конец обработки прерыв-я
7. Прием/передача символа
Последовательность действий при приеме данных (предпо-
лагаем, что обмен осуществляется пакетами данных):
- в подпрограмме прерывания при возникновении преры-
вания по приему данных следует прочитать данные из
буфера FIFO приемника и записать в циклический при-
емный буфер обмена;
97
- в основной программе периодически опрашивается цик-
лический приемный буфер. При наличии данных в цик-
лическом буфере вызываются процедура их чтения и
сборка пакета. После приема пакета данных и проверки
его правильности устанавливается флаг на обработку
данных;
- обработка пакета осуществляется в процедуре при уста-
новке флага, после чего флаг сбрасывается.
Последовательность действий при передаче данных:
- формируем пакет данных для передачи в циклическом
передающем буфере;
- после записи в буфер всего пакета разрешаем прерыва-
ние UART по передаче;
- в подпрограмме прерывания при возникновении преры-
вания по пустому буферу FIFO передатчика, следует
прочитать данные из циклического передающего буфера
и записать в регистр буфера FIFO передатчика. При воз-
никновении очередного прерывания после передачи по-
следнего байта пакета (циклический буфер пуст) следует
запретить прерывания по передаче.
Передача байта по последовательному каналу (на выход
TxD) осуществляется записью его в регистр THR буфера FIFO
передатчика. Для канала UART0:
U0THR = chw;// байт chw на передачу
Считывание принятого через последовательный канал бай-
та (через вход RxD) осуществляется чтением его из регистра
RBR буфера FIFO приемника. Для канала UART0:
chr = U0RBR; // принятый байт сохраняем в chr
98
Организация циклических буферов
Рис. 4.9. Циклический буфер обмена
Буфер представляет собой одномерный циклический мас-
сив размером KeySize, состоящий из элементов типа unsigned
char (рис. 4.9). Доступ к буферу возможен при помощи двух
указателей, которые содержат индексы текущих позиций чте-
ния и записи: WP (указатель записи) и RP (указатель чтения).
После каждой операции чтения/записи соответствующий
указатель увеличивается на единицу, теперь он будет ссылать-
ся на следующий элемент массива. Поскольку буфер цикличе-
ский, необходимо контролировать выход указателей за преде-
лы массива (KeySize), поэтому, когда это происходит,
указателю присваивается начальное значение, т.е. он будет
указывать на первый элемент массива.
Когда буфер пуст, указатель чтения RP равен указателю
записи WP. Если буфер полностью заполнен, то указатель
записи указывает на элемент, расположенный перед элемен-
том, на который указывает RP. Если продолжительное время
в буфер производится запись и ничего не читается, то буфер
переполняется. В этом случае WP, «обойдя» весь буфер по
кругу, «догонит» RP. Если в случае переполнения продол-
жить запись в буфер, то это приведет к потере ранее занесен-
ных в него данных.
99
Пример записи принятого байта в циклический буфер
wbuffer в обработчике прерывания:
/* Запись принятого байта в буфер rbuffer */
if (WP ==wKeySize-l) /*Дошли до конца буфера?*/
i -0; /* Да, установить адрес на начало буфера */
else
i =WP+1; /*Нет, увеличить адрес в буфере*/
if (i != RP) /* Нет переполнения буфера?
(адрес для записи != адресу по чтению из буфера?) */
{
wbuffer[WP] = U0RBR; /*3апишем в буфер принятый байт */
WP = i; /* Установим адрес для записи следующего байта */
}
Пример чтения байта из циклического буфера rbuffer и пе-
редача в регистр THR.
/* Чтение принятого байта из буфера rbuffer */
if (RP != WP) // Буфер пуст?
{ //Нет
U0THR = rbuffer [RP]; //Прочитаем из буфера принятый байт
RP =RP+1; И Адрес для чтения очередного байта
if (RP == rKeySize) //Дошли до конца буфера?
RP =0; // Да, установить адрес на начало буфера
}
Организация обработчика прерывания
Все запросы на прерывание (изменение статуса линии Rx,
данные готовы, просрочка приема слова, буфер передатчика
пуст) вызывают одно и то же прерывание, и в обработчике эти
прерывания различаются программно путем анализа регистра
U0IIR.
Ниже приведены фрагменты файлов программы, выполня-
ющей обмен данными через интерфейс UART0 с использова-
нием подпрограммы обработки прерываний: заголовочный
файл serial.h и исходные файлы serial.с, main.c.
100
файл serial.h
#define UO_PINSEL (0x00000005) //настройка PINSELO на UART0
#define UO_PINMASK (OxOOOOOOOF) // маска PINSELO для UART0
#define BaudRate 9600 // скорость передачи бит/с
#define pclk 12000000 // частота периферийной шины
// задание формата передаваемых и принимаемых данных
#defme ULCR_CHAR_7
#define ULCR_CHAR_8
#define ULCR_STOP_1
#define ULCR_STOP_2
#define ULCR_PAR_NO
#define ULCR_PAR_EVEN
#define ULCR_PAR_ODD
#define ULCR_DLAB
#define UART_8N1
#define UART_7N2
#define UART_8E1
#define UART_8O1
2 // слово 7 бит
3 И слово 8 бит
(0«2) И 1 столовый бит
(1«2) И 1 стоповых бита
(0«3) // нет контроля передачи
(0«4) // контроль по четности
(1«4) // контроль по нечетности
(1«7) //1- доступ к делителю
(unsigned char)(ULCR_CHAR_8 + ULCR_PAR_NO + ULCR_STOP_1)
(unsigned char)(ULCR_CHAR_7 + ULCR_PAR_NO + ULCR_STOP_2)
(unsigned char)(ULCR_CHAR_8 + ULCR_PAR_EVEN + ULCR_STOP_1)
(unsigned char)(ULCR_CHAR_8 + ULCR_PAR_ODD + ULCR_STOP_1)
// задание режима работы буферов приема и передачи
// уровень заполнения RxFIFO до установки запроса
#defme UFCR_FIFO_TRIG1
#define UFCR_FIFO_TRIG4
#define UFCR_FIFO_TRIG8
#define UFCR_FIFO_TRIG14
#define UFCR_FIFO_ENABLE
#define UART_FIFO_1
#define UART_FIFO_4
#define UART_FIFO_8
#define UART_FIFO_14
0«6 //-1 СЛОВО
1«6 //-4 слова
2«6 //-8 слов
3«6 //-14 слов
1 //разрешить работу c FIFO буферами
(unsigned char)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG1)
(unsigned char)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG4)
(unsigned char)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG8)
(unsigned char)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG14)
/* Определения для регистра IER */
# define UIER_ERBFI (1 « 0) // Разрешить прерывание по готовности данных RxD
# define UIER_ETBEI (1 « 1) // Разрешить прерыв. при пустом буфере передатчика
# define UIER_ELSI (1«2) //Разрешить прерыв. по изменению статуса линии RxD
/* Определение типа для регистра IIR */
#define UIIR_NO_INT
#define UIIR_THRE_INT
#define UIIR_RDA_INT
#define UIIR_RLS JNT
#define UIIR_CTIJNT
#define UIIR_ID_MASK
(1« 0) // нет запросов на прерывание
(1 «1) // прерывание - буфер передатчика пуст
(2 « 1) // прерывание - Rx данные готовы
(3 « 1) // прерывание - изменение статуса Rx
(6 « 1) // прерывание - просрочка приема слова
ОхОЕ //маска прерываний для регистра UIIR
101
/* Определение типа для регистра LSR */
#define ULSR_RDR
#define ULSR_OE
#define ULSR_PE
#define ULSR_FE
#define ULSR_BI
#define ULSR_THRE
#define ULSR_TEMT
#define ULSR_RXFE
#define ULSR_ERR_MASK
(1 « 0) И RBR содержит непрочитанное слово
(1 « 1) И ошибка переполнения FIFO
(1 « 2) // ошибка паритета
(1 « 3) // ошибка стоп бита
(1 « 4) // на RxD постоянно 0 при приеме слова
(1«5) //THR пуст
(1 « 6) //и THR, и TSR пусты
(1 « 7) И RBR содержит ошибку Rx
OxlE //маска ошибок для регистра LSR
extern unsigned int RPrbuf, WPrbuf, RPwbuf, WPwbuf;
extern unsigned int rKeySize, wKeySize;
extern unsigned char rbuffer[], wbuffer[];
void uartO_Init(void); И
void interrupt_uartO_Init(void); //
void fErr(unsigned char i);
void fRx(unsigned char i);
void fTx(void);
void UART0_fRQ _IRQ(void)________irq;
файл serial.c
//include “lpc2292.h”
//include “serial.h”
unsigned int RPrbuf. WPrbuf. RPwbuf. WPwbuf;
unsigned int rKeySize. wKeySize;
unsigned char rbuffer[rKeySize], wbuffer[wKeySize];
rKeySize = 10;
wKeySize=20;
interrupt_uartO_Init() {
//разрешить прерывание от модуля UARTO
VICIntEnable = (1 « VIC_UART0);
//привязка модуля UARTO к третьему слоту и разрешение слота
VICVectCntl3 = 0x20 I (VIC_ UARTO);
// адрес обработчика загружаем в адреса вектора третьего слота
VICVectAddr3 = (unsigned) UARTOJRQ;
}
102
uartO_Init() {
//очистим биты конфигурации для РО.О и РО. 1
PINSELO &= - UO_PINMASK;
// настройка на альтернативные функции TxD (UART0) и RxD (UART0)
PINSELO 1= U0_PINSEL;
UOIER = 0x00;
UOIIR;
UORBR;
UOLSR;
// запрет всех прерываний
// очистка всех запросов прерываний
// очистка приемного регистра и сброс запроса
// сброс ошибок по изменению статуса линии
UOFCR = UART_FIFO_8;//3anpoc на прерывание в FIFO 8 слов
//формат - 8 бит, без паритета, 1 стоп, доступ к делителю разрешить
UOLCR = UART.8N1+ ULCR_DLAB;
// задание скорости обмена
U0DLL = pclk / (16 * BaudRate); // младший байт
U0DLM = (pclk / (16 * BaudRate))» 8; //старший байт
// запрет доступа к делителю - разрешение работы с буфером FIFO
UOLCR &= ~ ULCR_DLAB;
1
//подпрограмма обработки прерывания otUARTO
void UART0_IRQ _IRQ(void)____irq
{
unsigned char iir, Isr;
iir = UOIIR;
Isr = UOLSR;
if(!(iir& UIIR_NO_INT)){//ecTb запрос на прерывание
switch(iir& UIIR_ID_MASK){ //UOIIR 3:1, Interrupt Identification
case UIIR_CTI_INT: fEnflsr)^/ была ошибка статуса линии
break;
case UIIR_RDA_INT: fRx(lsr);// прием данных
break;
case UIIR_CTI_INT: IRx(lsr);// просрочка приема
break;
case UIIR_THRE_INT: fTx(lsr);// байт передан
break;
default:
break;
}
} else {
//нет запроса на прерывание
}
VICVectAddr - 0; // фиктивная запись - конец обработки прерывания
103
void fErr(unsigned char Isr) {
/* чтение регистра LSR идеигификация ошибки статуса линии
чтение принятого байта без записи в циклический буфер
по необходимости вывод сообщения об ошибке
*/
if(lsr & ULSR_ERR_MASK != 0) {
switch(lsr & ULSR_ERR_MASK) { И UOLSR 4:1 ошибки статуса линии
case ULSR_OE: ...// ошибка переполнения FIFO
break;
caseULSR_PE: ...
default:
break;
1
//идентификация ошибок, при необходимости вывод сообщения об ошибке
if(lsr & ULSR_RXFE) lsr=U0RBR; //сброс принятого слова
}
/* процедура чтения байт из FIFO приемника и запись в циклический буфер */
void fRx(lsr) {
int i;
while (Isr & define ULSR_RDR) // пока RBR FIFO буфер содержит данные
{
/* Запись принятого байта в буфер rbuffer */
if (WPrbuf ==rKeySize-l) /*Дошли до конца буфера?*/
i =0; /* Да, установить адрес на начало буфера */
else
i =WPrbuf+l; /*Нет, увеличить адрес в буфере*/
if (i != RPrbuf) /* Нет переполнения буфера?
(адрес для записи != адресу по чтению из буфера?) */
{
rbuffer[WPrbuf] = UORBR; /*Запишем в буфер принятый байт*/
WPrbuf = i; /♦ Установим адрес для записи следующего байта */
1
/* процедура чтения байт из циклического буфера и запись регистр THR FIFO передатчи-
ка */
void fTx(void) {
int i;
if (RPwbuf != WPwbuf) /* Буфер пуст? */
{ /♦ Нет ♦/
UOTHR = wbuffer[RPwbuf]; /*Байт из буфера на передачу */
RPwbuf =RPwbuf+l; /* Адрес для чтения очередного байта */
104
if (RPwbuf == wKeySize) /*Дошли до конца буфера?*/
RPwbuf =0; /* Да, установить адрес на начало буфера */
1
else { U0EIR& = ~ UIER_ETBEI);}//запрет прерывания - все данные переданы
}
файл main.h
файл main.c
•'/include “lpc2292.h”
//include “serial.h”
main() {
ini
interrupt_uartO_Init(); //инициализация вектора прерываний для UARTO
uartO_Init(); //инициализация UARTO
// разрешить прерывание по приему и изменению статуса линии RxD
UOEIR 1= UIER_ERBFI + UIER_ELSI;
while(l) //тело цикла
(
if (RPrbuf != WPrbuf) /♦ Если циклический приемный буфер не пуст, ♦/
{
// записываем принятый байт в массив сборки пакета
// если пакет принят правильно - на обработку
}
/♦ флаг flag_trans устанавливается в программе при необходимости передать пакет через
U ART*/
if(flag_trans) И если есть запрос на передачу данных
(
// формируем пакет в циклическом буфере для передачи
UOEIR 1= UIER_ETBEI;// разрешаем прерывание по передаче
}
105
4.2. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
1. Изучите структуру контроллера UART микроконтрол-
лера.
2. Изучите алгоритмы приема и передачи байта через по-
следовательный канал.
3. Изучите структуру контроллера прерываний микро-
контроллера.
4. Разработайте архитектуру драйвера последовательного
ввода-вывода.
5. Напишите драйвер последовательного ввода-вывода.
6. Разработайте программу (задания приведены в табл.4.8),
позволяющую вводить данные с персонального компью-
тера через последовательный интерфейс RS-232C, вы-
полнять определенные действия над данными и выво-
дить поясняющие надписи и результат вычислений на
персональный компьютер через последовательный ин-
терфейс RS-232.
7. Отладьте программу, откомпилируйте ее, проверьте ра-
ботоспособность последовательного порта в отладчике
Debug в окне Serial# 1.
8. Откройте в отладчике окно анализатора выполнения
процедур Performance Analyzer (РА). Сконфигурируйте
его, введя такие процедуры, как main, interrupt- и др.
9. Оцените распределение процессорного времени между
процедурами.
10. Создайте hex-файл и загрузите в стенд.
11. Убедитесь в работоспособности программы, запустив
на персональном компьютере программу терминала
Terminal.exe.
106
Задания для лабораторной работы
Таблица 4.8
№ варианта Задание
1 Ввести три трехзначных десятичных числа, найти максимальное из них и вывести его на PC
2 Ввести три трехзначных десятичных числа, найти максимальное из них и вывести его на PC
3 Ввести последовательно два трехзначных десятичных числа, найти их произведение и результат вывести на PC
4 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИЛИ» и вы- вести на PC в десятичной форме
5 Ввести последовательно два трехзначных десятичных числа, найти их сумму и результат вывести на PC
6 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИСКЛЮЧАЮЩЕЕ ИЛИ» и вывести на PC в десятичной форме
7 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «И» и вывести на PC в десятичной форме
8 Ввести последовательно два трехзначных десятичных числа, найти их разность и результат вывести на PC
9 Ввести последовательно два трехзначных десятичных числа, найти их сумму и результат вывести на PC
10 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИЛИ» и вы- вести на PC в десятичной форме
И Ввести три трехзначных десятичных числа, найти минимальное из них и вывести его на PC
12 Ввести последовательно два трехзначных десятичных числа, найти их произведение и результат вывести на PC
13 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИСКЛЮЧАЮЩЕЕ ИЛИ» и вывести на PC в десятичной форме
14 Ввести последовательно два трехзначных десятичных числа, найти их разность и результат вывести на PC
15 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «И» и вывести на PC
107
4.3. СОДЕРЖАНИЕ ОТЧЕТА
Для написания отчета необходимо изучить литературу,
предложенную в конце раздела.
Отчет должен содержать:
- описание архитектуры:
• используемой аппаратной части;
• драйверов;
• системы тестирования;
- описание API-драйверов;
- исходные тексты драйверов;
- алгоритм программы, исходные тексты, результаты.
4.4. КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Какова особенность организации последовательного
в вода-вы вода?
2. Каков состав драйвера последовательного обмена?
3. Как происходит доступ к буферу обмена данными?
Учебно-методическое обеспечение
1. Учебный стенд SDK-2.0. Руководство пользователя
2. LPC2xx. Руководство пользователя.
3. Мясников В.И. Проектирование встраиваемых микропроцессор-
ных систем: учебное пособие. Йошкар-Ола: МарГТУ, 2010. 400 с.
4. Программа-терминал Terminal.exe.
108
ЛАБОРАТОРНАЯ РАБОТА № 5
КЛАВИАТУРА
Цель работы - освоение принципов ввода информации с
клавиатуры.
В процессе выполнения работы необходимо изучить:
- аппаратную часть:
• схему включения клавиатурной матрицы;
• принцип сканирования клавиатуры;
• порты управления клавиатурой;
- программную часть:
• алгоритм сканирования клавиатурной матрицы;
• организацию обработчика прерывания;
• устранение дребезга контактов.
5.1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
Матричная клавиатура
Если в устройство требуется включить значительное коли-
чество клавиш, то их организуют в виде матрицы, у которой
клавиши включены на пересечении рядов и столбцов. На ри-
сунке 5.1 представлена схема матрицы 4x4, подключенной к
входным и выходным портам микроконтроллера. Идентифи-
кация нажатой клавиши осуществляется по методу сканирова-
ния. Сущность этого метода заключается в следующем: в каж-
дый момент времени программным путем только на одной из
выходных вертикальных линий (COL Н COL 4) формируется
сигнал логического нуля, на остальных вертикальных линиях
должен быть уровень логической единицы. Выдача сигнала О
последовательно повторяется для каждой выходной линии, т.е.
возможны следующие выходные комбинации: 1110, 1101,
1011, 0111. После установки выходной комбинации контрол-
109
лер опрашивает горизонтальные линии матрицы (ROW 1-ь
ROW 4). Если при этом некоторая горизонтальная линия
ROWi приобретет значение 0, то имеется возможность про-
граммным путем определить нажатую клавишу, так как сигнал
на входной горизонтальной линии будет иметь значение О
только в случае, когда нажатая клавиша соединяет её с верти-
кальной линией, на которой в данный момент времени присут-
ствует уровень 0.
Рис. 5.1. Схема подключения клавиатуры к входному и выходному портам
Распознавание одновременного нажатия нескольких кла-
виш может быть осуществлено путем анализа входных линий
- наличие в принятом коде больше одного 0.
Защиту от дребезга контактов можно реализовать, напри-
мер, повторным считыванием клавиатуры через некоторую
временную задержку.
110
Иногда вводят функцию автоповтора клавиши, заключаю-
щуюся в выдаче повторного нажатия при длительном удержа-
нии клавиши.
Диоды D1 D4 служат для защиты выходных портов от за-
мыкания между собой при одновременном нажатии двух и бо-
лее клавиш. Так, если бы не было диодов и при сканировании
на выходном порту Ро.О был установлен уровень логического
О (О В), а на порту Ро.1 установлен уровень 1 (+5 В), то при
одновременном нажатии клавиш @ и © эти выходные порты
замкнулись бы между собой, вызвав протекание значительного
тока от Ро.1 к Ро.О. В результате выходные порты могут вый-
ти из строя. Диоды препятствуют протеканию тока при одно-
временном нажатии клавиш.
Резисторы R1 + R4 служат для задания потенциала логиче-
ской 1 (+5 В) на входных портах Pi.О Pi.3 при отсутствии
нажатия клавиш в соответствующих линиях ROWi. Известно,
что входы логических элементов должны быть под внешним
потенциалом: или подсоединены к выходу логического эле-
мента, или потенциал задается путем подключения к источни-
ку питания (к земле или к + 5 В). В нашем случае потенциал
задается подключением к + 5 В через резистор, так как при
нажатии клавиши входной порт будет соединен с выходным
портом и, кроме того, логическая единица на входном порту
при чтении состояния клавиатуры означает отсутствие нажа-
тия клавиш (сканирование осуществляется подачей логическо-
го 0).
Дребезг
Кроме идентификации, программное обеспечение должно
исключить влияние переходных процессов, так называемый
«дребезг» контактов. При замыкании и размыкании переклю-
чателей в цепи, в момент опроса, возникают импульсные по-
мехи, которые могут восприниматься как многократное нажа-
111
тие клавиши (рис. 5.2). Поскольку процессор обладает высо-
ким быстродействием, то он может воспринять эти скачки
напряжения как несколько нажатий.
"дребезг" при замыкании "дребезг" при размыкании
JT
>;т;< >-<
Рис. 5.2. Явление дребезга контактов
Программную защиту от дребезга контактов наиболее про-
сто осуществить путем чтения состояния клавиатуры через
время, превышающее постоянную времени т механической
системы - кнопки.
Постоянная времени срабатывания клавиатуры зависит от
ее конструкции и лежит в пределах 1 мс ч- 20 мс. Если чтение
попало на момент дребезга и идентифицировалось как отсут-
ствие нажатия, то в следующем цикле опроса будет принято
решение о нажатии, так как к тому времени система перейдет
в устойчивое состояние. Если чтение попало на момент дре-
безга и идентифицировалось как нажатие, то сразу будет при-
нято решение о нажатии.
Недостаток такого способа - нет защиты от случайных по-
мех, однако, если расстояние от контроллера до клавиатуры
составляет несколько сантиметров, такой способ приемлем.
Опрос клавиатуры через заданные промежутки времени
наиболее просто осуществить, задействуя систему прерывания
по таймеру.
На рисунке 5.3 представлена блок-схема подпрограммы
прерывания, работающая по данному алгоритму. На блок-
схеме переменная stage устанавливается в 1 при обнаружении
нажатия и сбрасывается при отпускании клавиши.
112
Рис. 5.3. Блок-схема подпрограммы опроса клавиатуры
Пример установки в 0 очередной линии выходного порта Ро
может быть следующим:
Ипе++;
line &= 3;//номер линии COLi = 0 - 3
ИЗ
Port_Po &= ~mask_KB_Po;//o4HiuaeM линии сканирования
Port_Po 1= scan_KB_Po[lineJ;//очередной скан код
В этом примере:
mask_KB_Po - маска линий сканирования порта Ро, напри-
мер, для 32-разрядного порта может быть равна OxOOOFOOOO;
scan_KB_Po[] - массив последовательных скан кодов,
например, [ОхОООЕОООО, OxOOODOOOO, ОхОООВОООО,
0x00070000].
Пример чтения состояния клавиатуры с входного порта
может быть следующим:
kod &= ~Port_Pi & mask_KB_Pi;,
где mask_KB_Pi - маска входных линий порта Pi от клавиату-
ры. Если клавиша не нажата, kod будет равен 0.
Пример вычисления кода нажатой клавиши может быть
следующим:
for(i=0; !(kod & row_Pi[i]);i++);
row=i;
key = (line « 2) I row + 1 'JI код нажатой клавиши (1-ь 16),
где row_Pi[i] - массив состояний входных линий клавиатуры,
например, [0x00010000, 0x00020000, 0x00040000, 0x00080000].
Подключение клавиатуры в стенде SDK-2.0
На рисунке 5.4 показан фрагмент схемы стенда, содержа-
щий клавиатуру, а на рисунке 5.5 представлена схема подклю-
чения входных и выходных линий клавиатуры к портам мик-
роконтроллера. Сканирование клавиатуры осуществляется
через выходные порты Р2.16 + Р2.19 (сигналы KBLEDCOL0
ч- KB_LED_COL3), а чтение состояния клавиатуры - через
входные порты Р2.23 Р2.25, Р2.27 (сигналы KB_ROW0 +
KB_ROW3).
114
Рис.5.4. Фрагмент схемы подключен!
[я клавиатуры в стенде SDK-2.0
о Ш O> co г*, co ю co 35
££££££ ££
CCA_________]_
+3.3V 7
-л: 3
PO 21
P1 19 TRPKT3 7
__________a.
GND &
FIFO m
KB ROWO n
KB R0W1 19
KB RO’.'.C 13
+3 - 7 "14
P1 18 TRPKT2 15
KB R0W3 16
P^ 17
P2.22/D22
V3
VSS
P0.21/PWM5/CAP1.3
P0.22/CAP0.0/MAT0.0
P0.23/RD2
P1.19/TRACEPKT3
P0.24/TD2
VSS
P2.23/D23
P2.24/D24
P2.25/D25
P2.26/D26/BOOTO
V3A
P1.18/TRACEPKT2
P2.27/D27/BOOT1
P2.28/D28
Рис. 5.5. Фрагмент схемы подключения линий клавиатурной матрицы
к портам микроконтроллера
На рисунке 5.4 видно также, что сигналы KBLEDCOLO ч-
KB_LED_COL3 используются управления индикацией свето-
диодов DI4 ч- D21. Чтобы сканирование не влияло на свече-
ние, сигналы отвечают за активность светодиодов D14 + D17 и
D18 ч- D21 соответственно. Активизация каждой из четверок
происходит при установлении сигналов LED_ROWi в состоя-
ние логической 1.
116
Таким образом, для ввода данных с клавиатуры необхо-
димо настроить порты Р2.16 Р2.19 (сигналы
KBLEDCOLO -5- KB_LED_COL3) на вывод, а порты Р2.23
+ Р2.25, Р2.27 (сигналы KB_ROWO + KB ROW3) - на вход.
Кроме того, порты Р2.20 и Р2.21 (сигналы LED_ROWO и
LED_ROW1) следует настроить на вывод и записать в них 1
либо настроить на ввод. Во втором случае светодиоды также
будут неактивными вследствие закрытия транзисторов Q5 и
Q6 посредством подтягивания базы резисторами R31 к
земле.
Драйвер клавиатуры, настройка таймера
Драйвер (рис. 5.6) состоит из обработчика прерывания от
таймера, циклического буфера чтения и API-функции чтения
скан-кода нажатой клавиши. Драйвер клавиатуры работает по
прерыванию от таймера. Во время прерывания производится
опрос матрицы клавиатуры, и, если нажата какая-либо клави-
ша, ее код заносится в буфер драйвера. Чтение символа из бу-
фера драйвера производится с помощью API-функции чтения
ReadKeyBuffer(), которая в случае удачного завершения воз-
вращает считанный из буфера байт, а в случае, если буфер
пуст, возвращает 0.
Запрос на прерывание можно организовать через модуль
совпадений таймера. В случае разрешения прерывания, оно
будет вызываться при совпадении содержимого таймера ТС и
содержимого регистра совпадений MR. Следует также задать
режим работы таймера при совпадении (в регистре MCR) -
сброс в 0, что позволит организовать периодический вызов
прерывания. Задание частоты прерывания зависит от частоты
периферийной шины pclk, от предделителя частоты PR и со-
держимого регистра совпадений MR. Так как выходы модуля
117
совпадения в случае опроса клавиатуры не используются, со-
ответствующие разряды регистра управления выходами сов-
падений EMR следует обнулить.
Рис. 5.6. Структура драйвера клавиатуры
Пусть для организации прерываний использованы таймер
ТО и регистр совпадений MR0. Частота прерываний выбрана
50 Гц (период опроса клавиатуры = 20 мс). Частота перифе-
рийной шины pclk = 12 МГц. Если выбрать значение предде-
118
лителя частоты = 12, то на таймер будет поступать частота
1 МГц. В регистр совпадений следует записать число
1 МГц / 50 Гц = 20000.
Тогда инициализация таймера будет выглядеть следующим
образом:
T0PR =12; // коэффициент предделителя
T0MR0 = 20000; И регистр совпадения задает частоту прерывания
T0EMR &= ~EMR_MR0_clear_bit;// не управлять выходом МАТО.О
T0MCR 1= (1 « MCR_MR0_clear_bit); // сброс ТО при совпадении
T0MCR 1= (l«MCR_MR0_int_bit); // разреш. прерывания по MR0
Для запуска таймера на счет в основной программе следует
установить бит разрешения счета:
T0TCR = 1; // запуск таймера ТО
Организация буфера обмена RFIFO
Буфер клавиатуры организован аналогично буферам драй-
вера последовательного обмена.
Доступ к буферу возможен при помощи двух указателей,
которые содержат индексы текущих позиций чтения и записи:
WP (указатель записи) и RP (указатель чтения). После каждой
операции чтения/записи соответствующий указатель увеличи-
вается на единицу, теперь он будет ссылаться на следующий
элемент массива.
Поскольку буфер циклический, необходимо контролиро-
вать выход указателей за пределы массива, поэтому, когда это
происходит, указателю присваивается начальное значение, т.е.
он будет указывать на первый элемент массива. Когда буфер
пуст, указатель чтения RP равен указателю записи WP. Если
буфер полностью заполнен, то указатель записи указывает на
элемент, расположенный перед элементом, на который указы-
вает RP.
119
Приведем пример записи скан-кода kod в буфер RFIFO.
/* Запись кода в буфер клавиатуры и установка признака нажатия*/
if (WP ==KeySize-1) /*Дошли до конца буфера?*/
i =0; /* Да, установить адрес на начало буфера */
else
i =WP+1; /*Нет, увеличить адрес в буфере*/
if (i != RP) /* Нет переполнения буфера?
(адрес для записи не равен адресу по чтению из буфера?) */
{
RFIFO[ WP] = kod; /* Запишем в буфер код по адресу записи */
WP = i; /* Установим новый адрес для записи будущего кода */
}
Настройка контроллера векторных прерываний
е) разрешение прерывания от таймера ТО
VTCIntEnable = (1 « VTC_TTMER0); /^разрешить прерывание
от таймераТО /*
f) задания приоритета прерывания (например, привя-
жем его ко второму слоту)
VTCVectCntl2 = 0x20 I (VIC_TTMER0); /*привязка таймера
ТО ко второму слоту и разрешение этого слота */
g) привязка источника прерывания к соответствующей
подпрограмме обработки прерывания
VICVectAddr2 = (unsigned) TimerT0_IRQ; /* адрес обработчика
загружаем в адреса вектора второго слота */
h) подпрограмма обработки прерывания
Подпрограмма обработки прерывания должна заканчи-
ваться сбросом флагов прерываний периферийного устрой-
ства, сгенерировавшего запрос на прерывание, и в конце об-
120
работника прерывания необходимо выполнить холостую опе-
рацию записи в общий регистр адреса прерывания
VICVectAddr:
void TimerTO_IRQ(void) _irq //описание п/п обработки прерывания
{
T0TR 1= (1« flagMR0);/*c6poc запроса на прерывание по
И совпадению регистра MR0 */
VICVectAddr = 0; /* фиктивная запись - конец обработки
прерывания */
}
Ниже приведены фрагменты файлов программы опроса
клавиатуры: заголовочные файлы ports.h, timers.h, interrupts.h
keyboard.h и исходные файлы keyboard.c, interrupts.c. main.с.
файл ports.h
/* настройка портов для работы с клавиатурой */
extern (void) keyboard_init (void);
файл ports.c
//include “lpc2292.h”
//include “ports.h”
(void) keyboard_init (void)
{
PINSEL2 &= ~(P_04 + P_05); // выводы порта P2 - порты ввода/вывода
IO2SET1= (P_16 + P_17 + P_18 + P 19);// на выходные порты единицы
IO2DIR 1= (Р_16 + Р_17 + Р_18 + Р_19);// выходные порты клавиатуры
IO2DIR &1= ~( Р_23 + Р_24 + Р_25 + Р_27)У/ входные порты клавиатуры
IO2DIR &1= ~(Р_20 + Р_21)У/ входные порты активизации светодиодов (выкл. св/д)
}
121
файл timers.h
#define pclk 12000000 //частота периферийной шины
#define divide_pclk_T0 12 // коэффициент предделителя
#define freq_interrupt 50 // частота опроса клавиатуры
#define vel_MR0 pclk I divide_pclk_T01 freq_interrupt //загрузить в MR0
#define MCR_MR0_clear_T0 1 // бит сброса TO при совпадении
#define MCR_MRO_en_interrupt 0 // бит разрешения прерывания при совпадении
extern (void) timerTO_init (void);
файл timers.c
//include “lpc2292.h”
^include “timers.h”
(void) timerTO_init (void)
(
unsigned int vel_MR0y/ значение для загрузки в MR0
T0PR = divide_pclk_TO; // коэффициент предделителя
TOMRO = vel_MR0; И регистр совпадения задает частоту прерывания
T0EMR &= ~EMR_MR0_clear_bit;// не управлять выходом МАТО.О
T0MCR 1= (1 « MCR_MR0_clear_T0); // сброс ТО при совпадении
T0MCR 1= (1« MCR_MRO_en_interrupt); // разреш. прерывания по MR0
}
файл interrupts.!!
#define flagMRO 0 // номер разряда регистра IR запрос на прерывание по MR0
extern unsigned int RPbuf. WPbuf;
extern unsigned int KeySize.;
extern unsigned char buffer[rKeySize];
void TimerT0_IRQ(void) ____irq;
extern (void) interrupt_TO_init(void);
файл interrupts.c
//include “lpc2292.h”
//include “interrupts.h”
unsigned int RPbuf. WPbuf;
122
unsigned int KeySize;
unsigned char buffer[ KeySize];
KeySize = 10;
(void) interrupt_TO_init(void) {
//разрешить прерывание от таймера ТО
VICIntEnable = (1 « VIC_TIMER0);
//привязка таймера ТО к третьему слоту и разрешение слота
VICVectCntl2 = 0x20 I (VIC_TIMER0);
// адрес обработчика загружаем в адреса вектора второго слота
VICVectAddr2 = (unsigned) TimerT0_IRQ;
}
void TimerT0_IRQ(void) ___irq //описание п/п обработки прерывания
{
/*
сканирование клавиатуры
чтение состояния клавиатуры
идентификация нажатой клавиши
запись кода нажатой клавиши в циклический буфер
*/
T0IR 1= (1« flagMR0);/*c6poc запроса на прерывание по
И совпадению регистра MR0 */
VICVectAddr - 0; /* фиктивная запись - конец обработки прерывания */
}
файл main.c
•'/include “lpc2292.h”
//include “interrupts.h”
//include “timers.h”
//include “ports.h”
keyboard_init();
i nterrupt_TO_init();
timerTO_init (void);
main() {
int key
interrupt_init(); //инициализация вектора прерываний
keyboard _init(); //инициализация портов для клавиатуры
123
timerTO_init (void);// инициализация таймера
TOTCR = 1; // запуск таймера ТО
while(l) //тело цикла
{
if (kye=ReadKeyBuffer()) /* Если циклический приемный буфер не пуст, */
{
// обрабатываем принятый код
5.2. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
1. Изучите схему включения клавиатурной матрицы.
2. Изучите алгоритмы сканирования клавиатуры.
3. Изучите алгоритм формирования скан-кода нажатой
клавиши.
4. Изучите алгоритм подавления дребезга контактов.
5. Изучите структуру контроллера прерываний микро-
контроллера.
6. Разработайте архитектуру драйвера опроса клавиатуры.
7. Напишите драйвер клавиатуры.
8. Напишите программу, осуществляющую ввод информа-
ции с клавиатуры, ее отображение на PC в соответствии
с заданием, выданным преподавателем (табл. 5.1). Кла-
вишу «#» использовать как подтверждение ввода, а кла-
вишу «*» - как сброс операции.
9. Откомпилируйте программы, создайте загрузочный
файл.
10. В программе-отладчике Debug проверьте правильность
функционирования разработанного алгоритма.
11. Подключите стенд к компьютеру. Включите стенд.
12. Загрузите программу в стенд.
13. Отладьте и протестируйте драйвер.
124
Таблица 5.1
Задания для лабораторной работы
№ варианта Задание
1 Ввести последовательно два трехзначных десятичных числа, найти их разность и результат вывести на PC
2 Ввести последовательно два трехзначных десятичных числа, найти их сумму и результат вывести на PC
3 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИЛИ» и вы- вести на PC
4 Ввести последовательно два трехзначных десятичных числа, найти их произведение и результат вывести на PC
5 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИСКЛЮЧАЮЩЕЕ ИЛИ» и вывести на PC
6 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «И» и вывести на PC
7 Ввести последовательно два трехзначных десятичных числа, найти их разность и результат вывести на PC
8 Ввести последовательно два трехзначных десятичных числа, найти их сумму и результат вывести на PC
9 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИСКЛЮЧАЮЩЕЕ ИЛИ» и вывести на PC
10 Ввести последовательно два трехзначных десятичных числа, найти их произведение и вывести результат на PC
И Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «И» и вывести на PC
12 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИЛИ» и вы- вести на PC
13 Ввести три трехзначных десятичных числа, найти максимальное из них и вывести его на PC
14 Ввести три трехзначных десятичных числа, найти максимальное из них и вывести его на PC
15 Ввести три трехзначных десятичных числа, найти минимальное из них и вывести его на PC
125
5.3. СОДЕРЖАНИЕ ОТЧЕТА
Для написания отчета необходимо изучить литературу,
предложенную в конце раздела.
Отчет должен содержать:
- описание архитектуры:
• используемой аппаратной части;
• драйверов;
• системы тестирования;
- описание API-драйверов;
- исходные тексты драйверов;
- исходные тексты заданной программы;
- результаты работы программы.
5.4. КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Какова особенность организации опроса клавиатурной
матрицы?
2. Для чего установлены диоды в клавиатурной матрице?
3. Для чего служат резисторы, подключаемые к клавиатур-
ной матрице?
4. Каков состав драйвера клавиатуры?
5. Как происходит сканирование клавиатурной матрицы?
6. Как устраняется дребезг контактов?
7. Каковы особенности настройки портов, к которым под-
ключена клавиатура в стенде?
8. Как осуществляется развязка клавиатуры и линейки све-
тодиодов?
9. Как формируется скан-код нажатой клавиши?
10. Опишите состав драйвера клавиатуры.
11. Для чего в состав драйвера входит буфер RFIFO? Пояс-
ните особенности его функционирования.
126
Учебно-методическое обеспечение
1. Учебный стенд SDK-2.0. Руководство пользователя.
2. LPC2xxx. Руководство пользователя.
3. Мясников В.И. Проектирование встраиваемых микропроцессор-
ных систем: учебное пособие. Йошкар-Ола: МарГТУ, 2010. 400 с.
4. Программа-терминал Terminal.exe.
127
ЛАБОРАТОРНАЯ РАБОТА № 6
ГРАФИЧЕСКИЙ ЖИДКОКРИСТАЛЛИЧЕСКИЙ
ИНДИКАТОР
Цель работы - освоение принципов вывода информации
на графический ЖКИ.
В процессе работы необходимо изучить:
- аппаратную часть:
• схему включения ЖКИ;
• принцип работы с ЖКИ;
• порты управления ЖКИ;
- программную часть:
• алгоритм вывода информации на ЖКИ;
• алгоритм вывода алфавитно-цифровой информа-
ции;
• функции формирования элементарных фигур.
6.1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
Видимая область графического индикатора представляет
собой матрицу точек (пикселей), включение/выключение ко-
торых позволяет формировать как алфавитно-цифровую, так и
графическую информацию.
В SDK-2.0 установлен графический черно-белый ЖКИ
WG12232 с разрешением 122x32 пиксела.
Структура ЖКИ WG12232
Дисплей управляется двумя идентичными чипами, работа-
ющими независимо. Один управляет левыми точками дисплея,
второй - правыми. Поэтому вывод графической информации
пересекающей середину дисплея, может представлять некую
сложность.
128
Формирование изображения осуществляется записью по-
следовательности байт в соответствующие позиции экрана.
Байт отображается в виде вертикального столбца пикселей,
свечение которых зависит от значения бит в байте.
Операции чтения и записи (кроме режима чтение-
модификация-запись) автоматически увеличивают позицию
слева направо, таким образом, следующая операция чтения и
записи будет изменять/возвращать значения восьми пикселей
следующего столбца. После достижения 80-й колонки адрес
увеличиваться не будет.
У чипов SED1520 есть «обратный» режим работы, при этом
колонки нумеруются справа налево, соответственно операции
записи/чтения, увеличивая адрес, смещают позицию записи
влево. Этот режим удобен в случае, если дисплей расположен
вверх ногами.
Чипы предназначены для вывода информации в восемьде-
сят столбцов, в то время как на дисплее отображается только
по 61 столбцу, правые 19 столбцов не отображаются. Поэтому
в обратном режиме первый видимый столбец имеет номер 19
(рис. 6.1).
Часть, управляемая
вторым чипом по
сигналу CS2
World!
Часть, управляемая
первым чипом по
сигналу CS1
Младший бит
Старший бит
страница 0
страница 1
страница 2 {
страница 3 ।
номер колонки 1
в прямом режиме 0
в обратном режиме 79
Чип 1 (CS1)
60
19
о
79
Чип 2 (CS2)
60
19
.Адресация видеопамяти
Рис. 6.1. Структура графического индикатора
129
Структура видеопамяти
Видеопамять ЖКИ состоит из двух независимых частей.
Каждая часть имеет 4 страницы (с 0 по 3).
Страница памяти вмещает в себя 8 строк (с 0 по 7) и 61 ко-
лонку (с 0 по 60) (рис. 6.2).
0..60 0..60
о Страница 0 Страница 0
о Страница 1 Страница 1
о Страница 2 Страница 2
о Страница 3 Страница 3
Рис. 6.2. Структура видеопамяти
При записи в видеопамять, младший бит кодирует верхний
из восьми пикселей, старший - нижний (рис. 6.3). Включение
обратного режима не изменяет назначение бит.
Направление заполнения
Страница 1
Рис. 6.3. Пример записи байта 0x85 в видеопамять
130
Интерфейс ЖКИ
Интерфейс представляет собой восьмиразрядную шину
данных (D0...D7), одноразрядную шину адреса и шину управ-
ления, которая задает режимы чтения/записи информации, вы-
бор контроллера и тактовую частоту для ЖКИ.
В таблице 6.1 представлен интерфейс ЖКИ.
Таблица 6.1
Интерфейс ЖКИ
Линии интерфейса Назначение
D0..D7 Шина данных
АО Адресная линия. 1 - данные, 0 - команды
#CS1 Сигнал «выбор кристалла 1». Выбирается пер- вый контроллер SED1520. Активный уровень низкий
#CS2 Сигнал «выбор кристалла 2». Выбирается вто- рой контроллер SED1520. Активный уровень низкий
CL Использование внешней тактовой частоты 2 кГц
RD Сигнал «чтение»
WR Сигнал «запись»
#RES Сброс. Активный уровень низкий
Система команд
В таблице 6.2 приведена система команд индикатора.
Вывод данных на дисплей
При выполнении команды записи информации, она обнов-
ляется на дисплее в выбранной позиции и номер текущей ко-
лонки автоматически увеличивается на один (рис. 6.4) (если
только он не достиг 80, после чего номер колонки уже не уве-
личивается).
Чтение данных из памяти дисплея
Чтение данных с дисплея представляет некоторую слож-
ность. Дело в том, что информация, появляющаяся на шине
131
Система команд индикатора
Таблица 6.2
Команда AO #RD #WR D7 D6 D5 D4 D3 D2 DI DO Описание
Display ON/OFF 0 1 0 1 0 1 0 1 1 1 1/0 1 - включение. 0 выключение ЖКИ
Start Line 0 1 0 1 1 0 Display start address (0..31) Установка стартового адреса строки
Set page address 0 1 0 1 0 1 _Ll | PaggO.3 Установка номера страницы
Set Column address 0 1 0 0 Column address (0..79) Установка стартового адреса колонки
Read status 0 0 1 Busy | ADC ON\OFF RESET 0 0 0 0 Чтение статуса ЖКИ
Write Display Data 1 1 0 Write Data Записываемые данные
Read Display Data 1 0 1 Read Data Прочитанные данные
Select ADC 0 1 0 1 0 1 0 о 0 0 1/0 Задание направления вывода. 0 - прямой вывод. 1 - обратный
Static Drive ON/OFF 0 1 н 1 0 1 0 '! 1 0 1/0 1 - статический режим. 0 - обычный режим.
Select duty 0 1 0 1 0 1 0 1 0 0 1/0 Выбор скважности работы с ячейкой ЖКИ 0-1/32 1 -1/16
Read Modify Write (1 1 0 1 1 1 0 0 0 0 0 Режим «чтенне-модификация-запись»
End 0 1 0 1 1 1 0 1 1 1 0 Выключение «чтение-моднфнкация-запнсь»
Reset 0 1 0 1 1 1 0 0 0 1 0 Перевод адреса строки и колонки на исход- ную (нулевую) позицию
и и и lt-
DATA ---( N )------( N*1 ) ( N+2 ) ( N*3 )-
Рис. 6.4. Временные диаграммы записи в индикатор
данных, отражает не содержимое видеопамяти в текущей по-
зиции, а содержимое внутреннего буфера. После чего в буфер
заносится содержимое текущей ячейки, а номер колонки (если
он меньше 80 и если не выбран режим «чтение-модификация-
запись») увеличивается на I. Таким образом, операция чтения
всегда запаздывает на одну позицию.
Сразу после выполнения команды, в том числе и операции
записи, буфер содержит случайную величину. Поэтому, если
предыдущей операцией была не операция чтения, требуется
выполнять одну холостую операцию чтения, которая загрузит
в буфер информацию с текущей позиции (рис. 6.5).
Рис. 6.5. Временные диаграммы чтения из индикатора
Режим «чтение-модификация-запись»
Режим предназначен для изменения некоторого участка на
дисплее. Режим включается выбором соответствующей ко-
манды. В этом режиме операция чтения не увеличивает номер
текущей колонки, увеличение происходит только после вызова
операции записи. Однако по-прежнему чтение происходит че-
рез промежуточный буфер, который сразу после операции за-
133
писи содержит случайное число, поэтому для получения акту-
альных данных требуется одно холостое чтение. Пока этот ре-
жим активен, команды выбора колонки и страницы не дей-
ствуют. Отключается режим передачей соответствующей
команды. При включении режима текущая позиция запомина-
ется в буфере, а после его отключения - восстанавливается.
Выбор индекса верхней строки
Дисплей может «прокручивать» изображение вертикально.
При этом строки, выходящие за верх дисплея, будут отобра-
жаться снизу. Команда Start Line (OxCO+roll, где roll в пределах
от 0 до 31), выбирает индекс верхней отображающейся строки.
Static Drive
Включение режима работы со статичными LCD-дисплеями.
Для данной модели должен оставаться отключенным. Команда
для отключения - Static Drive OFF (0хА4).
Скважность
Контроллер предназначен для работы с различными дис-
плеями. Для данного дисплея скважность должна быть уста-
новлена 32, командой Select duty (0хА9).
Чтение состояния дисплея (статус ЖКИ)
Логическая единица в бите BUSY означает, что контроллер
ЖКИ занят выполнением команды, низкий - готов к приёму
новых команд.
Состояние бита ADC индицирует о наличии прямого («1»)
или обратного («О») режима работы.
Состояние бита ON/OFF, равного «1», свидетельствует о
том, что контроллер отключен и не управляет своей частью
дисплея, «О» - что контроллер включен.
134
Бит RESET: высокий уровень означает, что контроллер
дисплея выполняет функцию сброса, низкий уровень - нор-
мальный режим работы.
Схема подключения ЖКИ к микроконтроллеру
ЖКИ входит в состав консоли, схема интерфейса которой
представлена на рисунке 6.6.
CONSOLE
+5V
+3 ЗУ
D(7 ..Oil
АО
nRD
nWR
nRES
+5V
+3.3V
KB_LED_COL[3 .0]^
KB_ROW[3 0]»-
LED_ROW[1 .0]<
GND SND<
nCS1
nCS2
D|7a
_____IND CL
_____nOE
nWR
nRES
IND nCS1
IND nCS2
KB LED COL[3 0]
KB ROW[3 .0]
LED ROWn 01
Рис. 6.6. Сигналы интерфейса консоли (клавиатура, дисплей, светодиоды)
Схема связи дисплея с сигналами консоли представлена на
рисунке 6.7. В таблице 6.3 показана связь сигналов дисплея с
портами микроконтроллера. Отсюда можно сделать вывод о
том, что ЖКИ подключена к микроконтроллеру как два банка
внешней памяти. Таким образом, операции записи информа-
ции в индикатор и чтение его состояния должны выполняться
как операции работы с памятью. Например, если адрес ячейки
памяти находится в переменной il_data, то запись информации
в ячейку будет выглядеть следующим образом:
135
*il_data = char;
Для работы с индикатором как с внешней памятью необхо-
димо настроить контроллер внешней памяти в файле Startup.
Рис. 6.7. Схема связи дисплея с сигналами консоли
Таблица 6.3
Связь сигналов дисплея с портами МК
Название Порт LPC2292 Направление Описание
IND.nCSl P3.25/CS2 Выход Сигнал «выбор кристалла». Вы- бор первого контроллера ЖКИ
IND_nCS2 P3.24/CS3 Выход Сигнал «выбор кристалла». Вы- бор второго контроллера ЖКИ
IND.CL P0.12/MAT1.C Выход Сигнал синхронизации ЖКИ
nOE Pl.l /ОЕ Выход Сигнал «Чтение» (Output Enable)
nWR P3.27 / WR Выход Сигнал «Запись»
Al P3.1/A1 Выход Линия адреса 1 - данные. 0 - команды
D7 ... DO P2.7...P2.0 ZD7 ... DO Вход /Выход Шина данных
136
Настройка файла Startup
Настройка контроллера внешней памяти (ЕМС)
Ц)£йе Edit View Rroject fiebug Fljsh Peripherals Tools JVCS Window Help
ExpandAl | CofapteAl | Help |
Option
И Steck Configuration (Steck Sizes in Bytes)
И VPBDIV Setup
IS PLL Setup
ffl MAM Setup
В External Memory Controller (EMC)
В Bank Configuration 0 (BCFGO)
IDCY: Idle Cycles
WST1: Wait States 1
WST2: Wait States 2
RBLE: Read Byte Lane Enable
WP: Write Protect
BM: Burst ROM
MW: Memory Width
® Bank Configuration 1 (BCFG1)
В Bank Configuration 2 (BCFG2)
IDCY: Idle Cycles
WST1: Wait States 1
WST2: Wait States 2
WP: Write Protect
BM: Burst ROM
MW: Memory Width
В Bank Configuration 3 (BCFG3)
©CY: Idle Cycles
WST1: Wait States 1
WST2: Wait States 2
RBLE: Read Byte Lane Enable
WP: Write Protect
BM: Burst ROM
MW: Memory Width
E): и •» Ф
\ Text Editor / Configuration Wizard /
1=1 man 1=1 n< 1=1 Martin
Рис. 6.8. Настройка контроллера внешней памяти
Для контроллера ЕМС внешняя память представляется в
виде четырех банков (BankO - ВапкЗ) емкостью по 16 Мбайт
137
каждый. Микроконтроллер, в зависимости от того, к какому
банку идет обращение, вырабатывает соответствующий сигнал
разрешения CSi. В качестве банков могут применяться различ-
ные виды памяти, а также внешние устройства с соответству-
ющим интерфейсом. Каждый банк может быть активизирован
с заданием параметров соответствующего устройства.
Для каждого банка настраиваются следующие параметры:
величина задержки при переключении банков, величина удер-
жания сигнала записи (можно работать с медленными устрой-
ствами), работа с 8-разрядными устройствами, ширина шины
данных устройств (8, 16, 32). В стенде SDK-2.0 в адресном
пространстве BankO расположено ОЗУ с шириной шины дан-
ных 16, в адресном пространстве Bankl - контроллер Ethernet,
в Bank2 и ВапкЗ соответственно первый и второй контроллеры
графического дисплея.
Пример настройки контроллера внешней памяти на вкладке
External Memory Controller показан на рисунке 6.8: активи-
зирован BankO на 16 бит, Bank2 и ВапкЗ на 8 бит, у всех бан-
ков одинаковые параметры по времени доступа.
Для ЖКИ требуется всего два адреса для каждого контрол-
лера графического дисплея (при А 1=0 - запись/чтение коман-
ды, при А 1=1 - запись/чтение данных). Из адресного про-
странства в 16 Мбайт у каждого из банков памяти Bank2 и
ВапкЗ, можно выбрать произвольные два адреса для работы с
дисплеем. Так, например, в файле led.h выбраны адреса:
0x82000000L и 0x82000002L для банка Bank2
0x83000000L и 0x83000002L для банка ВапкЗ
Текст файла led.h:
#ifndef _ LCD_H
#define _LCD_H
// базовые адреса контроллеров LCD
138
#define IND1_BASE_ADDRESS #define IND2_BASE_ADDRESS // смещение адреса для команд и данных #define ADDR.CMD #define ADDR.DATA 0x82000000L 0x83000000L ()x()() 0x02
//включение/выключение LCD #define IND_ON #define IND_OFF //Размеры экрана ЖКИ (ширина и высота) #define WIDTH #define HEIGHT 1 0 122 32
И контроллер 1 и 2
#define INDI #define IND2 0 1
#endif//_LCD_H
Для функционирования индикатора необходимо на вывод
IND_CL подать частоту 2 кГц. Данный вывод индикатора под-
ключен к выводу Р0.12/МАТ1.0 микроконтроллера, который
является выходом схемы совпадения модуля таймера Т1. Та-
ким образом, не составляет труда сформировать требуемую
частоту для индикатора (пример настройки вывода
Р0.12/МАТ1.0 на частоту 2 кГц приведен в работе № 3, посвя-
щенной таймерам). Следует однако быть внимательным при
разработке проекта, в котором будет задействован таймер Т1
для других целей. В этом случае возможно изменение таких
настроек таймера, как коэффициент предделителя тайме-
ра/счетчика Т1 и настройки регистра управления модулем
совпадения таймера/счетчика Т1. Альтернативный способ -
программно изменять состояние порта РО.12 в подпрограмме
таймера, например ТО, рассчитав частоту на выходе порта в
соответствии с частотой прерывания.
139
Для работы с дисплеем в файле Icd.c приведен ряд API
функций. Ниже представлено описание некоторых из них.
/* Ожидание готовности контроллера (контроллер включен, не в
состоянии сброса, готов к приему) в течение 500 тактов. Возвращает
ОК или ERR */
unsigned char _wait_normal_status( void )
/*Включение/выключение ЖКИ (mode = IND ON или IND OFF).
Возвращает OK */
unsigned char display_on_off(unsigned char mode)
/* Задание направление вывода (mode = IND_ON - обратный или
IND_OFF) - прямой */
unsigned char select_adc(unsigned char mode)
/♦Установка режима работы ЖКИ (статический IND ON или
обычный IND OFF). Возвращает ОК */
unsigned char static_drive(unsigned char mode)
//Установка адреса строки string = 0..31 для контроллера
type_ind = INDI или IND2. Возвращает ОК при удачном выпол-
нении команды.
unsigned char select_string(unsigned char type_ind, unsigned char
string)
/♦Инициализация - включение, задание прямого направления,
скважности, выбор 0 строки у обоих индикаторов */
void init_lcd( void )
/*Установка адреса колонки column = 0...60 для контроллера
type_ind = INDI или IND2. Возвращает ОК при удачном выполнении
команды.*/
unsigned char select_column(unsigned char type_ind, unsigned char
column)
/♦Установка номера страницы page =0..3 для контроллера
type_ind = INDI или IND2. Возвращает ОК при удачном выполнении
команды.*/
140
unsigned char select_page(unsigned char type_ind, unsigned char
page)
/♦Чтение данных в * buf из контроллера type_ind = INDI или
IND2. Возвращает ОК при удачном выполнении команды. */
unsigned char read_data_lcd(unsigned char type_ind, unsigned char*
buf)
/♦Запись данных из buf в контроллер type_ind = INDI или IND2
для отображения на индикаторе. Возвращает ОК при удачном вы-
полнении команды. */
unsigned char write_data_lcd(unsigned char type_ind, unsigned char
buf)
/♦Закрашивание пикселя по координатам х= 0...121, у= 0..31 бе-
лым/черным цветом color = 0 или 1. Возвращает ОК при удачном
выполнении команды. */
unsigned char put_pixel(unsigned char x, unsigned char y, unsigned
char color)
/♦ Очистка led - закрашивание одним цветом (color = 0 или 1).
Возвращает ОК при удачном выполнении команды. ♦/
unsigned char clear_lcd( unsigned char color)
/* вывод на индикатор символа idx (в коде ASCII) начиная с ко-
лонки х вправо и со строки у вниз; знакогенератор - таблица
ASCII_Table . Возвращает текущий (сдвинутый на ширину выве-
денного символа) номер колонки х*/
unsigned char output_char (unsigned char x, unsigned char y, un-
signed char idx);
Фрагмент таблицы знакогенератора и ее описание приведе-
ны ниже:
Массив (таблица) знакогенератора:
//font 8x8 pixel
const unsigned char font_8x8[] = {
141
0x81, 0x07, 0x18, OxCl, 0x58, 0x51, 0x5D, 0x51, 0x62, 0x51, 0x66,
0x51, 0x6В, 0x61, 0x71, 0x71, 0x78, 0x71, 0x7F, 0x71, OxEO, 0x33,
0x87, Oxll, 0x88, 0x31, 0x8B, 0x51, 0x90, 0x51, 0x95, 0x51, 0x9A,
0x51, 0x9F, 0x21, OxAl, 0x21, 0xA2, 0x21, 0xA4, 0x51, 0xA9, 0x51,
OxAE, 0x21, OxBO, 0x51, Ox5E, Oxll, 0xB5, 0x31, 0xB8, 0x51, OxBD,
0x31, OxCO, 0x51, OxC5, 0x51, OxCA, 0x51, OxCF, 0x51,
0xD4, 0x51, 0xD9, 0x51, OxDE,...
Таблица 6.4
Описание таблицы знакогенератора
Позиция от начала таблицы Длина в байтах Описание
0 1 бит 7: 1 - старший бит сверху 0 - младший бит сверху
1 1 биты 6..4: номер строки, с которой начинается строка шрифта (у полноразмерных шрифтов - 0) биты 2..0: последняя строка, на которой заканчивается строка шрифта (у полноразмерных - 7)
2 1 Код символа (ASCII), с которого начинается таблица (в таблице 0x18)
3 1 Код символа (ASCII), которым заканчивается таблица (в таблице 0хС1)
4 N*2 N - количество символов в таблице. Для каждого сим- вола указывается, где начинаются данные описания пикселов символа в таблице и ширина символа Под описание каждого символа отводится 2 байта (младшим байтом вперед), например, для символа 0x18 - 0x58, 0x51, т.к. младшим байтом вперед, то - 0x5158; для символа 0x19 -0x5D, 0x51 (0x515D) ит.д. биты 0..11: - позиция от начала массива, где начина- ются данные символа (для символа 0x18 - 0x158 - номер первого столбца пиксе- лов в таблице); биты 12.. 15: - ширина символа - количество столбцов (для символа 0x18 - 0x5 - пять столбцов) Символы кодируются вертикальными линиями, слева направо. Один байт - одна вертикальная линия.
142
6.2. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
Таблица 6.5
Задания для лабораторной работы
ЯП варианта Задание
1 Ввести последовательно два трехзначных десятичных числа, найти их разность и результат вывести на ЖКИ
2 Ввести последовательно два трехзначных десятичных числа, найти их сумму и результат вывести на ЖКИ
3 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИЛИ» и вывести (ЖКИ)
4 Ввести последовательно два трехзначных десятичных числа, найти их произведение и результат вывести на ЖКИ
5 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИСКЛЮЧАЮЩЕЕ ИЛИ» и вывести на ЖКИ
6 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «И» и вывести на ЖКИ
7 Ввести последовательно два трехзначных десятичных числа, найти их разность и результат вывести на ЖКИ
8 Ввести последовательно два трехзначных десятичных числа, найти их сумму и результат вывести на ЖКИ
9 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИСКЛЮЧАЮЩЕЕ ИЛИ» и вывести на ЖКИ
10 Ввести последовательно два трехзначных десятичных числа, найти их произведение и вывести результат на ЖКИ
11 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «И» и вывести на ЖКИ
12 Ввести последовательно два трехзначных десятичных числа, найти результат поразрядной логической операции «ИЛИ» и вывести (ЖКИ)
13 Ввести три трехзначных десятичных числа, найти максимальное из них и вывести его на ЖКИ
14 Ввести три трехзначных десятичных числа, найти максимальное из них и вывести его на ЖКИ
15 Ввести три трехзначных десятичных числа, найти минимальное из них и вывести его на ЖКИ
143
1. Изучите схему включения графического ЖКИ.
2. Изучите алгоритмы вывода информации на графический
ЖКИ.
3. Разработайте API функцию вывода на индикатор прямо-
угольника.
4. Напишите программу, осуществляющую ввод информа-
ции с клавиатуры, ее отображение на ЖКИ в соответ-
ствии с заданием, выданным преподавателем (см.
табл.6.5). Клавишу «#» использовать как подтверждение
ввода, а клавишу «*» - как сброс операции.
5. Откомпилируйте программы, создайте загрузочный
файл.
6. В программе отладчике Debug проверьте правильность
функционирования разработанного алгоритма.
7. Подключите стенд к компьютеру. Включите стенд.
8. Загрузите программу в стенд.
9. Отладьте и протестируйте драйвер.
6.3. СОДЕРЖАНИЕ ОТЧЕТА
Для написания отчета необходимо изучить литературу,
предложенную в конце раздела.
Отчет должен содержать:
- описание аппаратной части;
- описание используемых API-функций;
- исходные тексты заданной программы;
- результаты работы программы.
6.4. КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Поясните структуру графического ЖКИ.
2. Поясните структуру видеопамяти ЖКИ.
144
3. Какова особенность чтения данных из памяти графиче-
ского ЖКИ? В чем заключается необходимость чтения
информации?
4. Режим «чтение-модификация-запись». Какова необхо-
димость использования?
5. Чтение состояния дисплея (статус ЖКИ). Какова необ-
ходимость использования?
6. Объясните принцип формирования символа по таблице
знакогенератора.
7. Настройка контроллера внешней памяти. Для чего она
необходима?
8. Объясните принцип рисования фигур на графическом
ЖКИ.
9. Поясните принцип построения таблицы знакогенератора.
Учебно-методическое обеспечение
1. Учебный стенд SDK-2.0 . Руководство пользователя.
2. LPC2xx. Руководство пользователя.
3. Мясников В.И. Проектирование встраиваемых микропроцессор-
ных систем: учебное пособие. Йошкар-Ола: МарГТУ, 2010. 400 с.
4. Программа-терминал Terminal.exe
145
ЗАКЛЮЧЕНИЕ
Выполнив все лабораторные работы, представленные в
данном практикуме, студент поднимется выше на одну сту-
пень бесконечной лестницы приобретения знаний. Получен-
ные знания и навыки проектирования позволят чувствовать
себя уверенней в решении новых задач, связанных с разработ-
кой программно-аппаратных комплексов.
Данный лабораторный практикум поможет студентам осво-
ить микроконтроллер, имеющий одну из самых популярных в
мире архитектур. Но это не значит, что при встрече с другими
микроконтроллерами придется осваивать новые приемы про-
ектирования. Изменится только внутренняя структура микро-
контроллера, однако основные приемы разработки микропро-
цессорных устройств сохранятся.
Рассмотренные в данном практикуме схемотехнические
решения являются базовыми, неизменно повторяющимися
практически во всех микропроцессорных системах. Это обсто-
ятельство свидетельствует о готовности студента, хорошо вы-
полнившего все лабораторные работы, к практическому ис-
пользованию приобретенных навыков.
Приемы программирования, рассмотренные в лаборатор-
ном практикуме, позволят чувствовать себя уверенней при
разработке новых проектов. Хотя процесс разработки про-
граммного обеспечения значительно объемнее и глубже, дан-
ные работы явятся стартовой площадкой в его освоении.
Дальнейшее совершенствование навыков разработки про-
граммного обеспечения возможно на базе рекомендуемой ли-
тературы и, без сомнения, только при выполнении все новых и
новых проектов.
146
Учебное издание
МЯСНИКОВ Владимир Иванович
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
ВСТРАИВАЕМЫХ СИСТЕМ
Лабораторный практикум
Редактор Л. С. Емельянова
Компьютерная верстка С. Н. Эштыкова
Подписано в печать 18.01.18. Формат 60x84 ’Лб
Бумага офсетная. Печать офсетная.
Усл. п. л. 8,6. Тираж 50 экз. Заказ № 6115.
Поволжский государственный технологический университет
424000 Йошкар-Ола, пл. Ленина, 3
Редакционно-издательский центр
Поволжского государственного технологического университета
424006 Йошкар-Ола, ул. Панфилова, 17