Интерфейсы периферийных устройств. Ключев А.О - 228 стр.

UptoLike

227
TF1 6 Переполнение таймера/счетчика 1
I2CI+ISPI 7 Прерывание от I
2
C/SPI
RI+TI 8 Прерывание от UART
TF2+EXF2 9 (Низшая) Переполнение таймера/счетчика 2
Прерывания ADuC812 имеют вектора в диапазоне 0003h-0043h, которые
попадают в область младших адресов памяти программ. Это пространство
соответствует 8Кб (0000h-2000h) FLASH-памяти.
В стенде SDK-1.1 пользователь не имеет возможности записи во FLASH-
память (запись программ осуществляется во внешнюю память программ и
данных), следовательно, не может подставить свои процедуры обработки
прерываний (точнее, команды перехода к процедурам) по
адресам,
соответствующим векторам прерываний.
FLASH
0000h
004Ah
2000h
SRAM
204Ah
mov P0, #0
ljmp 20XXh
ljmp UserIntVector
Рис. 128. Использование прерываний в SDK-1.1
Проблема использования прерываний в пользовательских программах
решается следующим образом (см. рис. 128):
1. По адресам (0003h-0043h) векторов прерываний во FLASH-памяти
SDK-1.1 располагаются команды переходов на вектора
пользовательской таблицы, размещенной в адресах 2003h-2043h.
2. По адресам векторов пользовательской таблицы пользователем
указываются команды переходов на процедуры обработки прерываний.
Приведем пример помещения собственного вектора в пользовательскую
таблицу.
Программа использует прерывание от таймера 0 (прерывание 0Bh) для
зажигания линейки светодиодов. Данный пример адаптирован для компилятора
SDCC. По сравнению с компилятором Keil C51 изменения коснулись функции
SetVector (в связи с тем, что компилятор SDCC и микроконтроллер ADuC812
используют различные способы записи многобайтовых чисел в памяти; SDCC –
little-endian, ADuC812 big-endian) и заголовка функции обработчика
прерывания (T0_ISR).