Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорная техника Сторожок / MPLAB_C30_Руководство пользователя.pdf
Скачиваний:
161
Добавлен:
20.02.2016
Размер:
1.26 Mб
Скачать

Глава 8. Прерывания

При использовании атрибута interrupt, пожалуйста определите либо no_auto_psv, либо auto_psv. Если ничего не будет определено, будет выдано предупреждение и принято auto_psv.

8.3.3. Кодирование ISR

 

 

Следующий прототип декларирует функцию isr0 как обработчик прерывания:

 

 

void __attribute__((__interrupt__)) isr0(void);

 

 

Как видно из этого прототипа, функция обслуживания прерывания не должна иметь

 

 

параметров и не может возвращать значение. Если необходимо, компилятор

 

 

организует

сохранение всех рабочих

регистров, а также регистра состояния и

 

 

регистра счетчика циклов. Другие переменные

 

.

 

 

могут быть сохранены указанием их

 

 

 

 

 

 

 

 

A

 

 

 

имен как параметров атрибута interrupt. Например, чтобы заставить компилятор

 

 

автоматически сохранять и восстанавливать переменные var1 и var2, используется

 

 

следующий прототип:

Wilson

 

 

 

 

 

 

 

 

 

 

 

 

void __attribute__((__interrupt

(__save__(var1,var2))))

 

 

isr0(void);

 

 

 

 

 

 

 

Чтобы заставить компилятор использовать быстрое сохранение контекста

 

 

(использование команд push. и pop.s), надо пометить функцию атрибутом

 

 

shadow (см. п. 2.3.2. «Определение атрибутов функций»). Например:

 

 

void __attribute__((__interrupt

, __shadow__)) isr0(void);

 

 

8.3.4. Использование макросов для объявления простых ISR

 

 

Если обработчик

прерывания не требует никаких дополнительных параметров

 

 

 

 

 

by

 

 

 

 

 

 

атрибута прерывания, тогда может быть использован упрощенный синтаксис.

 

 

Следующие макросы определены в зависящих от устройства файлах заголовка:

 

 

#define _ISR __attri ute__((interrupt))

 

 

 

#define _ISRFAST __attribute__((interrupt, shadow))

 

 

исключенияTranslatedв основной и альтернативной таблицах, который занимает одно

 

 

Например, чтобы объявить обработчик прерывания для прерываний от timer1:

 

 

#include <p30fxxxx.h>

 

 

 

 

 

 

void

ISR

T1Int rrupt(void);

 

 

 

 

 

Чтобы объявлять обработчик прерывания для прерывания от SPI1 с быстрым

 

 

сохранением контекста:

 

 

 

 

 

 

#include <p30fxxxx.h>

 

 

 

 

 

 

void

ISRFAST

SPI1Interrupt(void);

 

 

8.4.

Запись вектора прерывания

 

 

 

 

 

Устройства dsPIC30F/33F и PIC24F/H имеют два таблицы векторов прерываний —

 

 

основную и альтернативную, и каждая содержит несколько векторов для

 

 

исключительных ситуаций.

 

 

 

 

 

 

Каждый источник исключительной ситуации имеет связанный с ним вектор

 

 

программное слово, как показано в таблицах ниже. Альтернативный вектор

 

 

используется, когда установлен бит ALTIVT в регистре INTCON2.

 

 

 

 

 

Примечание Сброс устройства не управляется таблицей векторов прерывания.

 

 

 

 

Вместо этого при сбросе устройства программный счетчик

 

 

 

 

очищается. Это заставляет процессор начинать выполнение с

 

 

 

 

нулевого адреса. По соглашению сценарий компоновки

 

 

 

 

устанавливает в этой позиции команду GOTO, которая передает

 

 

 

 

управление модулю запуска среды исполнения Си.

 

 

 

 

 

 

 

 

 

 

Для активации прерывания, адрес функции должен быть установлен по соответствующему адресу одной из таблиц векторов, а функция должна сохранять

