| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- #pragma once
- #include "main.h"
- #include "stdbool.h"
- #include <stm32wbxx_ll_gpio.h>
- #include <stm32wbxx_ll_system.h>
- #include <stm32wbxx_ll_exti.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**
- * Number of gpio on one port
- */
- #define GPIO_NUMBER (16U)
- /**
- * Interrupt callback prototype
- */
- typedef void (*GpioExtiCallback)(void* ctx);
- /**
- * Gpio interrupt type
- */
- typedef struct {
- GpioExtiCallback callback;
- void* context;
- volatile bool ready;
- } GpioInterrupt;
- /**
- * Gpio modes
- */
- typedef enum {
- GpioModeInput,
- GpioModeOutputPushPull,
- GpioModeOutputOpenDrain,
- GpioModeAltFunctionPushPull,
- GpioModeAltFunctionOpenDrain,
- GpioModeAnalog,
- GpioModeInterruptRise,
- GpioModeInterruptFall,
- GpioModeInterruptRiseFall,
- GpioModeEventRise,
- GpioModeEventFall,
- GpioModeEventRiseFall,
- } GpioMode;
- /**
- * Gpio pull modes
- */
- typedef enum {
- GpioPullNo,
- GpioPullUp,
- GpioPullDown,
- } GpioPull;
- /**
- * Gpio speed modes
- */
- typedef enum {
- GpioSpeedLow,
- GpioSpeedMedium,
- GpioSpeedHigh,
- GpioSpeedVeryHigh,
- } GpioSpeed;
- /**
- * Gpio alternate functions
- */
- typedef enum {
- GpioAltFn0MCO = 0, /*!< MCO Alternate Function mapping */
- GpioAltFn0LSCO = 0, /*!< LSCO Alternate Function mapping */
- GpioAltFn0JTMS_SWDIO = 0, /*!< JTMS-SWDIO Alternate Function mapping */
- GpioAltFn0JTCK_SWCLK = 0, /*!< JTCK-SWCLK Alternate Function mapping */
- GpioAltFn0JTDI = 0, /*!< JTDI Alternate Function mapping */
- GpioAltFn0RTC_OUT = 0, /*!< RCT_OUT Alternate Function mapping */
- GpioAltFn0JTD_TRACE = 0, /*!< JTDO-TRACESWO Alternate Function mapping */
- GpioAltFn0NJTRST = 0, /*!< NJTRST Alternate Function mapping */
- GpioAltFn0RTC_REFIN = 0, /*!< RTC_REFIN Alternate Function mapping */
- GpioAltFn0TRACED0 = 0, /*!< TRACED0 Alternate Function mapping */
- GpioAltFn0TRACED1 = 0, /*!< TRACED1 Alternate Function mapping */
- GpioAltFn0TRACED2 = 0, /*!< TRACED2 Alternate Function mapping */
- GpioAltFn0TRACED3 = 0, /*!< TRACED3 Alternate Function mapping */
- GpioAltFn0TRIG_INOUT = 0, /*!< TRIG_INOUT Alternate Function mapping */
- GpioAltFn0TRACECK = 0, /*!< TRACECK Alternate Function mapping */
- GpioAltFn0SYS = 0, /*!< System Function mapping */
- GpioAltFn1TIM1 = 1, /*!< TIM1 Alternate Function mapping */
- GpioAltFn1TIM2 = 1, /*!< TIM2 Alternate Function mapping */
- GpioAltFn1LPTIM1 = 1, /*!< LPTIM1 Alternate Function mapping */
- GpioAltFn2TIM2 = 2, /*!< TIM2 Alternate Function mapping */
- GpioAltFn2TIM1 = 2, /*!< TIM1 Alternate Function mapping */
- GpioAltFn3SAI1 = 3, /*!< SAI1_CK1 Alternate Function mapping */
- GpioAltFn3SPI2 = 3, /*!< SPI2 Alternate Function mapping */
- GpioAltFn3TIM1 = 3, /*!< TIM1 Alternate Function mapping */
- GpioAltFn4I2C1 = 4, /*!< I2C1 Alternate Function mapping */
- GpioAltFn4I2C3 = 4, /*!< I2C3 Alternate Function mapping */
- GpioAltFn5SPI1 = 5, /*!< SPI1 Alternate Function mapping */
- GpioAltFn5SPI2 = 5, /*!< SPI2 Alternate Function mapping */
- GpioAltFn6MCO = 6, /*!< MCO Alternate Function mapping */
- GpioAltFn6LSCO = 6, /*!< LSCO Alternate Function mapping */
- GpioAltFn6RF_DTB0 = 6, /*!< RF_DTB0 Alternate Function mapping */
- GpioAltFn6RF_DTB1 = 6, /*!< RF_DTB1 Alternate Function mapping */
- GpioAltFn6RF_DTB2 = 6, /*!< RF_DTB2 Alternate Function mapping */
- GpioAltFn6RF_DTB3 = 6, /*!< RF_DTB3 Alternate Function mapping */
- GpioAltFn6RF_DTB4 = 6, /*!< RF_DTB4 Alternate Function mapping */
- GpioAltFn6RF_DTB5 = 6, /*!< RF_DTB5 Alternate Function mapping */
- GpioAltFn6RF_DTB6 = 6, /*!< RF_DTB6 Alternate Function mapping */
- GpioAltFn6RF_DTB7 = 6, /*!< RF_DTB7 Alternate Function mapping */
- GpioAltFn6RF_DTB8 = 6, /*!< RF_DTB8 Alternate Function mapping */
- GpioAltFn6RF_DTB9 = 6, /*!< RF_DTB9 Alternate Function mapping */
- GpioAltFn6RF_DTB10 = 6, /*!< RF_DTB10 Alternate Function mapping */
- GpioAltFn6RF_DTB11 = 6, /*!< RF_DTB11 Alternate Function mapping */
- GpioAltFn6RF_DTB12 = 6, /*!< RF_DTB12 Alternate Function mapping */
- GpioAltFn6RF_DTB13 = 6, /*!< RF_DTB13 Alternate Function mapping */
- GpioAltFn6RF_DTB14 = 6, /*!< RF_DTB14 Alternate Function mapping */
- GpioAltFn6RF_DTB15 = 6, /*!< RF_DTB15 Alternate Function mapping */
- GpioAltFn6RF_DTB16 = 6, /*!< RF_DTB16 Alternate Function mapping */
- GpioAltFn6RF_DTB17 = 6, /*!< RF_DTB17 Alternate Function mapping */
- GpioAltFn6RF_DTB18 = 6, /*!< RF_DTB18 Alternate Function mapping */
- GpioAltFn6RF_MISO = 6, /*!< RF_MISO Alternate Function mapping */
- GpioAltFn6RF_MOSI = 6, /*!< RF_MOSI Alternate Function mapping */
- GpioAltFn6RF_SCK = 6, /*!< RF_SCK Alternate Function mapping */
- GpioAltFn6RF_NSS = 6, /*!< RF_NSS Alternate Function mapping */
- GpioAltFn7USART1 = 7, /*!< USART1 Alternate Function mapping */
- GpioAltFn8LPUART1 = 8, /*!< LPUART1 Alternate Function mapping */
- GpioAltFn8IR = 8, /*!< IR Alternate Function mapping */
- GpioAltFn9TSC = 9, /*!< TSC Alternate Function mapping */
- GpioAltFn10QUADSPI = 10, /*!< QUADSPI Alternate Function mapping */
- GpioAltFn10USB = 10, /*!< USB Alternate Function mapping */
- GpioAltFn11LCD = 11, /*!< LCD Alternate Function mapping */
- GpioAltFn12COMP1 = 12, /*!< COMP1 Alternate Function mapping */
- GpioAltFn12COMP2 = 12, /*!< COMP2 Alternate Function mapping */
- GpioAltFn12TIM1 = 12, /*!< TIM1 Alternate Function mapping */
- GpioAltFn13SAI1 = 13, /*!< SAI1 Alternate Function mapping */
- GpioAltFn14TIM2 = 14, /*!< TIM2 Alternate Function mapping */
- GpioAltFn14TIM16 = 14, /*!< TIM16 Alternate Function mapping */
- GpioAltFn14TIM17 = 14, /*!< TIM17 Alternate Function mapping */
- GpioAltFn14LPTIM2 = 14, /*!< LPTIM2 Alternate Function mapping */
- GpioAltFn15EVENTOUT = 15, /*!< EVENTOUT Alternate Function mapping */
- GpioAltFnUnused = 16, /*!< just dummy value */
- } GpioAltFn;
- /**
- * Gpio structure
- */
- typedef struct {
- GPIO_TypeDef* port;
- uint16_t pin;
- } GpioPin;
- /**
- * GPIO initialization function, simple version
- * @param gpio GpioPin
- * @param mode GpioMode
- */
- void hal_gpio_init_simple(const GpioPin* gpio, const GpioMode mode);
- /**
- * GPIO initialization function, normal version
- * @param gpio GpioPin
- * @param mode GpioMode
- * @param pull GpioPull
- * @param speed GpioSpeed
- */
- void hal_gpio_init(
- const GpioPin* gpio,
- const GpioMode mode,
- const GpioPull pull,
- const GpioSpeed speed);
- /**
- * GPIO initialization function, extended version
- * @param gpio GpioPin
- * @param mode GpioMode
- * @param pull GpioPull
- * @param speed GpioSpeed
- * @param alt_fn GpioAltFn
- */
- void hal_gpio_init_ex(
- const GpioPin* gpio,
- const GpioMode mode,
- const GpioPull pull,
- const GpioSpeed speed,
- const GpioAltFn alt_fn);
- /**
- * Add and enable interrupt
- * @param gpio GpioPin
- * @param cb GpioExtiCallback
- * @param ctx context for callback
- */
- void hal_gpio_add_int_callback(const GpioPin* gpio, GpioExtiCallback cb, void* ctx);
- /**
- * Enable interrupt
- * @param gpio GpioPin
- */
- void hal_gpio_enable_int_callback(const GpioPin* gpio);
- /**
- * Disable interrupt
- * @param gpio GpioPin
- */
- void hal_gpio_disable_int_callback(const GpioPin* gpio);
- /**
- * Remove interrupt
- * @param gpio GpioPin
- */
- void hal_gpio_remove_int_callback(const GpioPin* gpio);
- /**
- * GPIO write pin
- * @param gpio GpioPin
- * @param state true / false
- */
- static inline void hal_gpio_write(const GpioPin* gpio, const bool state) {
- // writing to BSSR is an atomic operation
- if(state == true) {
- gpio->port->BSRR = gpio->pin;
- } else {
- gpio->port->BSRR = (uint32_t)gpio->pin << GPIO_NUMBER;
- }
- }
- /**
- * GPIO read pin
- * @param gpio GpioPin
- * @return true / false
- */
- static inline bool hal_gpio_read(const GpioPin* gpio) {
- if((gpio->port->IDR & gpio->pin) != 0x00U) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * Get RFID IN level
- * @return false = LOW, true = HIGH
- */
- bool hal_gpio_get_rfid_in_level();
- #ifdef __cplusplus
- }
- #endif
|