embkernel
 All Classes Functions Variables Typedefs Groups Pages
DrvGpio.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #include "DrvGpio.hpp"
7 
8 void DrvGpio::init(DrvTypes::PORT port, DrvTypes::PIN pin, DrvTypes::GPIO_FUNCTION func, DrvTypes::GPIO_MODE mode, DrvTypes::GPIO_PUPD pupd) {
9 
10  mPort = port;
11  mPin = pin;
12 
13  switch (port) {
14  case DrvTypes::DRV_PORTA:
15  mGpio = GPIOA;
16  break;
17  case DrvTypes::DRV_PORTB:
18  mGpio = GPIOB;
19  break;
20  case DrvTypes::DRV_PORTC:
21  mGpio = GPIOC;
22  break;
23  case DrvTypes::DRV_PORTD:
24  mGpio = GPIOD;
25  break;
26  case DrvTypes::DRV_PORTE:
27  mGpio = GPIOE;
28  break;
29  case DrvTypes::DRV_PORTF:
30  mGpio = GPIOF;
31  break;
32  case DrvTypes::DRV_PORTG:
33  mGpio = GPIOG;
34  break;
35  case DrvTypes::DRV_PORTH:
36  mGpio = GPIOH;
37  break;
38  case DrvTypes::DRV_PORTI:
39  mGpio = GPIOI;
40  break;
41  default:
42  return;
43  }
44 
45  mPinMask = 1 << pin;
46 
47  setPinFuncMode(mPort, mPin, func, mode, pupd);
48 }
49 
50 void DrvGpio::setPinFuncMode(DrvTypes::GPIO_FUNCTION func, DrvTypes::GPIO_MODE mode, DrvTypes::GPIO_PUPD pupd) {
51  setPinFuncMode(mPort, mPin, func, mode);
52 }
53 
54 void DrvGpio::setPinFuncMode(DrvTypes::PORT port, DrvTypes::PIN pin, DrvTypes::GPIO_FUNCTION func, DrvTypes::GPIO_MODE mode, DrvTypes::GPIO_PUPD pupd) {
55  GPIO_TypeDef* gpio;
56 
57  switch (port) {
58  case DrvTypes::DRV_PORTA:
59  gpio = GPIOA;
60  break;
61  case DrvTypes::DRV_PORTB:
62  gpio = GPIOB;
63  break;
64  case DrvTypes::DRV_PORTC:
65  gpio = GPIOC;
66  break;
67  case DrvTypes::DRV_PORTD:
68  gpio = GPIOD;
69  break;
70  case DrvTypes::DRV_PORTE:
71  gpio = GPIOE;
72  break;
73  case DrvTypes::DRV_PORTF:
74  gpio = GPIOF;
75  break;
76  case DrvTypes::DRV_PORTG:
77  gpio = GPIOG;
78  break;
79  case DrvTypes::DRV_PORTH:
80  gpio = GPIOH;
81  break;
82  case DrvTypes::DRV_PORTI:
83  gpio = GPIOI;
84  break;
85  default:
86  return;
87  }
88 
89  int pinShift = 2 * pin;
90  int pinMode;
91  gpio->OSPEEDR |= (0b11 << pinShift);
92  gpio->MODER &= ~(0b11 << pinShift);
93  gpio->PUPDR &= ~(0b11 << pinShift);
94 
95  switch (mode) {
96  case DrvTypes::DRV_MODE_INPUT:
97  pinMode = 0;
98  break;
99  case DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL:
100  pinMode = 1;
101  break;
102  case DrvTypes::DRV_MODE_OUTPUT_OPEN_DRAIN:
103  pinMode = 1;
104  break;
105  case DrvTypes::DRV_MODE_ALTERNATE_FUNCTION:
106  pinMode = 2;
107  break;
108  case DrvTypes::DRV_MODE_ANALOG:
109  pinMode = 3;
110  break;
111  default:
112  return;
113  }
114 
115  switch (pupd) {
116  case DrvTypes::PUPD_NONE:
117  break;
118  case DrvTypes::PUPD_PULL_UP:
119  gpio->PUPDR |= 0x01 << pinShift;
120  break;
121  case DrvTypes::PUPD_PULL_DOWN:
122  gpio->PUPDR |= 0x10 << pinShift;
123  break;
124  }
125 
126  gpio->MODER |= pinMode << pinShift;
127 
128  pinShift = (4 * pin) % 32;
129  gpio->AFR[pin >> 3] &= ~(0xF << pinShift);
130  gpio->AFR[pin >> 3] |= func << pinShift;
131 
132 }
133