Прерывания

В этом разделе описываются особенности обработки прерываний в микроконтроллерах LGT8F88P/168P/328P.

Вектора прерываний

В микроконтроллерах LGT8F88P/168P/328P имеется 30 источников прерываний и есть возможность переноса начального адреса таблицы векторов прерываний. Каждый вектор прерывания занимает одно командное слово в LGT8F88P и два командных слова в LGT8F168P/328P.

Список векторов прерываний LGT8F88P

Адрес

Источник

Описание

1

0x0000

RESET

Внешний сброс, сброс при включении питания, сброс сторожевого таймера, отладка SWD, сброс по низкому напряжению

2

0x0001

INT0

Внешнее прерывание 0

3

0x0002

INT1

Внешнее прерывание 1

4

0x0003

PCI0

Прерывание по уровню на выводе 0

5

0x0004

PCI1

Прерывание по уровню на выводе 1

6

0x0005

PCI2

Прерывание по уровню на выводе 2

7

0x0006

WDT

Прерывание по переполнению сторожевого таймера

8

0x0007

TC2 COMPA

Прерывание таймера 2 по совпадению A

9

0x0008

TC2 COMPB

Прерывание таймера 2 по совпадению B

10

0x0009

TC2 OVF

Прерывание таймера 2 по переполнению

11

0x000A

TC1 CAPT

Прерывание таймера 1 по захвату

12

0x000B

TC1 COMPA

Прерывание таймера 1 по совпадению A

13

0x000C

TC1 COMPB

Прерывание таймера 1 по совпадению B

14

0x000D

TC1 OVF

Прерывание таймера 1 по переполнению

15

0x000E

TC0 COMPA

Прерывание таймера 0 по совпадению A

16

0x000F

TC0 COMPB

Прерывание таймера 0 по совпадению B

17

0x0010

TC0 OVF

Прерывание таймера 0 по переполнению

18

0x0011

SPI STC

Прерывание по завершению последовательной передачи SPI

19

0x0012

USART RXC

Прерывание по завершению приёма USART

20

0x0013

USART UDRE

Прерывание по пустому регистру данных USART

21

0x0014

USART TXC

Прерывание по завершению передачи USART

22

0x0015

ADC

Прерывание по завершению преобразования АЦП

23

0x0016

EE_RDY

Прерывание по готовности EEPROM

24

0x0017

ANA_COMP

Прерывание аналогового компаратора 0

25

0x0018

TWI

Прерывание двухпроводного последовательного интерфейса

26

0x0019

ANA_COMP1

Прерывание аналогового компаратора 1

27

0x001A

Зарезервировано

28

0x001B

PCI3

Прерывание по уровню на выводе 3

29

0x001C

PCI4

Прерывание по уровню на выводе 4

30

0x001D

TC3_INT

Прерывание таймера 3

Список векторов прерываний LGT8F168P/328P

Адрес

Источник

Описание

1

0x0000

RESET

Внешний сброс, сброс при включении питания, сброс сторожевого таймера, отладка SWD, сброс по низкому напряжению

2

0x0002

INT0

Внешнее прерывание 0

3

0x0004

INT1

Внешнее прерывание 1

4

0x0006

PCI0

Прерывание по уровню на выводе 0

5

0x0008

PCI1

Прерывание по уровню на выводе 1

6

0x000A

PCI2

Прерывание по уровню на выводе 2

7

0x000C

WDT

Прерывание по переполнению сторожевого таймера

8

0x000E

TC2 COMPA

Прерывание таймера 2 по совпадению A

9

0x0010

TC2 COMPB

Прерывание таймера 2 по совпадению B

10

0x0012

TC2 OVF

Прерывание таймера 2 по переполнению

11

0x0014

TC1 CAPT

Прерывание таймера 1 по захвату

12

0x0016

TC1 COMPA

Прерывание таймера 1 по совпадению A

13

0x0018

TC1 COMPB

Прерывание таймера 1 по совпадению B

14

0x001A

TC1 OVF

Прерывание таймера 1 по переполнению

15

0x001C

TC0 COMPA

Прерывание таймера 0 по совпадению A

16

0x001E

TC0 COMPB

Прерывание таймера 0 по совпадению B

17

0x0020

TC0 OVF

Прерывание таймера 0 по переполнению

18

0x0022

SPI STC

Прерывание по завершению последовательной передачи SPI

19

0x0024

USART RXC

Прерывание по завершению приёма USART

20

0x0026

USART UDRE

Прерывание по пустому регистру данных USART

21

0x0028

USART TXC

Прерывание по завершению передачи USART

22

0x002A

ADC

Прерывание по завершению преобразования АЦП

23

0x002C

EE_RDY

Прерывание по готовности EEPROM

24

0x002E

ANA_COMP

Прерывание аналогового компаратора

25

0x0030

TWI

Прерывание двухпроводного последовательного интерфейса

26

0x0032

ANA_COMP1

Прерывание аналогового компаратора 1

27

0x0034

Зарезервировано

28

0x0036

PCI3

Прерывание по уровню на выводе 3

29

0x0038

PCI4

Прерывание по уровню на выводе 4

30

0x003A

TC3_INT

Прерывание таймера 3

