(с) veter , 2005
Документация на тему:
Микроконтроллер AT91SAM7S256 -
Быстрое обучение на примерах.
On-Line документ.
HOW-TO - Быстрое обучение на примерах.
Приходько С.Г.
Харьков, 2006г.
Оригинал документа всегда доступен по адресу – http://www.projects.org.ua
Документ обновляется по мере возможностей.
Содержание
Список сокращений используемых в
данном документе
1. Описание
микроконтроллера - AT91SAM7S256
1.1 Основные
функциональные возможности МК:
1.3 Функциональные
блоки МК, их назначение.
1.4 Структурная
схема AT91SAM7S256/128/64/321:
1.5 Структурная
схема AT91SAM7S32:
1.6.1 Краткая
характеристика ядра ARM7TDMI
Прямой порядок (Little-endian)
1.8 Периферийный
контроллер прямого доступа к памяти (Peripheral Data Controller, PDC)
1.10 Аналогово-цифровой
преобразователь
1.11 Широтно-импульсный
модулятор (ШИМ, PWM)
2.2 Пример - мигание светодиодами
5.1 Программирования МК из Linux:
8. Сборка макетной платы для МК
AT91SAM7S256
9.1 GCC – параметры и ключи
компилятора.
9.2.1 Включение прерывания таймера
9.2.2 Пример использования
прерывания
Компания Atmel представляет первое семейство
микроконтроллеров, выполненных на основе ядра ARM7, по самым низким ценам среди
известных аналогов и ориентированные на обновление 8-разр. проектов.
AT91SAM7S32 и AT91SAM7S64 - первые представители серии ARM7-микроконтроллеров с
малым числом выводов (серия SAM7S) с размером флэш-памяти: 32 кбайт и 64 кбайт,
соответственно. Версии с размером памяти 128 кбайт и 256 кбайт T91SAM7S128 и
AT91SAM7S256, соответственно, станут, доступны в конце текущего года.
Помимо
скачка в производительности по сравнению с 8-разр. микроконтроллерами они
являются первыми 32-разр. микроконтроллерами, которые интегрируют полный набор
функций защиты, в т.ч. сторожевой таймер, тактируемый встроенным
RC-генератором, контроль напряжения питания и аппаратная защита флэш-памяти.
Микроконтроллеры AT91SAM7 поддерживаются недорогими отладочными средствами,
перенося возможности 32-разр. обработки информации в реальном времени в
чувствительные к стоимости приложения, функциональные возможности которых
сдерживались возможностями 8-разр. микроконтроллеров.
Серия AT91SAM7S за счет перехода с 8-разр. на 32-разр.
архитектуру позволит
улучшить характеристики
реально-временных приложений. Производительность выполнения однотактных
инструкции из встроенной флэш-памяти составляет 27 млн. операции в секунду.
Модернизированный контроллер прерываний усиливает возможности прерываний
процессора ARM7 и позволит работать по векторам прерываний при минимальном
количестве тактов выполнения инструкций. Аппаратная установка/сброс бит регистров
допускает однотактную манипуляцию над битом, устраняя потребность маскирования
в последовательности чтение-модификация-запись.
К типичным сферам применения микроконтроллеров серии
AT91SAM7S относятся: управление приборами, измерительные устройства, системы
обеспечения безопасности, регистраторы информации, мобильные телефоны с
USB-портом, а также аксессуары ПК.
Яко
Вилбринк, директор по ARM-продукции компании Atmel прокомментировал:
"Серия SAM7S является
первым изделием из существующего семейства
ARM-микроконтроллеров,
которое заполняет брешь между стоимостью 8-разр.
микроконтроллеров и
производительностью 32-разр. микроконтроллеров. Они
обеспечивают простоту и
скорость проектирования приложений с превосходными
характеристиками и
безопасностью при очень малых затратах".
AT91SAM7S32 выпускается в 48-выв. корпусе LQFP, а
AT91SAM7S64 в 64-выв.
LQFP и при покупке 10 тыс.
штук стоят, соответственно, 2.90 и 4.05 долл.США.
На самом же деле, ARM
микроконтроллеры производят много фирм, такие как ATMEL, PHILIPS, INTEL, ANALOG
DEVICE, SIEMENS, и еще
много тех производителей которые менее известны.
Данный документ позволяет с минимальными затратами на
изучение – понять что к чему в данном микроконтроллере и как с ним можно
работать.
Здесь
приведен пример работы с микроконтроллером под ОС Linux. В качестве дистрибутива тест производился на DeepStyle 1.0 rc1 и Debian Sarge RC1.
Данные
сокращения или слова часто встречаются в этом документе, для понимания
приводится пояснение к некоторым сокращениям или словам.
AT91SAM7S256 - микроконтроллер, который описывается в
данном документе
МК - AT91SAM7S256 – (
микроконтроллер )
Вывод - физический вывод МК
Вход - вывод
сконфигурированный на вход
Выход - вывод
сконфигурированный на выход
ШИМ - широтно-импульсная
модуляция
OS
Linux - операционная
система Linux
Datasheet - документ на изделие, в данном
случае - описывающий МК
Minicom - терминальная программа в OS Linux
При написании документа
использовались документы
http://www.gaw.ru/html.cgi/txt/ic/Atmel/micros/arm/AT91SAM7S32_321_64_128_256.htm
рекомендуется для
ознакомления
http://www.gaw.ru/pdf/Atmel/ARM/AT91SAM7S256_128_64_321_32.pdf
- 6138 Kb
Engl Полное описание микроконтроллера AT91SAM7S32, AT91SAM7S321,
AT91SAM7S64, AT91SAM7S128, AT91SAM7S256
http://www.gaw.ru/pdf/Atmel/ARM/AT91_Third_Party_Development_Tools_Catalog.pdf
- 1761 Kb
Engl AT91 Third Party Development Tools Catalog
http://www.gaw.ru/html.cgi/txt/doc/micros/arm/index.htm
- Rus Архитектура
и система команд
http://www.efo.ru/doc/Atmel/Atmel.pl?2199
Примеры программ
Для упрощения задач разработки ПО
предлагаются примеры базовых программ. Последние версии примеров программ можно
найти по адресу www.at91.com, либо на файловом сервере пользователей
AT91.
Для более быстрого освоения
базовых программ (задач инициализации микроконтроллера и работы с периферией)
предлагаются интерактивные
тренинги.
Полезные ссылки
ARM (Advansed RISC Mashine) Микроконтроллер представляет из
себя систему
аппаратных блоков и
периферии управляемую ядром ARM. Шина микроконтроллера,
внешняя и внутренняя, имеет
разрядность 32 бита. Полное описание на МК имеется
в datasheet на него и
приобрести его можно с сайта производителя, называется
- "doc6175.pdf",
544 страницы.
Отличительные особенности:
Содержит
процессор ARM7TDMI ARM Thumb
- Высокоэффективная 32-разрядная RISC-архитектура
- Высокоплотный набор 16-разрядных инструкций
- Лидер по соотношению производительность/потребление
- Встроенное ядро внутрисхемной эмуляции, поддержка
отладочного коммуникационного канала
Внутренняя
высокоскоростная флэш-память
- 256 кбайт, 1024 страницы по 256 байт (AT91SAM7S256)
- 128 кбайт, 512 страниц по 256 байт (AT91SAM7S128)
- 64 кбайт, 512 страниц по 128 байт (AT91SAM7S64)
- 32 кбайт, 256 страниц по 128 байт (AT91SAM7S321/32)
- однотактный доступ при частоте до 30 МГц при наихудших
условиях
- буфер упреждающей выборки для оптимизации выполнения
Thumb-инструкций на максимальной тактовой частоте
- длительность программирования страницы 6 мс, в т.ч.
автоматическое стирание страницы, время полного стирания: 15 мс
- 10 тысяч циклов записи, сохранность данных в течение 10
лет, возможность блокировки секторов, бит защиты флэш-памяти
- интерфейс быстрого программирования флэш-памяти для
высокосерийного производства
Внутреннее
высокоскоростное статическое ОЗУ, однотактный доступ при максимальном
быстродействии
- 64 кбайт
(AT91SAM7S256)
- 32 кбайт
(AT91SAM7S128)
- 16 кбайт
(AT91SAM7S64)
- 8 кбайт
(AT91SAM7S321/32)
Контроллер
памяти (MC)
- Контроллер встроенной флэш-памяти, информирование об
аварийном прекращении операции и детекция отклонений
Контроллер
сброса (RSTC) -сброс при подаче питания и сброс при снижении напряжения ниже
откалиброванного на стадии производства порога
- обработка внешнего сигнала сброса и формирование
информации об источнике сброса
Тактовый
генератор (CKGR)
- маломощный RC-генератор, встроенный генератор 3..20 МГц и
одна схема ФАПЧ
Контроллер
управления потреблением (PMC)
- возможность программной оптимизации потребления путем
снижения тактовой частоты до 500 Гц и перевода в режим холостого хода
- три программируемых внешних тактовых сигнала
Расширенный
контроллер прерываний (AIC)
- индивидуально-маскируемые векторизованные источники
прерываний с 8-уровнями приоритетов
- два (AT91SAM7S256/128/64/321) или одно (AT91SAM7S32)
внешнее прерывание и один источник быстродействующего прерывания, защита от
ложных прерываний
Блок
отладки (DBGU)
- 2-проводной УАПП и поддержка прерывания по отладочному
каналу, программируемое предотвращение доступа со стороны ВСЭ
Таймер
периодических интервалов (PIT) >
- 20-разрядный программируемый счетчик + 12-разрядный
счетчик интервалов
Сторожевой
таймер с оконной организацией (WDT)
- Программируемый счетчик, защищенный 12-разрядным ключом
- Формирует сигналы прерывания или сброса
- Счетчик может быть остановлен, когда процессор находится
в состоянии отладки или режиме холостого хода
Таймер
реального времени (RTT)
- 32-разрядный циклический счетчик с сигнализацией
- Работа от встроенного RC-генератора
Один
контроллер параллельного ввода-вывода (PIOA)
- 32 (AT91SAM7S256/128/64/321) или 21 (AT91SAM7S32)
программируемые линии ввода-вывода, мультиплексируемых с 2 периферийными
устройствами ввода-вывода
- поддержка прерывания по изменению состояния на каждой
линии ввода-вывода
- возможность раздельной программной конфигурации: открытый
сток, подтягивающий резистор и синхронизированный выход
11
(AT91SAM7S256/128/64/321) или 9 (AT91SAM7S32) каналов контроллера прямого
доступа к памяти (ПДП) периферийных устройств
Один
полноскоростной порт устройства USB 2.0 (12 Мбит/сек) (за исключением
AT91SAM7S32).
- встроенный трансивер, интегрированные конфигурируемые
буферы FIFO размером 328 байт
Один
синхронизированный последовательный контроллер (SSC)
- раздельные сигналы тактирования и синхронизации посылки
для каждого приемника и передатчика
- поддержка аналогового интерфейса I?S, поддержка
мультиплексирования с разделением по времени
- высокоскоростной непрерывный поток данных с 32-разрядным
форматом данных
Два
(AT91SAM7S256/128/64/321) или один (AT91SAM7S32) универсальный
синхронный/асинхронный приемо-передатчик (УСАПП)
- раздельные генераторы скорости связи, инфракрасная
модуляция/демодуляция IrDA
- поддержка смарт-карт ISO7816 T0/T1, аппаратное
подтверждение установления связи, поддержка RS485
- кодер/декодер Манчестер-кода (AT91SAM7S256/128)
- полный модемный интерфейс у УСАПП1
(AT91SAM7S256/128/64/321)
Один
последовательный интерфейс SPI с поддержкой ведущего/подчиненного режимов
- программируемая длина данных 8-16 бит, четыре выхода
выбора микросхем
Один
трехканальный (AT91SAM7S256/128/64/321) или два двухканальных (AT91SAM7S32)
16-разрядных таймер-счетчика (TC)
- Три (AT91SAM7S256/128/64/321) или один (AT91SAM7S32)
входы/вход внешней синхронизации, две линии ввода-вывода общего назначения на
каждый канал
- Два ШИМ-генератора, режим захвата, прямой/обратный счет
Один четырехканальный
16-разрядный ШИМ-контроллер (PWMC)
Один
двухпроводной интерфейс (TWI)
- поддержка только ведущего режима, поддерживаются все
двухпроводные последовательные ЭСППЗУ компании Atmel
Один
8-канальный 10-разрядный аналогово-цифровой преобразователь, четыре канала
мультиплексированы с цифровым вводом-выводом
Загрузочный
помощник SAM-BA™
- загрузочная программа по умолчанию
- интерфейс с графическим пользовательским интерфейсом
SAM-BA
Граничное
сканирование в соответствии со стандартом IEEE 1149.1 JTAG на всех цифровых
линиях ввода-вывода
Ввод-вывод,
совместимый 5В-ыми уровнями, в т.ч. 4 сильноточных выхода с нагрузочной
способностью каждого до 16 мА
Источники
питания
- Встроенный стабилизатор 1.8В/100 мА для питания ядра и
внешних компонентов
- Питания линий ввода-вывода 3.3В или 1.8В (VDDIO),
отдельное питание 3.3В флэш-памяти VDDFLASH
- Напряжение питания ядра VDD=1.8В с учетом работы
детектора снижения питания
Полностью
статическая работа в диапазоне частот до 55 МГц при наихудших рабочих условиях
(напряжение питания 1.65В и температура +85°C)
Выпускается
в 64-выводных (AT91SAM7S256/128/64/321) и 48-выводных (AT91SAM7S32)
экологически безопасных корпусах LQFP

