|
@@ -0,0 +1,125 @@
|
|
|
|
+#ifndef GPIO_H
|
|
|
|
+#define GPIO_H
|
|
|
|
+
|
|
|
|
+#include "stm32f4xx_conf.h"
|
|
|
|
+#include "stm32f4xx.h"
|
|
|
|
+#include <stdlib.h>
|
|
|
|
+#include <stdint.h>
|
|
|
|
+#include <stdbool.h>
|
|
|
|
+#include <string.h>
|
|
|
|
+
|
|
|
|
+#define GLITCH_TIMEOUT 200
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Alternative function numbers definitions
|
|
|
|
+ */
|
|
|
|
+enum af_n {AF0 = 0, AF1, AF2, AF3, AF4, AF5, AF6, AF7,
|
|
|
|
+ AF8, AF9, AF10, AF11, AF12, AF13, AF14, AF15};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#define _GPIO_AF_SHIFT 10
|
|
|
|
+/* Flags for gpio init */
|
|
|
|
+#define GPIO_IN 0x01
|
|
|
|
+#define GPIO_IN_PU 0x02
|
|
|
|
+#define GPIO_OUT 0x04
|
|
|
|
+#define GPIO_SET 0x08
|
|
|
|
+#define GPIO_INV 0x10
|
|
|
|
+#define GPIO_OD 0x20
|
|
|
|
+#define GPIO_BKP 0x40
|
|
|
|
+#define GPIO_NOINIT 0x80
|
|
|
|
+#define GPIO_DIR_CHANGE 0x100
|
|
|
|
+#define GPIO_AF 0x200
|
|
|
|
+#define AF_TIM1 ((AF1 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_TIM2 ((AF1 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_TIM3 ((AF2 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_TIM4 ((AF2 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_TIM5 ((AF2 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_TIM8 ((AF3 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_TIM9 ((AF3 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_TIM10 ((AF3 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_TIM11 ((AF3 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_I2C1 ((AF4 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_I2C2 ((AF4 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_I2C3 ((AF4 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_SPI1 ((AF5 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_SPI2 ((AF5 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_SPI3 ((AF6 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_USART1 ((AF7 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_USART2 ((AF7 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_USART3 ((AF7 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_USART4 ((AF8 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_USART5 ((AF8 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_USART6 ((AF8 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_CAN1 ((AF9 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_CAN2 ((AF9 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_TIM12 ((AF9 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_TIM13 ((AF9 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_TIM14 ((AF9 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_OTG_FS ((AF10 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_OTG_HS ((AF10 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_ETH ((AF11 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_FSMC ((AF12 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_SDIO ((AF12 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_OTG_HS_FS ((AF12 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_DCMI ((AF13 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+#define AF_EVENTOUT ((AF14 << _GPIO_AF_SHIFT) | GPIO_AF)
|
|
|
|
+
|
|
|
|
+typedef struct {
|
|
|
|
+ GPIO_TypeDef *port;
|
|
|
|
+ uint8_t pin;
|
|
|
|
+ uint16_t flags;
|
|
|
|
+} gpio_pindef_t;
|
|
|
|
+
|
|
|
|
+#include "board.h"
|
|
|
|
+
|
|
|
|
+extern gpio_pindef_t gpio_pins[GPIO_TOTAL_COUNT];
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * GPIO register bitmasks
|
|
|
|
+ */
|
|
|
|
+#define GPIO_MODER_MASK 0x03
|
|
|
|
+#define GPIO_TYPER_MASK 0x01
|
|
|
|
+#define GPIO_SPEEDR_MASK 0x03
|
|
|
|
+#define GPIO_PUPDR_MASK 0x03
|
|
|
|
+#define GPIO_AFR_MASK 0x0f
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Port configuration values.
|
|
|
|
+ * A configuration is passing to gpio_hw_config_pin() bitwise in
|
|
|
|
+ * a 16-bit 'conf' parameter where low byte representing a port
|
|
|
|
+ * configuration and high using only for representing a number of an
|
|
|
|
+ * alternative function (if GPIO_MODE_AF is chosen).
|
|
|
|
+ * Shifts is using to encode/decode the config bits to/from 'conf'.
|
|
|
|
+ */
|
|
|
|
+#define GPIO_MODE_CFG_SHIFT 0
|
|
|
|
+#define GPIO_TYPE_CFG_SHIFT 2
|
|
|
|
+#define GPIO_SPEED_CFG_SHIFT 4
|
|
|
|
+#define GPIO_PUPD_CFG_SHIFT 6
|
|
|
|
+
|
|
|
|
+#define GPIO_MODE_IN_CFG (0x00 << GPIO_MODE_CFG_SHIFT)
|
|
|
|
+#define GPIO_MODE_OUT_CFG (0x01 << GPIO_MODE_CFG_SHIFT)
|
|
|
|
+#define GPIO_MODE_AF_CFG (0x02 << GPIO_MODE_CFG_SHIFT)
|
|
|
|
+#define GPIO_MODE_ANALOG_CFG (0x03 << GPIO_MODE_CFG_SHIFT)
|
|
|
|
+#define GPIO_TYPE_PP_CFG (0x00 << GPIO_TYPE_CFG_SHIFT)
|
|
|
|
+#define GPIO_TYPE_OD_CFG (0x01 << GPIO_TYPE_CFG_SHIFT)
|
|
|
|
+#define GPIO_SPEED_LOW_CFG (0x00 << GPIO_SPEED_CFG_SHIFT)
|
|
|
|
+#define GPIO_SPEED_MED_CFG (0x01 << GPIO_SPEED_CFG_SHIFT)
|
|
|
|
+#define GPIO_SPEED_FAST_CFG (0x02 << GPIO_SPEED_CFG_SHIFT)
|
|
|
|
+#define GPIO_SPEED_HIGH_CFG (0x03 << GPIO_SPEED_CFG_SHIFT)
|
|
|
|
+#define GPIO_PU_CFG (0x01 << GPIO_PUPD_CFG_SHIFT)
|
|
|
|
+#define GPIO_PD_CFG (0x02 << GPIO_PUPD_CFG_SHIFT)
|
|
|
|
+
|
|
|
|
+void gpio_init(void);
|
|
|
|
+void gpio_set(gpio_t pin, bool value);
|
|
|
|
+void gpio_invert_output(gpio_t pin);
|
|
|
|
+bool gpio_get(gpio_t pin);
|
|
|
|
+bool gpio_is_output(gpio_t pin);
|
|
|
|
+void gpio_set_direction(gpio_t pin, bool out);
|
|
|
|
+void gpio_hw_config_pin(GPIO_TypeDef *port, uint8_t pin, uint16_t conf);
|
|
|
|
+//void gpio_connect_af(GPIO_TypeDef *port, uint8_t pin, uint8_t af);
|
|
|
|
+void gpio_connect_af(gpio_t id, uint8_t af_n);
|
|
|
|
+void exti_handler(void);
|
|
|
|
+void gpio_test(void);
|
|
|
|
+
|
|
|
|
+#endif /* GPIO_H */
|