/** * @brief Gets the priority of an interrupt. * @param IRQn: External interrupt number. * This parameter can be an enumerator of IRQn_Type enumeration * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) * @param PriorityGroup: the priority grouping bits length. * This parameter can be one of the following values: * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority * 4 bits for subpriority * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority * 3 bits for subpriority * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority * 2 bits for subpriority * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority * 1 bits for subpriority * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority * 0 bits for subpriority * @param pPreemptPriority: Pointer on the Preemptive priority value (starting from 0). * @param pSubPriority: Pointer on the Subpriority value (starting from 0). * @retval None */ void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) { /* Check the parameters */ assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); /* Get priority for Cortex-M system or device specific interrupts */ NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); }
/*__STATIC_INLINE*/ void CMSIS_STUB_NVIC_DecodePriority(uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) { NVIC_DecodePriority(Priority, PriorityGroup, pPreemptPriority, pSubPriority); }
void HAL_Interrupts_Attach(uint16_t pin, HAL_InterruptHandler handler, void* data, InterruptMode mode, HAL_InterruptExtraConfiguration* config) { uint8_t GPIO_PortSource = 0; //variable to hold the port number //EXTI structure to init EXT EXTI_InitTypeDef EXTI_InitStructure = {0}; //NVIC structure to set up NVIC controller NVIC_InitTypeDef NVIC_InitStructure = {0}; //Map the Spark pin to the appropriate port and pin on the STM32 STM32_Pin_Info* PIN_MAP = HAL_Pin_Map(); GPIO_TypeDef *gpio_port = PIN_MAP[pin].gpio_peripheral; uint16_t gpio_pin = PIN_MAP[pin].gpio_pin; uint8_t GPIO_PinSource = PIN_MAP[pin].gpio_pin_source; //Clear pending EXTI interrupt flag for the selected pin EXTI_ClearITPendingBit(gpio_pin); //Select the port source if (gpio_port == GPIOA) { GPIO_PortSource = 0; } else if (gpio_port == GPIOB) { GPIO_PortSource = 1; } else if (gpio_port == GPIOC) { GPIO_PortSource = 2; } else if (gpio_port == GPIOD) { GPIO_PortSource = 3; } // Register the handler for the user function name if (config && config->version >= HAL_INTERRUPT_EXTRA_CONFIGURATION_VERSION_2 && config->keepHandler) { // keep the old handler } else { exti_channels[GPIO_PinSource].fn = handler; exti_channels[GPIO_PinSource].data = data; } //Connect EXTI Line to appropriate Pin SYSCFG_EXTILineConfig(GPIO_PortSource, GPIO_PinSource); //Configure GPIO EXTI line EXTI_InitStructure.EXTI_Line = gpio_pin;//EXTI_Line; //select the interrupt mode EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; switch (mode) { //case LOW: //There is no LOW mode in STM32, so using falling edge as default //EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //break; case CHANGE: //generate interrupt on rising or falling edge EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; break; case RISING: //generate interrupt on rising edge EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; break; case FALLING: //generate interrupt on falling edge EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; break; } //enable EXTI line EXTI_InitStructure.EXTI_LineCmd = ENABLE; //send values to registers EXTI_Init(&EXTI_InitStructure); //configure NVIC //select NVIC channel to configure NVIC_InitStructure.NVIC_IRQChannel = GPIO_IRQn[GPIO_PinSource]; if (config == NULL) { NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 14; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; } else { NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = config->IRQChannelPreemptionPriority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = config->IRQChannelSubPriority; // Keep the same priority if (config->version >= HAL_INTERRUPT_EXTRA_CONFIGURATION_VERSION_2) { if (config->keepPriority) { uint32_t priorityGroup = NVIC_GetPriorityGrouping(); uint32_t priority = NVIC_GetPriority(NVIC_InitStructure.NVIC_IRQChannel); uint32_t p, sp; NVIC_DecodePriority(priority, priorityGroup, &p, &sp); NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = p; NVIC_InitStructure.NVIC_IRQChannelSubPriority = sp; } } } //enable IRQ channel NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //update NVIC registers NVIC_Init(&NVIC_InitStructure); }