Чтобы запретить прерывание в VIC, необходимо сбросить соответствующий бит в регистре VICIntEnClr, который, в свою очередь, сбрасывает связанный с ним бит в регистре VICIntEnable. Производится также обращение к регистрам VlCSoftlnt и VICSoftlntClear. Биты регистра VICSoftlntClear будут сбрасывать соответствующие им биты в регистре VlCSoftlnt. Например, если VlCSoftlnt = 0x00000005 и бит 0 должен быть сброшен, то значение регистра VICSoftlntClear = 0x00000001 выполнит эту задачу. Перед новой операцией сброса того же самого бита в регистре VlCSoftlnt, для проведения которой предназначен соответствующий бит регистра VICSoftlntClear, необходимо предварительно задать VICSoftlntClear = 0x00000000. Другими словами, запись 1 в любой бит регистра с суффиксом Clear будет иметь одноразовый эффект для соответствующего бита регистра, которым он управляет.
Если разрешено сторожевое прерывание (прерывание от сторожевого таймера) при антипереполнении или недействительной (инвалидной) последовательности счета, то не существует способа сбросить это прерывание. Единственный вариант возврата из такого прерывания заключается в его запрещении в VIC (путем использования VICIntEnClr).
Пример
Пусть требуется, чтобы запросы прерываний, генерируемые UART0 и SPI0, классифицировались как векторизованные запросы IRQ (запрос от UART0 должен находиться на более высоком уровне, чем от SPI0), в то время как UART1 и I2C должны генерировать невекторизованные запросы IRQ. Для этого в VIC требуется сделать следующие установки:
VICIntSelect = 0x00000000 (SPIO, I2C, UART1 и UART0 - запросы IRQ =>
бит 10, бит 9, бит 7 и бит 6 сброшены).
VICIntEnable = ОхОООООбСО (SPIO, I2C, UART1 и UART0 — разрешенные
прерывания => бит 10, бит 9, бит 7 и бит 6 установлены).
VICDefVectAddr = 0х... (содержит стартовый адрес подпрограммы для
обслуживания невекторизованных запросов IRQ (т. е. UART1 и I2C)).
VICVectAddrO = Ох... (содержит стартовый адрес сервисной подпро-
граммы обслуживания запроса IRQ от UART0).
VICVectAddrl = Ох... (содержит стартовый адрес сервисной подпро-
граммы обслуживания запроса IRQ от SPI0).
VICVectCntlO = 0x00000026 (источник прерывания с индексом 6 (UART0)
разрешен как источник с приоритетом 0 (самым высоким)).
VlCVfectCntll = 0х0000002А (источник прерывания с индексом 10 (SPI0)
разрешен как источник с приоритетом 1).
После того, как поступит любой из запросов на прерывание (SPIO, I2C, UART0 или UART1), микроконтроллер переадресует выполнение программного кода на адрес 0x00000018. Для векторизованного и невекторизованного запросов IRQ в ячейке 0x18 может быть размещена следующая команда:
LDR рс, [рс, #-0xFF0]
Эта команда загружает в программный счетчик РС значение адреса, который находится в регистре VICVectAddr. В случае, если поступил запрос от UART0, содержимое регистра VICVectAddr будет идентично содержимому VICVectAddrO, а в случае, если поступил запрос от SPI0, — содержимому VICVectAddrl. Если ни UART0, ни SPI0 не генерировали запрос IRQ, а его сгенерировали UART1 и/или I2C, то содержимое регистра VICVectAddr будет идентично содержимому VICDefVectAddr.
НА ГЛАВНУЮ | | ЧТО ТАКОЕ PIC ? | | ПРОГРАММАТОР | | ПРОЕКТЫ | | СТАТЬИ | | ССЫЛКИ | | КАРТА САЙТА |