© 2008 Microchip Technology Inc.

DS51284H(ru) стр. 8-3

16-битовый компилятор Си. Руководство

любые системные ресурсы, которые она использует. Она должна возвращать управление в задачу переднего плана, используя команду процессора RETFIE. Функции обслуживания прерывания могут быть написаны на Cи. Когда Си функция определяется как обработчик прерывания, компилятор организует сохранение всех системных ресурсов, которые он использует, и возвращение из функции с использованием подходящей команды. Компилятор может дополнительно установить в таблице векторов прерываний адрес функции обслуживания прерывания.

Чтобы заставить компилятор заполнить вектор прерывания указателем на функцию

обслуживания этого прерывания, назовите функцию, как обозначено в следующей

 

.

таблице. Например, вектор ошибки стека автоматически будет заполнен, если

определена следующая функция:

A

 

void __attribute__((__interrupt__)) _StackError(void);

Обратите внимание на необходимость использования подчеркивания в начале

обеспечить свой обработчик Wilsonпрерываний по умолчанию объявив функцию обслуживания прерывания с именем DefaultInterrupt.

имени. Аналогично, альтернативный вектор ошибки стека будет автоматически заполнен, если определена следующая функция:

void __attribute__((__interrupt )) _AltStackError(void);

Опять обратите внимание на ведущее подчеркивание.

Для всех векторов прерываний без заданных обработчиков, будет установлен

обработчик по умолчанию. Обработчик по умолчанию обеспечивается

компоновщиком и представляет собой просто сброс устройства. Приложение может

Последние девять векторов прерывания в каждой таблице не имеют предопределенных аппаратных функций. Вектора для этих прерываний могут быть

заполнены с использованием имен, указанных в следующей таблице, или можно

использовать более подходящиеby

приложению имена, одновременно указывая точку

входаTranslatedнужного вектора с помощью параметров irq или altirq атрибута

interrupt. Например, чтобы определить, что функция использует основной вектор прерывания номер 52, используйте следующее:

void attribu __((__interrupt__(__irq__(52)))) MyIRQ(void);

Аналогично, для того, чтобы определить, что функция использует альтернативный вектор прерывания пятьдесят два, используйте следующее:

void attribute__((__interrupt__(__altirq__(52)))) MyAltIRQ(void);

Число после irq/altirq может быть одним из номеров вектора прерывания от 45 до 53. Если использован параметр irq атрибута прерывания, компилятор создает внешний символ Interruptn, где n — номер вектора. Следовательно, идентификаторы Cи от _Interrupt45 до _Interrupt53 зарезервированы компилятором. Аналогично, если использован параметр altirq атрибута прерывания, компилятор создает внешний символ _AltInterruptn, где n — номер вектора. Следовательно, идентификаторы Cи от _AltInterrupt45 до _AltInterrupt53 зарезервированы компилятором.

8.4.1. Вектора прерываний dsPIC30F (без SMPS)

На настоящее время SMPS имеют только dsPIC30F1010, dsPIC30F2020 и dsPIC30F2023. Остальные устройства dsPIC30F без SMPS.

ТАБЛИЦА 8-1. ВЕКТОРА ПРЕРЫВАНИЙ dsPIC30F (БЕЗ SMPS)

Номер

Основной

Альтернативный

Описание

 

 

 

 

нет

_ReservedTrap0

_AltReservedTrap0

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

нет

_OscillatorFail

_AltOscillatorFail

Неисправность генератора

 

 

 

 

нет

_AddressError

_AltAddressError

Ошибка адресации

 

 

 

 

нет

_StackError

_AltStackError

Ошибка стека

 

 

 

 

DS51284H(ru) стр. 8-4

© 2008 Microchip Technology Inc.

Глава 8. Прерывания

ТАБЛИЦА 8-1. (ПРОД-Е) ВЕКТОРА ПРЕРЫВАНИЙ dsPIC30F (БЕЗ SMPS)

Номер

Основной

 

Альтернативный

 