Функциональные блоки
микроконтроллеров AT91SAM7S
В отличие
от традиционных 32-разрядных микроконтроллеров, для AT91SAM7S характерна
высокая интеграция блоков и компонентов на кристалле. Примером показателя
высокой интеграции является тот факт, что для "обвязки"
микроконтроллера достаточно всего 20 внешних компонентов:
AT91SAM7S
- серия флэш-микроконтроллеров с малым количеством выводов, выполненных на
основе 32-разрядного процессора ARM с архитектурой RISC. Они содержат
высокобыстродействующие флэш-память и статическое ОЗУ, большой набор
периферийных устройств, в т.ч. порт устройства USB 2.0 (за исключением AT91SAM7S32)
и полный набор системных функций минимизируют число внешних компонентов.
Микроконтроллеры
идеальны для перевода существующих приложений на основе 8-разрядных
микроконтроллеров к 32-разрядной архитектуре с целью улучшения рабочих
характеристик и расширения памяти.
Встроенная
флэш-память может программироваться внутрисистемно через интерфейс JTAG-ICE или
через параллельный интерфейс с помощью производственного программатора, что
выполняется перед монтажом на плату. Встроенные биты блокировки и бит защиты
позволяют защитить прошивку микроконтроллера от несанкционированной перезаписи
или хищения.
В
состав системного контроллера микроконтроллеров AT91SAM7S входит контроллер
сброса, который управляет последовательностью действий при подаче питания
микроконтроллера и всей системы. Контроль за корректностью работы
микроконтроллера выполняют детектор снижения напряжения питания и сторожевой
таймер, тактируемый встроенным RC-генератором.
AT91SAM7S
- серия микроконтроллеров общего назначения. Интегрирование порта USB-устройства
делает привлекательным применение данных микроконтроллеров в периферийных
устройствах, требующих подключение к ПК или сотовому телефону. Привлекательная
стоимость и высокая степень интеграции микроконтроллеров позволяет их
использовать в чувствительных к стоимости приложениях с высокой серийностью.
Микроконтроллеры
AT91SAM7S256, AT91SAM7S128, AT91SAM7S64, AT91SAM7S321 и AT91SAM7S32 отличаются
размером памяти, набором периферийных устройств и корпусами (см. информацию для
заказа).
За исключением AT91SAM7S32,
все остальные микроконтроллеры AT91SAM7S совместимы по посадочному месту и
расположению выводов.

