Прерывание - временное приостановление работы основной программы
(например функции main()) для выполнения обработки какого-нибудь
действия
внешней функцией, что позволяет экономить ресурсы процессора не отвлекая
его на проверку разных событий. Прерывание может быть также
приостановлено для обработки другого прерывания если имеет высший
приоритет. При срабатывании прерывания, процессор запоминает все
переменные,
общие параметры программы и возвращается к ним после обработки
прерывания. В STM32f407VG как и у других микроконтроллерах на ядре
Cortex M4
имеется встроенный векторный контроллер прерываний - Nested Vectored Interrupt Controller (NVIC).
Он поддерживает до 240 динамических прерываний
и 256 уровней приоритета. NVIC встроенный в ядро Cortex M4, и не
является периферией, это значит что для его работы не нужно программно
подключать
тактирование в регистрах RCC. Для выполнения внутренних прерываний (тех
которые происходят от внутренней периферии или от самого ядра)
используется только NVIC, внешние прерывания обрабатываются отдельным
внешним контроллером прерываний - External interrupt/event controller
(EXTI). EXTI является частью NVIC .
Событие - это нечто, что может привлечь внимание контроллеров NVIC и EXTI. В работе NVIC и EXTI на физическом уровне заложены действия которые ими отслеживаются, но будет ли от них инициироваться прерывание - зависит от настроек регистров управления. Если происходит какое нибудь событие, оно может быть проверено, и если это "то что нужно" NVIC сгенерирует прерывание.
Адреса управляющих регистров прерываний:
#define NVIC_ICER0 *((uint32_t*)0xE000E180)//Interrupt Clear-Enable Registers
#define NVIC_ICER1 *((uint32_t*)0xE000E184)
#define NVIC_ICER2 *((uint32_t*)0xE000E188)
#define NVIC_ISPR0 *((uint32_t*)0xE000E200)//Interrupt Set-Pending Register
#define NVIC_ISPR1 *((uint32_t*)0xE000E204)
#define NVIC_ISPR2 *((uint32_t*)0xE000E208)
#define NVIC_ICPR0 *((uint32_t*)0xE000E280)//Interrupt Clear-Pending Register
#define NVIC_ICPR1 *((uint32_t*)0xE000E284)
#define NVIC_ICPR2 *((uint32_t*)0xE000E288)
#define NVIC_IABR0 *((uint32_t*)0xE000E300)//Active Bit Register
#define NVIC_IABR1 *((uint32_t*)0xE000E300)
#define NVIC_IABR2 *((uint32_t*)0xE000E300)
#define NVIC_IPR0 *((uint32_t*)0xE000E400)//Interrupt Priority Registers
#define NVIC_IPR1 *((uint32_t*)0xE000E404)
#define NVIC_IPR2 *((uint32_t*)0xE000E408)
#define NVIC_IPR3 *((uint32_t*)0xE000E40C)
#define NVIC_IPR4 *((uint32_t*)0xE000E410)
#define NVIC_IPR5 *((uint32_t*)0xE000E414)
#define NVIC_IPR6 *((uint32_t*)0xE000E418)
#define NVIC_IPR7 *((uint32_t*)0xE000E41C)
//.......................
#define CRC_DR *((uint32_t*)0x40023000)
#define CRC_IDR *((uint32_t*)0x40023004)
#define CRC_CR *((uint32_t*)0x40023008)
//........................
#define RCC_SYSCFG *((uint32_t*)0x40023844)
#define SYSCFG_MEMRMP *((uint32_t*)0x40013800)
#define SYSCFG_PMC *((uint32_t*)0x40013804)
#define SYSCFG_EXTICR1 *((uint32_t*)0x40013808)
#define SYSCFG_EXTICR2 *((uint32_t*)0x4001380C)
#define SYSCFG_EXTICR3 *((uint32_t*)0x40013810)
#define SYSCFG_EXTICR4 *((uint32_t*)0x40013814)
#define SYSCFG_CMPCR *((uint32_t*)0x40013820)
//..............EXTI...........
#define EXTI_IMR *((uint32_t*)0x40013C00)
#define EXTI_EMR *((uint32_t*)0x40013C04)
#define EXTI_RTSR *((uint32_t*)0x40013C08)
#define EXTI_FTSR *((uint32_t*)0x40013C0C)
#define EXTI_SWIER *((uint32_t*)0x40013C10)
#define EXTI_PR *((uint32_t*)0x40013C14)
Событие - это нечто, что может привлечь внимание контроллеров NVIC и EXTI. В работе NVIC и EXTI на физическом уровне заложены действия которые ими отслеживаются, но будет ли от них инициироваться прерывание - зависит от настроек регистров управления. Если происходит какое нибудь событие, оно может быть проверено, и если это "то что нужно" NVIC сгенерирует прерывание.
Адреса управляющих регистров прерываний:
#define NVIC_ICER0 *((uint32_t*)0xE000E180)//Interrupt Clear-Enable Registers
#define NVIC_ICER1 *((uint32_t*)0xE000E184)
#define NVIC_ICER2 *((uint32_t*)0xE000E188)
#define NVIC_ISPR0 *((uint32_t*)0xE000E200)//Interrupt Set-Pending Register
#define NVIC_ISPR1 *((uint32_t*)0xE000E204)
#define NVIC_ISPR2 *((uint32_t*)0xE000E208)
#define NVIC_ICPR0 *((uint32_t*)0xE000E280)//Interrupt Clear-Pending Register
#define NVIC_ICPR1 *((uint32_t*)0xE000E284)
#define NVIC_ICPR2 *((uint32_t*)0xE000E288)
#define NVIC_IABR0 *((uint32_t*)0xE000E300)//Active Bit Register
#define NVIC_IABR1 *((uint32_t*)0xE000E300)
#define NVIC_IABR2 *((uint32_t*)0xE000E300)
#define NVIC_IPR0 *((uint32_t*)0xE000E400)//Interrupt Priority Registers
#define NVIC_IPR1 *((uint32_t*)0xE000E404)
#define NVIC_IPR2 *((uint32_t*)0xE000E408)
#define NVIC_IPR3 *((uint32_t*)0xE000E40C)
#define NVIC_IPR4 *((uint32_t*)0xE000E410)
#define NVIC_IPR5 *((uint32_t*)0xE000E414)
#define NVIC_IPR6 *((uint32_t*)0xE000E418)
#define NVIC_IPR7 *((uint32_t*)0xE000E41C)
//.......................
#define CRC_DR *((uint32_t*)0x40023000)
#define CRC_IDR *((uint32_t*)0x40023004)
#define CRC_CR *((uint32_t*)0x40023008)
//........................
#define RCC_SYSCFG *((uint32_t*)0x40023844)
#define SYSCFG_MEMRMP *((uint32_t*)0x40013800)
#define SYSCFG_PMC *((uint32_t*)0x40013804)
#define SYSCFG_EXTICR1 *((uint32_t*)0x40013808)
#define SYSCFG_EXTICR2 *((uint32_t*)0x4001380C)
#define SYSCFG_EXTICR3 *((uint32_t*)0x40013810)
#define SYSCFG_EXTICR4 *((uint32_t*)0x40013814)
#define SYSCFG_CMPCR *((uint32_t*)0x40013820)
//..............EXTI...........
#define EXTI_IMR *((uint32_t*)0x40013C00)
#define EXTI_EMR *((uint32_t*)0x40013C04)
#define EXTI_RTSR *((uint32_t*)0x40013C08)
#define EXTI_FTSR *((uint32_t*)0x40013C0C)
#define EXTI_SWIER *((uint32_t*)0x40013C10)
#define EXTI_PR *((uint32_t*)0x40013C14)
Комментариев нет:
Отправить комментарий