Описание

 

 

 

 

 

 

 

нет

_MathError

 

_AltMathError

 

 

Математическая ошибка

нет

_ReservedTrap5

 

_AltReservedTrap5

 

 

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

 

 

 

 

 

 

 

нет

_ReservedTrap6

 

_AltReservedTrap6

 

 

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

 

 

 

 

 

 

 

нет

_ReservedTrap7

 

_AltReservedTrap7

 

 

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

 

 

 

 

 

 

 

0

_INT0Interrupt

 

_AltINT0Interrupt

 

 

INT0, внешнее прерывание 0

 

 

 

 

 

 

 

1

_IC1Interrupt

 

_AltIC1Interrupt

 

 

IC1, вход захвата 1

 

 

 

 

 

 

 

2

_OC1Interrupt

 

_AltOC1Interrupt

 

 

OC1, выход сравнения 1

 

 

 

 

 

 

 

3

_T1Interrupt

 

_AltT1Interrupt

 

 

TMR1, переполнение таймера 1

 

 

 

 

 

 

 

4

_IC2Interrupt

 

_AltIC2Interrupt

 

.

IC2, вход захвата 2

 

 

 

 

 

 

5

_OC2Interrupt

 

_AltOC2Interrupt

A

 

OC2, выход сравнения 2

 

 

 

 

 

 

6

_T2Interrupt

 

_AltT2Interrupt

 

 

TMR2, переполнение таймера 2

 

 

 

 

 

 

 

7

_T3Interrupt

 

_AltT3Interrupt

 

 

TMR3, переполнение таймера 3

 

 

 

 

 

 

 

8

_SPI1Interrupt

 

_AltSPI1Interrupt

 

 

SPI1, 1-й последовательный

 

 

 

интерфейс

 

 

 

 

 

 

 

 

 

 

 

 

 

9

_U1RXInterrupt

 

_AltU1RXInterrupt

 

 

UART1RX, приемник 1-го послед.

 

 

 

асинхронного интерфейса

 

 

 

 

 

 

 

 

 

 

 

 

 

10

_U1TXInterrupt

 

_AltU1TXInterrupt

 

 

UART1TX, передатчик 1-го

 

 

 

послед. асинхронн. интерфейса

 

 

 

 

 

 

 

 

 

 

 

 

 

11

_ADCInterrupt

 

_AltADCInterrupt

 

 

ADC преобразование окончено

 

 

 

 

 

 

 

12

_NVMInterrupt

 

_AltNVMInterrupt

 

 

NVM запись завершена

 

 

 

Wilson

 

 

 

13

_SI2CInterrupt

 

_AltSI2CInterrupt

 

 

I2C ведомый

14

_MI2CInterrupt

 

_AltMI2CInterrupt

 

 

I2C ведущий

15

_CNInterrupt

 

_AltCNInterrupt

 

 

CN изменение входа

 

 

 

 

 

 

 

16

_INT1Interrupt

by

_AltINT1Interrupt

 

 

INT1, внешнее прерывание 1

 

 

 

 

 

 

17

_IC7Interrupt

 

_AltIC7Interrupt

 

 

IC7, вход захвата 7

 

 

 

 

 

 

 

18

IC8Interrupt

 

_AltIC8Interrupt

 

 

IC8, вход захвата 8

 

 

 

 

 

 

 

19

OC3Interrupt

 

_AltOC3Interrupt

 

 

OC3, выход сравнения 3

 

 

 

 

 

 

 

20

OC4Int rrupt

 

_AltOC4Interrupt

 

 

OC4, выход сравнения 4

 

 

 

 

 

 

 

21

T4In errupt

 

_AltT4Interrupt

 

 

TMR4, переполнение таймера 4

 

 

 

 

 

 

 

22

T5Interrupt

 

_AltT5Interrupt

 

 

TMR5, переполнение таймера 5

 

 

 

 

 

 

 

23

INT2Interrupt

 

_AltINT2Interrupt

 

 