Рисунок 1 -
структурная схема МК и ее функциональные блоки.
PIOA -
параллельная шина В/В, 32 бита, конфигурируемый каждый вывод
PMC -
менеджер источников тактирования
AIC -
расширенный контроллер прерываний
DBGU -
дебаг-юнит + посл. порт USART
USART0 - посл.
порт 0
USART1 - посл.
порт 1
SPI -
посл. Шина SPI
ADC -
аналого-цифровой преобразователь (10бит/8портов)
PMWC - ШИМ
контроллер
SSC -
последовательный синхронный порт
TC -
таймер
TWI - 2-х
проводный интерфейс (I2C)
Std.perif -
PIT,WDT, RTT, etc


Процессор
ARM7TDMI поддерживает два набора инструкций:
Процессор
ARM7TDMI является разновидностью архитектуры ARMv4T. Более детально о наборах
инструкций ARM и Thumb можно узнать в "ARM Architecture Reference
Manual" (справочное руководство по архитектуре ARM).
В данном разделе описывается:
Микропроцессорные
архитектуры, как правило, используют набор инструкций той же разрядности, что и
данные. Следовательно, 32-разрядные архитектуры обладают улучшенными
характеристиками обработки 32-разрядных данных и могут более эффективно
адресовать большие адресные пространства по сравнению с 16-разрядными
архитектурами. 16-разрядные архитектуры в большинстве случаев обладают более
высокой плотностью кода, но приблизительно вдвое уступают по
производительности.
Thumb
реализует 16-разрядный набор инструкций в составе 32-разрядной архитектуры,
который обеспечивает:
Набор
инструкций Thumb является выборкой наиболее часто используемых 32-разрядных
инструкций ARM. Thumb-инструкции характеризуются размером 16 бит и имеют
соответствующую 32-разрядную инструкцию ARM. Соответствующие инструкции
оказывают одинаковое влияние на модель процессора. Thumb-инструкции работают со
стандартной конфигурацией ARM-регистра, обеспечивая превосходное взаимодействие
между состояниями ARM и Thumb.
В
процессе выполнения 16-разрядная инструкция подвергается декомпрессии в
реальном времени до полных 32-разрядных инструкций ARM без потери
производительности.
Thumb
наследует все преимущества 32-разрядного ядра:
Следовательно,
инструкции Thumb характеризуются большим диапазоном перехода, мощными
арифметическими операциями и большим адресным пространством.
Код
Thumb обычно занимает 65% от ARM-кода и достигает 160% производительности
ARM-кода при исполнении из 16-разрядной системы памяти. Следовательно, Thumb,
делает ядро ARM7TDMI идеально подходящим во встраиваемые приложения, где в
качестве критичных параметров выступают плотность кода и габариты.
Доступность
обоих наборов инструкций, 16-разрядного Thumb и 32-разрядного ARM, дает
разработчикам гибкость по оптимизации быстродействия или размера кода на уровне
процедуры в соответствии с требованиями к их приложению. Например, критические
циклы в таких приложениях, как обработка часто возникающих прерываний и
алгоритмы цифровой обработки сигналов, могут кодироваться с помощью полных
ARM-инструкций, а затем линкована Thumb-кодом.
Ядро
ARM7TDMI - представитель семейства ARM 32-разрядных микропроцессоров общего
назначения. Семейство ARM характеризуется высокой производительностью при очень
низком уровне потребления и малых размерах.
Архитектура
ARM выполнена на основе принципов RISC (компьютер с сокращенным набором
инструкций). Набор инструкций RISC и связанный с ним механизм дешифрации является
более простым по сравнению CISC-архитектурой (компьютер со сложным набором
инструкций). За счет этого достигается:
Для
ускорения потока инструкций, поступающего к процессору, в ядре ARM7TDMI
используется конвейер. Он позволяет выполнять несколько операций одновременно,
а также обеспечивает постоянство работы системы памяти и обработки.
Используется трехступенчатая конвейеризация, т.к. инструкции выполняются в три
этапа:
Конвейер инструкций показан на
рисунке 1.1.

