#include "device/sx1281_driver/sx1281_header.h" static GpioIrqHandler *GpioIrq[16] = { NULL }; /*! * @brief Records the interrupt handler for the GPIO object * * @param GPIOx: where x can be (A..E and H) * @param GPIO_Pin: specifies the port bit to be written. * This parameter can be one of GPIO_PIN_x where x can be (0..15). * All port bits are not necessarily available on all GPIOs. * @param [IN] prio NVIC priority (0 is highest) * @param [IN] irqHandler points to the function to execute * @retval none */ void GpioSetIrq( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint32_t prio, GpioIrqHandler *irqHandler ) { IRQn_Type IRQnb; uint32_t BitPos = GpioGetBitPos( GPIO_Pin ) ; if ( irqHandler != NULL ) { GpioIrq[BitPos] = irqHandler; IRQnb = MSP_GetIRQn( GPIO_Pin ); HAL_NVIC_SetPriority( IRQnb , prio, 0 ); HAL_NVIC_EnableIRQ( IRQnb ); } } /*! * @brief Execute the interrupt from the object * * @param GPIO_Pin: specifies the port bit to be written. * This parameter can be one of GPIO_PIN_x where x can be (0..15). * All port bits are not necessarily available on all GPIOs. * @retval none */ void GpioLaunchIrqHandler( uint16_t GPIO_Pin ) { uint32_t BitPos = GpioGetBitPos( GPIO_Pin ); if ( GpioIrq[BitPos] != NULL ) { GpioIrq[BitPos]( ); } } /*! * @brief Get the position of the bit set in the GPIO_Pin * @param GPIO_Pin: specifies the port bit to be written. * This parameter can be one of GPIO_PIN_x where x can be (0..15). * All port bits are not necessarily available on all GPIOs. * @retval the position of the bit */ uint8_t GpioGetBitPos( uint16_t GPIO_Pin ) { uint8_t PinPos=0; if ( ( GPIO_Pin & 0xFF00 ) != 0 ) { PinPos |= 0x8; } if ( ( GPIO_Pin & 0xF0F0 ) != 0 ) { PinPos |= 0x4; } if ( ( GPIO_Pin & 0xCCCC ) != 0 ) { PinPos |= 0x2; } if ( ( GPIO_Pin & 0xAAAA ) != 0 ) { PinPos |= 0x1; } return PinPos; } /*! * @brief Writes the given value to the GPIO output * * @param GPIO_Pin: specifies the port bit to be written. * This parameter can be one of GPIO_PIN_x where x can be (0..15). * All port bits are not necessarily available on all GPIOs. * @param [IN] value New GPIO output value * @retval none */ void GpioWrite( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint32_t value ) { HAL_GPIO_WritePin( GPIOx, GPIO_Pin , ( GPIO_PinState ) value ); } /*! * @brief Reads the current GPIO input value * * @param GPIOx: where x can be (A..E and H) * @param GPIO_Pin: specifies the port bit to be written. * This parameter can be one of GPIO_PIN_x where x can be (0..15). * All port bits are not necessarily available on all GPIOs. * @retval value Current GPIO input value */ uint32_t GpioRead( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin ) { return HAL_GPIO_ReadPin( GPIOx, GPIO_Pin ); } /** * @brief 根据 GPIO 引脚号返回对应的 EXTI 中断向量号 * @param gpioPin : GPIO_PIN_x (x=0..15) * @retval IRQn_Type 中断号 */ IRQn_Type MSP_GetIRQn(uint16_t gpioPin) { uint32_t pinPos = GpioGetBitPos(gpioPin); /* 0..15 */ /* STM32L4 / F4 / F1 等通用系列 EXTI 线 0~15 对应中断向量 */ if (pinPos <= 1) return EXTI0_IRQn; if (pinPos <= 3) return EXTI1_IRQn; if (pinPos <= 5) return EXTI2_IRQn; if (pinPos <= 7) return EXTI3_IRQn; if (pinPos <= 9) return EXTI4_IRQn; if (pinPos <= 15) return EXTI9_5_IRQn; /* 5~9 共用 */ /* 10~15 共用 */ return EXTI15_10_IRQn; }