INT2, внешнее прерывание 2

 

 

 

 

 

 

 

24

U2RXInterrupt

 

_AltU2RXInterrupt

 

 

UART2RX, приемник 2-го послед.

 

 

 

асинхронного интерфейса

 

 

 

 

 

 

 

 

 

 

 

 

 

25

U2TXInterrupt

 

_AltU2TXInterrupt

 

 

UART2TX, передатчик 2-го

 

 

 

послед. асинхронн. интерфейса

 

 

 

 

 

 

 

 

 

 

 

 

 

26

SPI2Interrupt

 

_AltSPI2Interrupt

 

 

SPI2, 2-й последовательный

 

 

 

интерфейс

 

 

 

 

 

 

 

 

 

 

 

 

 

27

C1Interrupt

 

_AltC1Interrupt

 

 

CAN1, комбинированный IRQ

 

 

 

 

 

 

 

28

IC3Interrupt

 

_AltIC3Interrupt

 

 

IC3, вход захвата 3

Translated

 

 

 

 

 

29 IC4Interrupt

 

_AltIC4Interrupt

 

 

IC4, вход захвата 4

 

 

 

 

 

 

 

30

_IC5Interrupt

 

_AltIC5Interrupt

 

 

IC5, вход захвата 5

 

 

 

 

 

 

 

31

_IC6Interrupt

 

_AltIC6Interrupt

 

 

IC6, вход захвата 6

 

 

 

 

 

 

 

32

_OC5Interrupt

 

_AltOC5Interrupt

 

 

OC5, выход сравнения 5

 

 

 

 

 

 

 

33

_OC6Interrupt

 

_AltOC6Interrupt

 

 

OC6, выход сравнения 6

 

 

 

 

 

 

 

34

_OC7Interrupt

 

_AltOC7Interrupt

 

 

OC7, выход сравнения 7

 

 

 

 

 

 

 

35

_OC8Interrupt

 

_AltOC8Interrupt

 

 

OC8, выход сравнения 8

 

 

 

 

 

 

 

36

_INT3Interrupt

 

_AltINT3Interrupt

 

 

INT3, внешнее прерывание 3

 

 

 

 

 

 

 

37

_INT4Interrupt

 

_AltINT4Interrupt

 

 

INT4, внешнее прерывание 4

 

 

 

 

 

 

 

38

_C2Interrupt

 

_AltC2Interrupt

 

 

CAN2, комбинированный IRQ

 

 

 

 

 

 

 

39

_PWMInterrupt

 

_AltPWMInterrupt

 

 

PWM, конец периода

 

 

 

 

 

 

 

40

_QEIInterrupt

 

_AltQEIInterrupt

 

 

QEI, сравнение позиции счетчика

 

 

 

 

 

 

 

© 2008 Microchip Technology Inc.

DS51284H(ru) стр. 8-5

16-битовый компилятор Си. Руководство

ТАБЛИЦА 8-1. (ПРОД-Е) ВЕКТОРА ПРЕРЫВАНИЙ dsPIC30F (БЕЗ SMPS)

Номер

Основной

Альтернативный

 

Описание

 

 

 

 

 

 

41

_DCIInterrupt

_AltDCIInterrupt

 

 

DCI CODEC, конец передачи

42

_LVDInterrupt

_AltLVDInterrupt

 

 

PLVD, обнаружено низкое

 

 

напряжения

 

 

 

 

 

 

 

 

 

 

 

43

_FLTAInterrupt

_AltFLTAInterrupt

 

 

FLTA MCPWM ошибка A

 

 

 

 

 

 

44

_FLTBInterrupt

_AltFLTBInterrupt

 

 

FLTB MCPWM ошибка B

 

 

 

 

 

 

45

_Interrupt45

_AltInterrupt45

 

 

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

 

 

 

 

 

 

46

_Interrupt46

_AltInterrupt46

 

 

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

 

 

 

 

 

 

47

_Interrupt47

_AltInterrupt47

 