Рисунок 1.1. Конвейер инструкций
В
процессе нормальной работы, когда выполняется одна инструкция, последующая
инструкция декодируется, а третья - считывается из памяти.
Счетчик
программы указывает на загружаемую из памяти инструкцию, а не на исполняемую
инструкцию. Это важно знать, т.к. значение счетчика программы (PC), которое
используется при выполнении инструкции, всегда на две инструкции опережает
адрес.
Ядро
ARM7TDMI использует фон-неймановскую архитектуру доступа к памяти с одной
32-разрядной шиной данных, по которой передаются как инструкции, так и данные.
Доступ к данным к памяти могут осуществлять только инструкции чтения, записи и
обмена. В качестве данных могут выступать:
Слова
должны быть выровнены к 4-байтным границам, а полуслова - к 2-байтным.
При
разработке интерфейса памяти процессора ARM7TDMI стояла задача максимально
полностью использовать потенциал по быстродействию и при этом минимизировать
использование памяти. Чтобы обеспечить возможность реализации функций
системного управления на основе стандартной маломощной логики критичные к
быстродействию сигналы управления были конвейеризованы. Данные сигналы
управления упрощают использование быстродействующих пакетных режимов передачи,
которые используются большинством встроенной и внешней технологий памяти.
Ядро
ARM7TDMI поддерживает четыре основных цикла доступа к памяти:
Логика EmbeddedICE - вспомогательный аппаратный блок, который делает ARM-процессоры отлаживаемыми и существенно облегчает процесс отладки. Он позволяет с помощью программных инструментальных средств отлаживать программный код, который исполняется целевым процессором. Логика EmbeddedICE управляется через порт JTAG с использованием интерфейса EmbeddedICE. Более подробная информация по встроенной отладке приведена в разделе 5 "Интерфейс отладки" и приложении Б "Детальное описание отладки".
Процессор ARM7TDMI поддерживает
следующие типы данных:
Их необходимо выровнять следующим
образом:
Прим.:
системы памяти, как правило, поддерживают все типы данных. В частности, система
должна поддерживать запись подслов без повреждения смежных байт в слове.
Процессор
ARM7TDMI рассматривает память, как линейную совокупность байт, пронумерованных
в возрастающем порядке, начиная с 0. Например,
Процессор
ARM7TDMI поддерживает оба порядка следования байт многобайтных слов в памяти:
Прим.:
по умолчанию у ARM-процессоров используется прямой порядок байт
(Little-endian).
Формат
следования байт ЦПУ указывает, где в слове размещается старший значащий байт
или разряд. Поскольку при запуске ЦПУ значения вычисляются, начиная с младших
значащих разрядов, то прямой порядок устанавливается автоматически.
Конфигурация
порядка следования байт не зависит от типа хранимых данных (слова, полуслова
или байты).
В
формате прямого порядка, байт с наименьшим адресом в слове рассматривается как
младший значащий байт слова, а байт с наибольшим адресом - старший значащий
байт. Т.о., байт по адресу 0 системы памяти соединяет с линиями данных 7...0.
На рисунке 2.1 показывается, как слово по адресу А, полуслова по адресам А и
А+2, а также байты по адресам А, А+1, А+2, А+3 соотносятся между собой при
конфигурации ядра к прямому порядку.

Рисунок 2.1. Адреса байт и полуслов в слове при прямом порядке (Little-endian)
В
формате обратного порядка, процессор ARM7TDMI запоминает старший значащий байт слова
в позиции байта с наименьшим порядковым номером, а младший байт - в позиции
байта с наибольшим порядковым номером. Т.о., байт по адресу 0 системы памяти
связан с линиями данных 31..24.
На
рисунке 2.2 показывается, как слово по адресу А, полуслова по адресам А и А+2,
а также байты по адресам А, А+1, А+2, А+3 соотносятся между собой при
конфигурации ядра к обратному порядку.

Рисунок 2.2. Адреса байт и полуслов в слове при обратном порядке (Big-endian)
Процессор
ARM7TDMI поддерживает семь режимов работы:
Прим.:
Вы можете вводить системный режим из другого привилегированного режима только
путем изменения бита режима в регистре текущего состояния программы (CPSR).
Все
режимы, кроме режима пользователя, совместно называются привилегированными
режимами. Привилегированные режимы используются для обслуживания прерываний и
исключительных ситуаций, а также для доступа к защищенным ресурсам.
Каждый
регистр имеет идентификатор режима (см. таблицу 2.1).
Таблица
2.1. Идентификаторы режима
|
Режим |
Идентификатор режима |
|
Режим пользователя |
usr |
|
Режим быстрого прерывания |
fiq |
|
Режим прерывания |
irq |
|
Режим супервизора |
svc |
|
Аварийный режим |
abt |
|
Системный режим |
sys |
|
Неопределенный режим |
und |
Если
сигнал на входе nRESET принимает низкий уровень, то возникает сброс и ядро
ARM7TDMI прекращает выполнение инструкции и продолжает инкрементировать шину
адреса, как при выборке слов или полуслов инструкций. nMREQ и SEQ индицируют о
внутренних циклах в течение этого времени
Если
nRESET переходит опять в высокое состояние, то процессор ARM7TDMI выполняет
следующие действия:
После
сброса значения всех регистров, кроме PC и CPSR, являются неопределенными.
Более подробная информация приведена в разделе "Последовательность сброса после подачи питания".
Контроллер Flash-памяти
микроконтроллера
Быстродействующая Flash-память
позволяет достигать производительности
При
выполнении команд из оперативной памяти можно увеличить производительность
микроконтроллера до 50 MIPS.
Flash-память
микроконтроллеров разбита на страницы по 128 Байт и зоны по 4кБайта. Запись во
Flash-память производится постранично.
Записанная
во Flash-память программа может быть защищена от несанкционированного либо
случайного считывания или стирания установкой lock-битов. Lock-биты
осуществляют защиту памяти по зонам. Например, Flash-память микроконтроллера
объемом 64 кБайта разбита на 16 зон, для каждой из которых можно установить
индивидуальный бит защиты.
Стирание
Flash-памяти может производиться постранично перед записью страницы (2мс/стр.)
или полностью всей памяти (10 мс).
С
целью защиты интеллектуальной собственности можно запретить доступ (считывание
и запись) к Flash-памяти из внешнего мира по интерфейсам внутрисхемного
программирования и интерфейсу FFPI установкой Security Fuse бита. При установке
данного бита доступ к содержимому Flash-памяти по интерфейсам внутрисхемного
программирования и интерфейсу FFPI можно будет осуществить только после полного
стирания данных с использованием внешнего вывода Erase.
Программирование
Flash-памяти может производиться внутрисхемно без использования программатора,
а при помощи встроенного загрузчика SAM-BA, осуществляющего программирование по
имеющимся на кристалле интерфейсам USB либо DBGU (Debug UART).
Для
обмена данными между оперативной памятью и периферией в микроконтроллеры
AT91SAM7S включен периферийный контроллер PDC.
Контроллер
Каждый
периферийный узел содержит регистры контроллера PDC:
Обмен
осуществляется блоками данных по 8, 16 или 32 бита.
Контроллер
USB-интерфейса микроконтроллеров AT91SAM7S
Для
работы интерфейса USB используется единый блок генерации тактового сигнала -
один кварц для ядра микроконтроллера и USB.
Для
того, чтобы "заложить" наличие интерфейса USB в разрабатываемом
устройстве, необходимо всего 6 внешних компонентов.

