External interrupt/event controller block diagram
Контроллер имеет 18 линий прерывания/событий, из них 16 линий можно подключить к линиям ввода-вывода. Генерирование прерываний/событий возможно по нарастающему и спадающему фронту входного сигнала, так же возможно принудительно (программно) сформировать прерывания/событие) путем записи соответствующего бита регистра Software interrupt event register (EXTI_SWIER):
Подключение GPIO к 16 линиям прерывания осуществляется следующим образом
The four other EXTI lines are connected as follows:
● EXTI line 16 is connected to the PVD output
● EXTI line 17 is connected to the RTC Alarm event
● EXTI line 18 is connected to the USB Wakeup event
● EXTI line 19 is connected to the Ethernet Wakeup event (available only in connectivity
line devices)
В таблице векторов прерываний следующее распределение векторов:
- EXTI0 – индивидуальный для линии 0
- EXTI1 – индивидуальный для линии 1
- EXTI2 – индивидуальный для линии 2
- EXTI3 – индивидуальный для линии 3
- EXTI4 – индивидуальный для линии 4
- EXTI5-9 – общий для линий с 5 по 9
- EXTI10-15 – общий для линий с 10 по 15
To improve software efficiency, the CMSIS simplifies the NVIC register presentation. In the
CMSIS:
• The Set-enable, Clear-enable, Set-pending, Clear-pending and Active Bit registers
map to arrays of 32-bit integers, so that:
– The array ISER[0] to ISER[2] corresponds to the registers ISER0-ISER2
– The array ICER[0] to ICER[2] corresponds to the registers ICER0-ICER2
– The array ISPR[0] to ISPR[2] corresponds to the registers ISPR0-ISPR2
– The array ICPR[0] to ICPR[2] corresponds to the registers ICPR0-ICPR2
– The array IABR[0] to IABR[2] corresponds to the registers IABR0-IABR2.
• The 8-bit fields of the Interrupt Priority Registers map to an array of 8-bit integers, so
that the array IP[0] to IP[67] corresponds to the registers IPR0-IPR67, and the array
entry IP[n] holds the interrupt priority for interrupt n.
The CMSIS provides thread-safe code that gives atomic access to the Interrupt Priority
Registers. For more information see the description of the NVIC_SetPriority function in
NVIC programming hints in Table 41 shows how the interrupts, or IRQ numbers,
map onto the interrupt registers and corresponding CMSIS variables that have one bit per
interrupt.
- ISER — Interrupt Set Enable Register. Запись бита в нужную позицию включает прерывание.
- ICER — Interrupt Clr Enable Register. Запись сюда наоборот выключает прерывание.
Запись 1 в биты этих регистров запрещает/разрешает прерывания. Запись 0 не делает ничего, а чтение возвращает текущее состояние разрешено/запрещено
- ISPR — Interrupt Set Pending Register. Поставить прерывание в ожидание.
- IСPR — Interrupt Clr Pending Register. Сбросить прерывание с ожидания.
Запись 1 в биты этих регистров ставит/снимает прерывания в очередь на исполнение. Запись 0 не делает ничего, а чтение возвращает текущее состояние прерывания. Ждет он обработки или уже нет. Т.е. если в этом регистре где то стоит бит 1, значит это прерывание еще не вызывалось.
- IABR — Interrupt active bit registers. Регистр показывающий активно ли в данный момент прерывание. Автоматически ставится когда мы попадаем в обработчик и автоматом же снимается когда мы уходим из него. Этот регистр можно только читать.
External Interrupts DCD WWDG_IRQHandler ; Window Watchdog Номер 0 DCD PVD_IRQHandler ; PVD through EXTI Line detect Номер 1 DCD TAMPER_IRQHandler ; Tamper Номер 2 DCD RTC_IRQHandler ; RTC Номер 3
For STM32F2
; External Interrupts DCD WWDG_IRQHandler ; Window Watchdog DCD PVD_IRQHandler ; PVD through EXTI Line detect DCD TAMPER_IRQHandler ; Tamper DCD RTC_IRQHandler ; RTC DCD FLASH_IRQHandler ; Flash DCD RCC_IRQHandler ; RCC DCD EXTI0_IRQHandler ; EXTI Line 0 DCD EXTI1_IRQHandler ; EXTI Line 1 DCD EXTI2_IRQHandler ; EXTI Line 2 DCD EXTI3_IRQHandler ; EXTI Line 3 DCD EXTI4_IRQHandler ; EXTI Line 4 DCD DMAChannel1_IRQHandler ; DMA Channel 1 DCD DMAChannel2_IRQHandler ; DMA Channel 2 DCD DMAChannel3_IRQHandler ; DMA Channel 3 DCD DMAChannel4_IRQHandler ; DMA Channel 4 DCD DMAChannel5_IRQHandler ; DMA Channel 5 DCD DMAChannel6_IRQHandler ; DMA Channel 6 DCD DMAChannel7_IRQHandler ; DMA Channel 7 DCD ADC_IRQHandler ; ADC DCD USB_HP_CAN_TX_IRQHandler ; USB High Priority or CAN TX DCD USB_LP_CAN_RX0_IRQHandler ; USB Low Priority or CAN RX0 DCD CAN_RX1_IRQHandler ; CAN RX1 DCD CAN_SCE_IRQHandler ; CAN SCE DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 DCD TIM1_BRK_IRQHandler ; TIM1 Break DCD TIM1_UP_IRQHandler ; TIM1 Update DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare DCD TIM2_IRQHandler ; TIM2 DCD TIM3_IRQHandler ; TIM3 DCD TIM4_IRQHandler ; TIM4 DCD I2C1_EV_IRQHandler ; I2C1 Event DCD I2C1_ER_IRQHandler ; I2C1 Error DCD I2C2_EV_IRQHandler ; I2C2 Event DCD I2C2_ER_IRQHandler ; I2C2 Error DCD SPI1_IRQHandler ; SPI1 DCD SPI2_IRQHandler ; SPI2 DCD USART1_IRQHandler ; USART1 DCD USART2_IRQHandler ; USART2 DCD USART3_IRQHandler ; USART3 DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
void NVIC_SetPriorityGrouping(uint32_t priority_grouping) // Задать группы/подгруппы приоритетов void NVIC_EnableIRQ(IRQn_t IRQn) // Включить IRQn void NVIC_DisableIRQ(IRQn_t IRQn) // Выключить IRQn uint32_t NVIC_GetPendingIRQ (IRQn_t IRQn) // Вернуть true (точнее IRQ-Number) если IRQn в ожидании void NVIC_SetPendingIRQ (IRQn_t IRQn) // Поставить IRQn в ожидание void NVIC_ClearPendingIRQ (IRQn_tIRQn) // Выкинуть из очереди на ожидание IRQn uint32_t NVIC_GetActive (IRQn_t IRQn) // Функция "Бля, где это я?" Возвращает номер текущего активного прерывания если такое имеется void NVIC_SetPriority (IRQn_t IRQn, uint32_t priority) // Задать приоритет IRQn uint32_t NVIC_GetPriority (IRQn_t IRQn) // Считать приоритет IRQn void NVIC_SystemReset (void) // Reset the system
// Разрешаем прерывания в периферии для выводов 1 и 2. EXTI->IMR |=(EXTI_IMR_MR1 | EXTI_IMR_MR2);
Регистры настроек
EXTI_IMR – разрешение прерываний на конкретной линии
EXTI_EMR – разрешение событий на конкретной линии
EXTI_RTSR – установить бит для вызова прерывания по нарастающему фронту.
EXTI_FTSR– установить бит для вызова прерывания спаду импульса.
EXTI_SWIER - принудительный (программный) вызов прерывания от конкретной линии
EXTI_PR – регистр флагов. Устанавливаются биты при вызове прерывания от конкретного вывода
Для начала работы с модулем EXTI необходимо выполнить минимальный набор настроек,
соблюдая следующую последовательность:
1 Разрешить внешнее прерывание на определенной линии
2 Установить вызов прерывания по нарастающему фронту или по спаду
3 Разрешить прерывания EXTI
Комментариев нет:
Отправить комментарий