.

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

 

 

 

 

 

 

 

 

48

_Interrupt47

_AltInterrupt48

A

 

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

 

 

 

 

 

 

 

 

49

_Interrupt49

_AltInterrupt49

 

 

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

 

 

 

 

 

 

50

_Interrupt50

_AltInterrupt50

 

 

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

 

 

 

 

 

 

51

_Interrupt51

Wilson

 

 

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

_AltInterrupt51

 

 

52

_Interrupt52

_AltInterrupt52

 

 

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

53

_Interrupt53

_AltInterrupt53

 

 

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

8.4.2. Вектора прерываний d PIC30F (с SMPS)

На настоящее время SMPS имеют только dsPIC30F1010, dsPIC30F2020 и dsPIC30F2023. Остальные устройства dsPIC30F без SMPS.

ТАБЛИЦА 8-2. ВЕКТОРА ПРЕРЫВАНИЙ dsPIC30F (С SMPS)

Номер

Основной

by

Альтернативный

Описание

 

 

 

 

 

 

нет

_ReservedTrap0

 

_AltReservedTrap0

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

нет

_OscillatorFail

 

_AltOscillatorFail

Неисправность генератора

 

 

 

 

 

нет

_AddressError

 

_AltAddressError

Ошибка адресации

 

 

 

 

 

Translated

 

_AltStackError

Ошибка стека

нет

StackError

 

нет

MathError

 

_AltMathError

Математическая ошибка

нет

Reserv dTrap5

 

_AltReservedTrap5

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

нет

ReservedTrap6

 

_AltReservedTrap6

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

нет

ReservedTrap7

 

_AltReservedTrap7

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

0

INT0Interrupt

 

_AltINT0Interrupt

INT0, внешнее прерывание 0

1

IC1Interrupt

 

_AltIC1Interrupt

IC1, вход захвата 1

2

OC1Interrupt

 

_AltOC1Interrupt

OC1, выход сравнения 1

3

T1Interrupt

 

_AltT1Interrupt

TMR1, переполнение таймера 1

 

 

 

 

 

4

Interrupt4

 

_AltInterrupt4

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

 

 

 

 

 

5

OC2Interrupt

 

_AltOC2Interrupt

OC2, выход сравнения 2

 

 

 

 

 

6

T2Interrupt

 

_AltT2Interrupt

TMR2, переполнение таймера 2

 

 

 

 

 

7

T3Interrupt

 

_AltT3Interrupt

TMR3, переполнение таймера 3

 

 

 

 

 

8

SPI1Interrupt

 

_AltSPI1Interrupt

SPI1, 1-й последовательный

 

интерфейс

 

 

 

 

 

 

 

 

 

9

_U1RXInterrupt

 

_AltU1RXInterrupt

UART1RX, приемник 1-го послед.

 

асинхронного интерфейса

 

 

 

 

 

 

 

 

 

10

_U1TXInterrupt

 

_AltU1TXInterrupt

UART1TX, передатчик 1-го

 

послед. асинхронн. интерфейса

 

 

 

 

 

 

 

 

 

11

_ADCInterrupt

 

_AltADCInterrupt

ADC преобразование окончено

 

 

 

 

 

12

_NVMInterrupt

 

_AltNVMInterrupt

NVM запись завершена

 

 

 

 

 

13

_SI2CInterrupt

 

_AltSI2CInterrupt

I2C ведомый

14

_MI2CInterrupt

 

_AltMI2CInterrupt

I2C ведущий

15

_Interrupt15

 

_AltInterrupt15

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

 

 

 

 

 

16

_INT1Interrupt

 

_AltINT1Interrupt

INT1, внешнее прерывание 1

 

 

 

 

 

17

_INT2Interrupt

 

_AltINT2Interrupt

INT2, внешнее прерывание 2

 

 

 

 

 

DS51284H(ru) стр. 8-6

© 2008 Microchip Technology Inc.

Соседние файлы в папке Микропроцессорная техника Сторожок