Примечание для LGT8FX8P:
Вектор сброса (RESET) начинает выполнение с адреса 0x0000.
Все остальные адреса векторов (кроме вектора сброса) могут быть перенаправлены на начальный адрес с выравниванием 512 байт с помощью бита IVSEL в регистре MCUCR и регистра IVBASE.

Обработка векторов прерываний

Типичная конфигурация программы для адресов вектора сброса и прерывания в LGT8F88P выглядит следующим образом:

0x000 RJMP RESET      ; Вектор сброса 
0x001 RJMP EXT_INT0   ; Внешнее прерывание 0
0x002 RJMP EXT_INT1   ; Внешнее прерывание 1
0x003 RJMP PCINT0     ; Прерывание по изменению уровня 0
0x004 RJMP PCINT1     ; Прерывание по изменению уровня 1
0x005 RJMP PCINT2     ; Прерывание по изменению уровня 2
0x006 RJMP WDT        ; Прерывание сторожевого таймера
0x007 RJMP TIM2_COMPA ; Прерывание таймера 2 по совпадению A
0x008 RJMP TIM2_COMPB ; Прерывание таймера 2 по совпадению B
0x009 RJMP TIM2_OVF   ; Прерывание таймера 2 по переполнению
0x00A RJMP TIM1_CAPT  ; Прерывание таймера 1 по захвату
0x00B RJMP TIM1_COMPA ; Прерывание таймера 1 по совпадению A
0x00C RJMP TIM1_COMPB ; Прерывание таймера 1 по совпадению B
0x00D RJMP TIM1_OVF   ; Прерывание таймера 1 по переполнению
0x00E RJMP TIM0_COMPA ; Прерывание таймера 0 по совпадению A
0x00F RJMP TIM0_COMPB ; Прерывание таймера 0 по совпадению B
0x010 RJMP TIM0_OVF   ; Прерывание таймера 0 по переполнению
0x011 RJMP SPI_STC    ; Прерывание по завершению передачи SPI
0x012 RJMP USART_RXC  ; Прерывание по завершению приёма USART
0x013 RJMP USART_UDRE ; Прерывание по пустому регистру данных USART
0x014 RJMP USART_TXC  ; Прерывание по завершению передачи USART
0x015 RJMP ADC        ; Прерывание по завершению преобразования АЦП
0x016 RJMP EE_RDY     ; Прерывание по готовности контроллера EEPROM
0x017 RJMP ANA_COMP   ; Прерывание компаратора
0x018 RJMP TWI        ; Прерывание контроллера TWI
0x019 NOP             ; Зарезервированный адрес
0x01A NOP             ; Зарезервированный адрес
0x01B RJMP PCI3       ; Прерывание по изменению уровня на выводе 3

RESET:
0x01C ldi r16, high(RAMEND) ; Main program start
0x01D out SPH, r16          ; Set Stack Pointer to top of RAM
0x01E ldi r16, low(RAMEND)
0x01F out SPL, r16
0x020 sei                   ; Enable interrupts
0x021 ...

Описание регистров

Регистр управления MCU — MCUCR

MCUCR: 0x35 (0x55)

Значение по умолчанию: 0x00

MCUCR

FWKEN

FPDEN

EXRFD

PUD

IRLD

IFAIL

IVSEL

WCE

R/W

R/W

R/W

R/W

R/W

W/O

R/O

R/W

R/W

Описание битов

Бит

Обозначение

Описание

[0]

WCE

Бит разрешения обновления MCUCR.
Перед обновлением MCUCR необходимо установить этот бит,
затем выполнить обновление регистра MCUCR в течение 6 циклов.

[1]

IVSEL

Бит выбора вектора прерывания.
Когда этот бит установлен в 1, адреса векторов прерываний
будут переназначены на новый адрес в соответствии
со значением регистра IVBASE.

[2]

IFAIL

Флаг сбоя загрузки конфигурации системы.
0 = проверка конфигурационной информации пройдена
1 = сбой загрузки конфигурационной информации

[3]

IRLD

Запись 1 инициирует перезагрузку конфигурации системы.

[4]

PUD

Глобальный бит запрета подтяжки (pull-up).
0 = глобальное управление подтяжкой включено
1 = подтягивающие резисторы на всех входах/выходах отключены

[5]

EXRFD

Бит запрета фильтрации внешнего сброса.
0 = цифровой фильтр внешнего сброса (190 мкс) включён
1 = цифровой фильтр внешнего сброса отключён

[6]

FPDEN

Управление питанием Flash (Power-down).
0 = после перехода системы в SLEEP питание Flash сохраняется
1 = после перехода системы в SLEEP питание Flash отключается

[7]

FWKEN

Управление режимом быстрого пробуждения.
Действителен только для режима Power/Off.
0 = задержка фильтрации 260 мкс
1 = задержка фильтрации 32 мкс

Регистр базового адреса векторов прерываний — IVBASE

IVBASE: 0x75

Значение по умолчанию: 0x00

IVBASE

IVBASE[7:0]

R/W

R/W

Описание битов

Биты

Обозначение

Описание

[7:0]

IVBASE

Если бит IVSEL установлен в 1, векторы прерываний (за исключением
вектора сброса) будут переназначены на новый базовый адрес
IVBASE страницей размером 512 байт.
Базовый адрес векторов прерываний после переназначения
вычисляется как:
(IVBASE << 8) + соответствующий адрес вектора
из таблицы векторов прерываний