STM32 F10xxx Interrupts
Some Interrupts examples bellow.
References: [1] RM0008 Reference manual; [2] CortexTM-M3 Technical Reference Manual
- All ports have external interrupt capability. To use external interrupt lines, the port must be
configured in input mode.[1]
- Default priority table Ref. [1], starting on page 197
External interrupt - PB11 pin from low to high
// CLOCK // enable clock for PB-high pins and AFIO; // this is clear, we need to clock device before we can use it RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // GPIO // set PB11 as input - default state after reset // Input with pull-up / pull-down GPIOB->CRH |= GPIO_CRH_CNF11_1; // External interrupt configuration register // Ref. [1]: page 191 // in this case: PB11 map to EXTI3 // aware: index in EXTICR starting from 0 - for EXTI3 index is 2 AFIO->EXTICR[2] |= AFIO_EXTICR3_EXTI11_PB; // mask interupt from line 11 EXTI->IMR |= EXTI_IMR_MR11; // enable interupt for rising edge (from 0 to 1) on line 11 EXTI->RTSR |= EXTI_RTSR_TR11; // finaly enable interupt; Ref. [2] page 63. // EXTI lines are mapped as: // EXTI1 - EXTI1_IRQn // EXTI2 - EXTI2_IRQn // EXTI3 - EXTI3_IRQn // EXTI4 - EXTI4_IRQn // EXTI5-9 - EXTI9_5_IRQn - shared for EXTI5-EXTI9 // EXTI10-15 - EXTI15_10_IRQn - shared for EXTI10-EXTI15 // // - we can enable all interupts by: NVIC->ISER[0] = NVIC->ISER[1] = 0xFFFFFFFF; // - one interupt with CMSIS: NVIC_EnableIRQ(EXTI15_10_IRQn); // - or use this one, exactly the same as in CMSIS: NVIC->ISER[((uint32_t)(EXTI15_10_IRQn) >> 5)] = (1 << ((uint32_t)(EXTI15_10_IRQn) & 0x1F)); // waiting for interrupt while(1) { }We need to define IRS (interrupt service rutine). In our case, subrutine for EXTI15_10_IRQn is EXTI15_10_IRQHandler.
There is a list of handlers for other interupts in startup_stm32f10x_xl.s
void EXTI15_10_IRQHandler (void) { // As I mentioned before, EXTI15_10 is shared, so we need to test which line was genereated interrupt // and if interupt line is masked (not sure if this is really necessary) if ( (EXTI->PR & EXTI_PR_PR11) && (EXTI->IMR & EXTI_PR_PR11) ) { // clear pending status EXTI->PR |= EXTI_PR_PR11; // do something... // ... } }