Рис.4 Схема включения интерфейса USB

Рис.5 Набор внешних компонентов для подключения USB-интерфейса микроконтроллера
В
дополнение в функции обмена данными, интерфейс USB может быть использован для
питания микроконтроллера и всего устройства, а значит позволит продлить время
работы устройства с питанием от батарей или аккумуляторов.
Микроконтроллеры
AT91SAM7S содержат аналогово-цифровой преобразователь (АЦП), который
Запуск преобразования может быть
осуществлен различными способами (см. рис. 6)

Рис.6 Схема запуска преобразования АЦП
После запуска преобразования
может быть выполнено:
АЦП поддерживает следующие режимы
работы:
По
окончании каждого преобразования результат может быть считан в заданном
формате.

Рис.7
Схема чтения результата преобразования АЦП
Все
процедуры запуска преобразования и чтения результата преобразования АЦП могут
выполняться также без участия ядра микроконтроллера под управлением контроллера
PDC.
Питание
АЦП осуществляется от 3.3-вольтовой линии питания VDDIN, и в момент преобразования
ток потребления составляет 1мА. Для снижения энергопотребления в период между
преобразованиями в АЦП предусмотрен режим энергосбережения (sleep mode), ток
потребления АЦП в котором не превышает 1мкА.
В
качестве источника опорного напряжения предполагается использование внешнего
источника напряжением от 2.6 Вольт до значения VDDIN.
Контроллер
ШИМ микроконтроллеров AT91SAM7S включает 4 независимых канала для
генерации широтно-модулированных сигналов.
Контроллер ШИМ позволяет

Рис.8 Генерация ШИМ-сигнала без перекрытия на двух каналах
Блок ШИМ можно разбить на 2
части:
а)
генератор тактового сигнала -> генерация двух независимых тактовых сигналов
clkA и clkB, а также сигналов кратных 2n, где n - целое число 1..10;
б)
управление каналами -> включение/выключение канала;
в)
управление прерываниями -> разрешение/запрещение прерываний.
а)
выбор источника тактового сигнала;
б)
выбор режима работы канала (форматирование импульсов по левому краю, правому
краю и по центру);
в)
управление параметрами частоты и скважности сигнала;
г)
счет импульсов;
д)
синхронное изменение формы выходных сигналов (регистр PWM_CUPD) при установке
новых параметров сигнала.
Выходные
сигналы ШИМ в режиме PIOA (2 режима включения периферии на внешние выводы -
PIOA и PIOB) мультиплексированы с внешними выводами PA0, PA1 и PA2, имеющими
удвоенную нагрузочную способность, что позволяет осуществлять подключение
внешних цепей с током нагрузки до 16 мА.
Микроконтроллеры
AT91SAM7S содержат контроллер управления питанием (Power
Management Controller, PMC), выполняющий следующие функции:
Главным
достоинством контроллера управления питанием является возможность гибкого
управления характеристиками энергопотребления при различных конфигурациях
рабочей частоты ядра и периферии:
Управление
частотами позволяет выключать неиспользуемую периферию на различные промежутки
времени (Рис.9).

Рис.9
Схема управления и распределение тактовой частоты.
При
работе от внутреннего тактового RC-генератора тактовая частота может
варьироваться в пределах от 22 до 42 кГц.
Для
внешнего высокочастотного генератора может быть использован кварцевый резонатор
с частотой от 3 до 20 МГц. При использовании кварца с частотой менее 8 МГц
необходимо добавить резистор на 1 кОм, включенный последовательно в цепь XOUT.
Далее
для повышения тактовой частоты необходимо сконфигурировать блок ФАПЧ (рис.xxx).
Для расчета номиналов внешних элементов фильтра можно использовать
программу "PLL Filter Calculator", распространяемую свободно.

