APM:Libraries
gpio_hal.c
Go to the documentation of this file.
1 /*
2 (c) 2017 night_ghost@ykoctpa.ru
3 
4 based on: LeafLabs
5 
6 */
7 
8 #pragma GCC optimize ("O2")
9 
10 #include <gpio_hal.h>
11 
12 
13 /*
14  * GPIO devices
15  */
16 
17 const gpio_dev gpioa = {
18  .GPIOx = GPIOA,
19  .clk = RCC_AHB1Periph_GPIOA,
20  .exti_port = AFIO_EXTI_PA,
21 };
23 const gpio_dev* const _GPIOA = &gpioa;
24 
25 const gpio_dev gpiob = {
26  .GPIOx = GPIOB,
27  .clk = RCC_AHB1Periph_GPIOB,
28  .exti_port = AFIO_EXTI_PB,
29 };
31 const gpio_dev* const _GPIOB = &gpiob;
32 
33 const gpio_dev gpioc = {
34  .GPIOx = GPIOC,
35  .clk = RCC_AHB1Periph_GPIOC,
36  .exti_port = AFIO_EXTI_PC,
37 };
39 const gpio_dev* const _GPIOC = &gpioc;
40 
41 const gpio_dev gpiod = {
42  .GPIOx = GPIOD,
43  .clk = RCC_AHB1Periph_GPIOD,
44  .exti_port = AFIO_EXTI_PD,
45 };
47 const gpio_dev* const _GPIOD = &gpiod;
48 
49 const gpio_dev gpioe = {
50  .GPIOx = GPIOE,
51  .clk = RCC_AHB1Periph_GPIOE,
52  .exti_port = AFIO_EXTI_PE,
53 };
55 const gpio_dev* const _GPIOE = &gpioe;
56 
57 const gpio_dev gpiof = {
58  .GPIOx = GPIOF,
59  .clk = RCC_AHB1Periph_GPIOF,
60  .exti_port = AFIO_EXTI_PF,
61 };
63 const gpio_dev* const _GPIOF = &gpiof;
64 
65 const gpio_dev gpiog = {
66  .GPIOx = GPIOG,
67  .clk = RCC_AHB1Periph_GPIOG,
68  .exti_port = AFIO_EXTI_PG,
69 };
71 const gpio_dev* const _GPIOG = &gpiog;
72 
73 
74 
75 static const gpio_dev* _gpios[] = { &gpioa, &gpiob, &gpioc, &gpiod, &gpioe, &gpiof, &gpiog };
76 
77 
78 #if 0 // unused
79 
80 void gpio_init(const gpio_dev* const dev)
81 {
82  /* Check the parameters */
83  assert_param(IS_GPIO_ALL_PERIPH(dev->GPIOx));
84  GPIO_DeInit(dev->GPIOx);
85  /* Enable the GPIO Clock */
86  RCC_AHB1PeriphClockCmd(dev->clk, ENABLE);
87 }
88 #endif
89 
90 void gpio_init_all(void)
91 {
92  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, ENABLE);
93  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, DISABLE);
94 
95  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, ENABLE);
96  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, DISABLE);
97 
98  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, ENABLE);
99  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, DISABLE);
100 
101  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, ENABLE);
102  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, DISABLE);
103 
104  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOE, ENABLE);
105  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOE, DISABLE);
106 
107  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOF, ENABLE);
108  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOF, DISABLE);
109 
110  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOG, ENABLE);
111  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOG, DISABLE);
112 
113 
114  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
115  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
116  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
117  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
118  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
119  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
120  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
121 }
122 
123 
124 
125 void gpio_set_mode(const gpio_dev* const dev, uint8_t pin, gpio_pin_mode mode)
126 {
127  /* Check the parameters */
128  assert_param(IS_GPIO_ALL_PERIPH(dev->GPIOx));
129  assert_param(IS_GPIO_PIN_SOURCE(pin));
130 
131  GPIO_InitTypeDef config;
132 
133  /* Enable the GPIO Clock */
134  RCC_AHB1PeriphClockCmd(dev->clk, ENABLE);
135 
136  /* Configure the pin */
137  GPIO_StructInit(&config);
138  config.GPIO_Speed = GPIO_Speed_2MHz; // low noise by default
139 
140  switch(mode) {
141  case GPIO_OUTPUT_PP:
142  config.GPIO_Mode = GPIO_Mode_OUT;
143  config.GPIO_PuPd = GPIO_PuPd_NOPULL;
144  config.GPIO_OType = GPIO_OType_PP;
145  break;
146  case GPIO_OUTPUT_OD:
147  config.GPIO_Mode = GPIO_Mode_OUT;
148  config.GPIO_PuPd = GPIO_PuPd_NOPULL;
149  config.GPIO_OType = GPIO_OType_OD;
150  break;
151  case GPIO_OUTPUT_OD_PU:
152  config.GPIO_Mode = GPIO_Mode_OUT;
153  config.GPIO_PuPd = GPIO_PuPd_UP;
154  config.GPIO_OType = GPIO_OType_OD;
155  break;
156  case GPIO_INPUT_FLOATING:
157  config.GPIO_Mode = GPIO_Mode_IN;
158  config.GPIO_PuPd = GPIO_PuPd_NOPULL;
159  config.GPIO_OType = GPIO_OType_PP;
160  break;
161  case GPIO_INPUT_ANALOG:
162  config.GPIO_Mode = GPIO_Mode_AN;
163  config.GPIO_PuPd = GPIO_PuPd_NOPULL;
164  config.GPIO_OType = GPIO_OType_PP;
165  break;
166  case GPIO_INPUT_PU:
167  config.GPIO_Mode = GPIO_Mode_IN;
168  config.GPIO_PuPd = GPIO_PuPd_UP;
169  config.GPIO_OType = GPIO_OType_PP;
170  break;
171  case GPIO_INPUT_PD:
172  config.GPIO_Mode = GPIO_Mode_IN;
173  config.GPIO_PuPd = GPIO_PuPd_DOWN;
174  config.GPIO_OType = GPIO_OType_PP;
175  break;
176  case GPIO_AF_OUTPUT_PP:
177  config.GPIO_Mode = GPIO_Mode_AF;
178  config.GPIO_PuPd = GPIO_PuPd_NOPULL;
179  config.GPIO_OType = GPIO_OType_PP;
180  break;
181  case GPIO_AF_OUTPUT_OD:
182  config.GPIO_Mode = GPIO_Mode_AF;
183  config.GPIO_PuPd = GPIO_PuPd_NOPULL;
184  config.GPIO_OType = GPIO_OType_OD;
185  break;
187  config.GPIO_Mode = GPIO_Mode_AF;
188  config.GPIO_PuPd = GPIO_PuPd_UP;
189  config.GPIO_OType = GPIO_OType_OD;
190  break;
191  default:
192  return;
193  }
194 
195  config.GPIO_Pin = BIT(pin);
196  GPIO_Init(dev->GPIOx, &config);
197 }
198 
199 
void gpio_init_all(void)
Definition: gpio_hal.c:90
const gpio_dev *const _GPIOF
Definition: gpio_hal.c:63
const gpio_dev gpiof
Definition: gpio_hal.c:57
#define assert_param(expr)
GPIO_TypeDef * GPIOx
Definition: gpio_hal.h:54
void gpio_set_mode(const gpio_dev *const dev, uint8_t pin, gpio_pin_mode mode)
Definition: gpio_hal.c:125
const gpio_dev gpioa
Definition: gpio_hal.c:17
const gpio_dev *const _GPIOE
Definition: gpio_hal.c:55
const gpio_dev gpiob
Definition: gpio_hal.c:25
void gpio_init(const gpio_dev *const dev)
const gpio_dev gpioe
Definition: gpio_hal.c:49
static AP_HAL::OwnPtr< AP_HAL::Device > dev
Definition: ICM20789.cpp:16
#define BIT(shift)
Definition: util.h:40
static const gpio_dev * _gpios[]
Definition: gpio_hal.c:75
gpio_pin_mode
GPIO Pin modes.
Definition: gpio_hal.h:23
uint32_t clk
Definition: gpio_hal.h:55
const gpio_dev gpioc
Definition: gpio_hal.c:33
const gpio_dev *const _GPIOA
Definition: gpio_hal.c:23
const gpio_dev gpiod
Definition: gpio_hal.c:41
static int8_t pin
Definition: AnalogIn.cpp:15
const gpio_dev *const _GPIOG
Definition: gpio_hal.c:71
const gpio_dev gpiog
Definition: gpio_hal.c:65
const gpio_dev *const _GPIOC
Definition: gpio_hal.c:39
const gpio_dev *const _GPIOB
Definition: gpio_hal.c:31
const gpio_dev *const _GPIOD
Definition: gpio_hal.c:47