Рис.10
Схема включения внешних элементов фильтра ФАПЧ.
В
случае отказа внешнего высокочастотного тактового генератора микроконтроллер
автоматически переключается на тактирование от внутреннего RC-генератора.
PIOA – единый порт МК имеющий 32 вывода.
Для
работы с МК на уровне логических сигналов, происходит общение с 32-битным
портом, который в свою очередь мультиплексируется на каждом выводе в
функциональном внутренним блоком МК.
Каждый вывод можно с конфигурировать как:
– вход
– выход
– отключить
– выводной периферийного блока A
– выводной периферийного блока B
– с подтягивающим R на VCC
– с Glitch (фильтр дребезга контактов)
Чтобы
произвести запись-чтение в вывод порта, необходимо его предварительно
инициализировать (указать направление, связь с внутренней периферией, включить
в работу с нужным выводом других блоков, например PMC, USART, AIC
и т.д. ). Только после инициализации с выводом можно работать. Если нужно
изменить конфигурацию, то необходимо его вновь инициализировать.
Для
работы с любым выводом настроенным на вход или выход – необходимо работать
регистром PIOA. В регистр PIOA, по маске, в вывод
записывается 1 или 0 в зависимости от нужного результата.
Чтобы
записывать в вывод значение “0” или “1” - необходимо изменить при инициализации
значение приблизительно 20 регистров, соответствующее этому биту.
Работа
c PIOA на программном уровне - работа с блоком PIOA,
если с аппаратным, то выбирается, с какой периферией будет производиться
работа.
//
инициализация
// PIO enable
data=0x001F80ff;
// pck if 31 bit eq 0
regs->PIOA_PER =data;
regs->PIOA_PDR =~data;
// Output Enable
data=0x801080ff;
regs->PIOA_OER =data;
regs->PIOA_ODR =~data;
// Glitch
data=0x000F0000;
regs->PIOA_IFER =data;
regs->PIOA_IFDR =~data;
data=0x80000000;
regs->PIOA_SODR =data;
regs->PIOA_CODR = data;
data=0x00000000;
regs->PIOA_IER =data;
regs->PIOA_IDR =~data;
data=0x00000000;
regs->PIOA_MDER =data;
regs->PIOA_MDDR =~data;
// Pull-up
data=0x001080ff; // pck if 31 bit eq 0
regs->PIOA_PPUER=data;
regs->PIOA_PPUDR=~data;
data=0x00000000;
regs->PIOA_ASR =data;
regs->PIOA_BSR =~data;
// Output status write enable
data=0x001080ff; // pck if 31 bit eq 0
regs->PIOA_OWER =data;
regs->PIOA_OWDR =~data;
Этот пример легко воспринимается, если обращаться к
datasheet, 233 стр.
В данном примере
рассматривается вариант мигания светодиодами и используется 3 светодиода,
подключенных к 3 первым выводом на порту PIOA[2..0].
Подключены
следующим образом -> СветоДиод + Резистор(0.51К) + 3.3V.
Такое включение не случайно, требование из
даташит, раздел DBGU, и необходимо для программирования через
последовательную шину блока DBGU. Дело в том что, для программирования через
DBGU – необходимо на этих выводах установить уровни логической «1».
void
init_show(void) {
AT91PS_SYS regs = AT91C_BASE_SYS;
unsigned int xxx=0;
while(xxx<6){
delay();
witch
(xxx){
case
0: regs->PIOA_ODSR = ~0x1; break;
case
1: regs->PIOA_ODSR = ~0x2; break;
case
2: regs->PIOA_ODSR = ~0x4; break;
case
3: regs->PIOA_ODSR = ~0x4; break;
case
4: regs->PIOA_ODSR = ~0x2; break;
case
5: regs->PIOA_ODSR = ~0x1; break;
} xxx++;
}
}
Как видно из этого примера, для того чтобы зажечь
светодиод, подтянутый в свою очередь к VCC, необходимо подать на вывод –
логический “0”, это делается так - ~0x1. И так
до тех пор, пока светодиод не проделает путь – 1-2-3-3-2-1 светодиоды.
Следствием того, что все 32 вывода
конфигурируемы на произвольную комбинацию, есть ряд неудобств, при сравнении с
8-ми битными МК.
Например, работать с 8-ми битной
шиной менее удобно, так как приходиться постоянно работать с 32 битами и
накладывать маску. Как следствие, прибегая к возможностям языка
программирования С, необходимо автоматизировать эту задачу используя процедуры.
В данном примере это неудобство явно выражено.
Надо заметить, что подобную задачу
могут решать совершенно иначе.
PMC блок - предназначен
для конфигурации источников тактового сигнала и связи источников с другими
модулями USART, SPI, PIOA и т. д.
Отличительная возможность МК на базе ARM ядра, является возможность вывода внутренней тактовой частоты на вывод МК, что дает исключительную возможность тактировать внешнюю схему, например, для организации синхронной схемы внешних узлов устройства. При этом надо заметить, что средствами конфигурации регистров блока PMC, можно сделать тактовую частоту контроллера почти любой, также в ходе работы тактовую частоту можно изменять.
3.1 Пример:
data=0x00000401;
regs->PMC_SCER=data;
regs->PMC_SCDR=~data;
data=0x001f80ff; // pck if 31 bit eq 0
regs->PMC_PCER=data;
regs->PMC_PCDR=~data;
data=0x00000001;
regs->PMC_MCKR=data;
data=0x0000ff01;
regs->PMC_MOR=data;
data=0x00007f01;
regs->PMC_PLLR=data;
data=0x0000040d;
regs->PMC_IER=data;
regs->PMC_IDR=~data;
data=0x0000040d;
regs->PMC_IMR=data;
data=0x00000000;
regs->PMC_IER=data;
regs->PMC_IDR=~data;
data=0x00000000;
regs->PMC_IMR=data;
Здесь комментарий // pck if 31 bit eq 0 показывает регистр в котором конфигурируется
31 вывод как “источник кактовой частоты” для тактирования схемы.
AIC -
Расширенный контроллер прерываний
Данный
блок отвечает за генерацию прерываний. Конфигурирование этого блока настраивает
условия, какой из источников прерываний должен генерировать сигнал прерывания,
по событию возникновения прерывания, источником которого является любой из
блоков, в котором включено прерывание.
4.1 Пример:
/* Init SMR1 - system controller interrupt */
/*
Priority = 3 */
regs->AIC_SMR[1] = 0x03; // - в этом
регистре задается приоритет прерывания
/* Load
VECTOR */
regs->AIC_SVR[1] = (unsigned
int)isrPIT; // - в этом регистре
задается процедура обрабатывающая
//
возникшее прерывания
/* Enable system controller's interrupt * /
regs->AIC_IECR |= 2;
regs->AIC_IDCR &= ~2; // значение – идентификатор, из таблицы
прерываний, в данном случае это
//
SYSIRQ. ( См.
Datasheet - Table 11.3)

Если
Вам необходимо включить USART1, то в конфигурационный регистр необходимо будет
записать как маску, значение – 128;
regs->AIC_IECR
|= 128;
regs->AIC_IDCR
&= ~128;
Пример приведен в
разделе «
9.2 Использование прерывания»
DBGU - дебаг-юнит. Блок для пошаговой отладки МК с
использованием специальных аппаратно-программных средств. Не менее важной его
особенностью есть присутствие в нем USB и RS232. Это дает возможность
программировать через последовательную шину. Для этого существуют программные
средства, работающие по протоколу SAM-BA (SAM - Boot Assistant)
В
случае автора статьи - этот порт используется для программирования через
последовательную шину RS232, при этом используются стандартные средства OS
Linux.
Для начала необходимо
проинициализировать терминал на скорость порта, делается это запуском команды
minicom. Как только программа запустилась – выходим из нее. (предварительно в
minicom должны стаять настройки порта на 115200). Все. Теперь, необходимо на
последовательный порт послать файл, который будет «заливаться» в МК.
bash$ cat
init.txt > /dev/ttyS0 && cat file.txt > /dev/ttyS0
Таким
образом, на скорости порта 115200, файл file.txt посылается в RAM (или в FLASH ) SAM-BA. По завершению программирования, данные в
памяти МК SAM-BA исполняются ( предварительно скопировавшись в память
контроллера ), и МК начинает свою работу программы с адреса 0x202000.
Для
программирования МК по SAM-BA, необходимо чтобы:
-
кварцевый генератор имел частоту - 18.432 МГц.
-
PIOA[2..0] имели после включения логический уровень "1"
Что бы можно было с модуля DBGU, после инициализации (необходимо проинициализировать
регистры конфигурации ), работать как последовательным портом RS232. Здесь
используется только 2 вывода – TX и RX.
// Init
USART (DBGU)
AT91PS_DBGU
regs = AT91C_BASE_DBGU;
AT91PS_PIO
pio = AT91C_BASE_PIOA;
regs->DBGU_CR
= AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;
delay();
regs->DBGU_CR
= AT91C_US_RXEN | AT91C_US_TXEN;
regs->DBGU_MR
= 0x800; // No parity, normal mode
regs->DBGU_BRGR
= 0xA; // 115200 @ 18.432 MHz
// Init IO
// Disable
PIO - DBGU pins
pio->PIO_PDR
|= (AT91C_PIO_PA9 | AT91C_PIO_PA10);
pio->PIO_PER
&= ~(AT91C_PIO_PA9 | AT91C_PIO_PA10);
// Enable
peripheral A - DBGU pins
pio->PIO_ASR
|= (AT91C_PIO_PA9 | AT91C_PIO_PA10);
pio->PIO_BSR
&= ~(AT91C_PIO_PA9 | AT91C_PIO_PA10);
Видно, что можно использовать этот модуль как
простой RS232. Этого более чем достаточно для простых, а иногда для сложных
проектов. Для более сложных проектов лучше использовать блоки USART0 или
USART1, так как в них присутствует аппаратный контроль потока (RTS, CTS,
ит.д.), чего нет в DBGU.
//Watchdog Disable
AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;
Для
включения МК AT91SAM7S256 – необходимо правильно собрать схему включения МК,
особенно соблюдать все правила относительно выводов - VDDIN, VDDOUT, VDDFLASH,
VDDIO, VDDCORE, VDDPLL, GND. Так как, в случае не правильного монтажа есть
риск, что МК будет испорчен по причине перегорания. Это же правило относится и
к всем сигнальным выводам.
Перед
началом работы с МК, необходимо:
–
проверить, что возле места сборки нет мощного источника статического заряда
(телевизор, монитор, мощный электродвигатель и т.д.)
–
монтаж проводить таким образом, что бы, не перегреть микросхему.
–
на собранную схему подать правильное напряжение питание и проверить наличие
всех напряжений на выводах МК.

Рисунок 2 – структурная схема включения МК
На
выводах VDDFLASH, VDDIO, VDDIN необходимо наличие напряжения +3,3В, это
напряжение которое подается от стабилизированного источника на плате. Эти
выводы должны быть соединены вместе и эти три вывода должны иметь подключенные
фильтрующие конденсаторы на землю. Значения емкостей конденсаторов минимум
0,1мкф.
Если
необходимо что бы выводы периферии работали с 5 вольтовыми уровнями сигнала, то
на вывод VDDIO необходимо подать +5В отдельно, не соединяя его с выводами
VDDFLASH и VDDIN.
На
выводах VDDOUT, VDDCORE, VDDPLL необходимо наличие напряжения +1,85В, это
напряжение которое стабилизируется внутри МК и подается ядро МК. Эти три вывода
должны иметь подключенные конденсаторы на землю. Значения емкостей
конденсаторов минимум 0,1мкф.
Более полная, схема как пример включения МК приведена на
рисунке 3 , рисунке 4.

Рисунок 3 – принципиальная схема включения МК – необходимый
минимум.

Рисунок 4 – принципиальная схема включения МК – объединение
с внешней схемой.

Рисунок 4.1 –
принципиальная схема включения МК – объединение с внешней схемой.
Clocks Oscillators and PLLs
XIN Main Oscillator Input
XOUT Main Oscillator Output
PLLRC PLL Filter
PCK0 - PCK2
Programmable Clock Output
Reset/Test
NRST Microcontroller Reset
TST Test Mode Select
Debug Unit
DRXD Debug Receive Data
DTXD Debug Transmit Data
PIO
PA0 - PA31 Parallel IO Controller
Фрагмент
из datasheet, поясняющий основные моменты, касающиеся блока тактирования МК.

Рисунок 5 – структурная схема блока тактирования.

Рисунок 6 – схема включения кварцевого резонатора
На
рисунке 6, конденсаторы C1 и C2 с
номиналами 15-27пФ, кварцевый генератор имеет значение 18,432 МГц.
Обратите
внимание: МК не будет программироваться через SAM-BA, если будет использоваться
при программировании кварцевый резонатор с частотой отличной от 18,432 МГц.
Для сборки проекта используется GCC-компилятор,
предварительно который скомпилированный под ARM архитектуру.
Для
сборки бинарного файла из исходного кода необходимо скомпилировать проект.
Правила компилятора и сам момент компиляции описывается в файле Makefile.
Makefile – необходимый файл для компилятора
GCC, используется при компиляции. В этом файле указываются все правила,
параметры, атрибуты компилятора и порядок следования процесса компиляции.
##################################
#
Makefile for AT91SAM7S #
##################################
CWD =.
PATH_GL =/usr/local/arm/bin
PATH_EX =`pwd`
CROSS =arm-elf-
CC =$(PATH_GL)/$(CROSS)gcc
CPP =$(PATH_GL)/$(CROSS)cpp
AS =$(PATH_GL)/$(CROSS)as
LD =$(PATH_GL)/$(CROSS)ld
OBJCOPY =$(PATH_GL)/$(CROSS)objcopy
OBJDUMP =$(PATH_GL)/$(CROSS)objdump
STRIP =$(PATH_GL)/$(CROSS)strip
HOSTCC =gcc
OBJ =./obj
BIN =./bin
INCLUDE =./include
SOURCE =./src
LINKER =./linker
LIBPATH =/usr/local/arm/arm-elf/lib
LIBGCC =/usr/local/arm/lib/gcc-lib/arm-elf/3.3.6/
INCPATH =/usr/local/arm/lib/gcc-lib/arm-elf/3.3.6/include
#CFLAGS =-c
-g -marm -mapcs-frame
CFLAGS =-c
-g -marm
OBJS =startup.o
OBJS +=exit.o
OBJS +=GOTO.o
OBJS +=MDSA.o
OBJS +=interrupt.o
OBJS +=delays.o
OBJS +=init.o
OBJS +=lcd.o
OBJS +=usart.o
OBJS +=ports.o
OBJS +=spi.o
OBJS +=mmc.o
OBJFILE =$(foreach
d, $(OBJS), $(OBJ)/$(d))
#LDSCRPT=Flash
LDSCRPT =RAM
all: $(OBJFILE)
$(LD)
-o $(BIN)/MDSA.elf $(OBJFILE) -I$(INCPATH) -L$(LIBPATH) -L$(LIBGCC) -lc -lgcc
--script=$(LINKER)/$(LDSCRPT).ld
$(OBJDUMP)
-SD $(BIN)/MDSA.elf > $(BIN)/dump
rm
-f $(PATH_EX)/MDSA.bin
$(OBJCOPY)
-O binary $(BIN)/MDSA.elf $(BIN)/MDSA.bin
$(BIN)/cmdgen
$(BIN)/MDSA.bin > $(BIN)/MDSA.txt
$(OBJ)/%.o: $(SOURCE)/%.c $(INCLUDE)/*.h
$(CC)
-I$(INCLUDE) $(CFLAGS) $< -o $@
$(OBJ)/%.o: $(SOURCE)/%.s
$(AS)
$< -o $@
clean:
rm
-f $(OBJ)/*.o
rm
-f $(BIN)/MDSA.elf
rm
-f $(BIN)/MDSA.bin
rm
-f $(BIN)/dump
rm
-f $(BIN)/MDSA.txt
rm
-f $(PATH_EX)/MDSA.bin
x:
make
clean
make
all
cat
./bin/SAMBA_init.txt>/dev/ttyS0 && cat ./bin/MDSA.txt>/dev/ttyS0
Работа с этим файлом
производится стандартно, при помощи команды – make
Что
бы понять, как происходит обработка процедур прерывания нужно понять, как и в
какой последовательности и что происходит.
Прерыванию,
чтобы случиться, нужно преодолеть следующий путь:
Периферия ---> Advanced Interrupt
Controller(AIC) ---> ARM core
Периферия - любой периферийный источник прерывания (SPI,
USART, таймер, ADC и т.д.)
Если хотя бы на одном из
этих 3-х участков прерывания запрещены, то они не возникнут
На уровне ARM core
прерывания запрещаются во всех Mode кроме User Mode - в регистре CPSR
устанавливаются биты запрещения (!) прерываний IRQ(I_bit) и FIQ(F_Bit):
(startup.s)
<начало
файла>
…
# Enter Undefined Instruction
Mode and set its Stack Pointer
MSR CPSR_c,
#Mode_UND|I_Bit|F_Bit
MOV SP, R0
SUB R0, R0, #UND_Stack_Size
# Enter Abort Mode and set its
Stack Pointer
MSR CPSR_c, #Mode_ABT|I_Bit|F_Bit
MOV SP, R0
SUB R0, R0, #ABT_Stack_Size
# Enter FIQ Mode and set its
Stack Pointer
MSR CPSR_c,
#Mode_FIQ|I_Bit|F_Bit
MOV SP, R0
SUB R0, R0, #FIQ_Stack_Size
# Enter IRQ Mode and set its
Stack Pointer
MSR CPSR_c,
#Mode_IRQ|I_Bit|F_Bit
MOV SP, R0
SUB R0, R0, #IRQ_Stack_Size
# Enter Supervisor Mode and set
its Stack Pointer
MSR CPSR_c,
#Mode_SVC|I_Bit|F_Bit
MOV SP, R0
SUB R0, R0, #SVC_Stack_Size
# Enter User Mode and set its
Stack Pointer
MSR CPSR_c, #Mode_USR
MOV SP, R0
…
<конец
файла>
На уровне AIC глобально прерывания разрешены (регистр
AIC_DEBUG, бит GMSK = 0), а индивидуально все запрещены.
Чтобы разрешить прерывание от какой-либо периферии, надо
записать в регистры AIC_IECR, AIC_IDCR. Каждый бит этих регистров управляет
прерыванием от конкретной периферии (UART0, UART1, SPI, ADC и т.д.).
0 бит - Fast interrupt (FIQ), 1 бит - прерывание от System controller.
1.
Записываем регистр периода для таймера значение, включаем таймер, разрешаем
прерывания от таймера. Все это делается записью в один регистр.
/* Load PIV
and enable PIT with its interrupt */
regs->PITC_PIMR
= 0x03000900; /* 1 ms @ 36.864 MHz */
После
этого прерывания возникать еще не будут.
Теперь
необходимо разрешить прерывания на уровне Advanced Interrupt Controller
PIT
находится в System Controller, поэтому включаем прерывание от System
Controller:
1. Записываем адрес
функции-обработчика прерывания
/* Load
VECTOR */
regs->AIC_SVR[1]
= (unsigned int)isrSYS;
Здесь функция обработчик
объявляется как обычная: void isrSYS(void);
2. Конфигурируем
прерывание: приоритет и edge или level sensitive
/* Priority
to 3 */
regs->AIC_SMR[1]
= 0x3;
3. Разрешаем прерывание в AIC
/* Enable
system controller's interrupt */
regs->AIC_IECR
|= 2;
regs->AIC_IDCR
&= ~2;
После этих изменений
прерывания от PIT будут возникать.
Так
как и PIT и DBGU (СОМ-порт) находятся в System Controler, то обработчик
прерывания у них один на всех. Поэтому внутри обработчика проверяются флаги
событий от периферии, чтобы знать, какая периферия вызвала прерывание.
Здесь
рассмотрен пример работы с прерыванием, надо заметить что таймер находится в
периферии SYSIRQ, в той же периферии находится и приемник с передатчиком от
DBGU блока.
void
isrSYS(void) {
unsigned int tmp,i;
AT91PS_SYS regs = AT91C_BASE_SYS;
AT91PS_USART usart1 = AT91C_BASE_US1;
regs->PIOA_ODSR ^= 0x80000000; regs->PIOA_ODSR ^= 0x80000000;
// программно тактируем вывод по маске 0x80000000 для
проверки частоты вызова от
// событий
системного таймера и DBGU
// чтение байта с
приемника DBGU
if
(regs->DBGU_CSR&AT91C_US_RXRDY){
get_ch_usart();
}
// выдача байта на
передатчик DBGU
if
(regs->DBGU_CSR®s->DBGU_IMR&AT91C_US_TXRDY){
put_ch_usart(0x25);
Tx_IRQ_off();
}
// системный таймер
if
(regs->PITC_PISR&AT91C_PITC_PITS){
tmp =
regs->PITC_PIVR;
SysCycleTmr(tmr_global_cnt);
}
}
пояснение:
– SysCycleTmr(tmr_global_cnt); процедура работы с таймером.
–
get_ch_usart(); процедура работы с приемником DBGU.
–
put_ch_usart(0x25); процедура
работы с передатчиком DBGU .