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_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  default:
36  return;
37  }
38 
39  mPinMask = 1 << pin;
40 
41  setPinFuncMode(mPort, mPin, mode, pupd);
42 }
43 
44 void DrvGpio::setPinFuncMode(DrvTypes::GPIO_MODE mode, DrvTypes::GPIO_PUPD pupd) {
45  setPinFuncMode(mPort, mPin, mode);
46 }
47 
48 void DrvGpio::setPinFuncMode(DrvTypes::PORT port, DrvTypes::PIN pin, DrvTypes::GPIO_MODE mode, DrvTypes::GPIO_PUPD pupd) {
49  GPIO_TypeDef* gpio;
50 
51  switch (port) {
52  case DrvTypes::DRV_PORTA:
53  gpio = GPIOA;
54  break;
55  case DrvTypes::DRV_PORTB:
56  gpio = GPIOB;
57  break;
58  case DrvTypes::DRV_PORTC:
59  gpio = GPIOC;
60  break;
61  case DrvTypes::DRV_PORTD:
62  gpio = GPIOD;
63  break;
64  case DrvTypes::DRV_PORTE:
65  gpio = GPIOE;
66  break;
67  case DrvTypes::DRV_PORTF:
68  gpio = GPIOF;
69  break;
70  case DrvTypes::DRV_PORTG:
71  gpio = GPIOG;
72  break;
73  default:
74  return;
75  }
76 
77  volatile uint32_t* crl;
78  int shift;
79  if (pin < 8) {
80  crl = &gpio->CRL;
81  shift = pin * 4;
82  }
83  else {
84  crl = &gpio->CRH;
85  shift = (pin - 8) * 4;
86  }
87  (*crl) &= ~(0b1111 << shift);
88 
89  switch (mode) {
90  case DrvTypes::DRV_MODE_INPUT:
91  switch (pupd) {
92  case DrvTypes::PUPD_NONE:
93  (*crl) |= (0b0100 << shift);
94  break;
95  case DrvTypes::PUPD_PULL_UP:
96  (*crl) |= (0b1000 << shift);
97  gpio->BSRR = 1 << pin;
98  break;
99  case DrvTypes::PUPD_PULL_DOWN:
100  (*crl) |= (0b1000 << shift);
101  gpio->BRR = 1 << pin;
102  break;
103  }
104  break;
105  case DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL:
106  (*crl) |= (0b0011 << shift);
107  break;
108  case DrvTypes::DRV_MODE_OUTPUT_OPEN_DRAIN:
109  (*crl) |= (0b0111 << shift);
110  break;
111  case DrvTypes::DRV_MODE_ALTERNATE_FUNCTION:
112  (*crl) |= (0b1011 << shift);
113  break;
114  case DrvTypes::DRV_MODE_ANALOG:
115  (*crl) |= (0b0000 << shift);
116  break;
117  default:
118  return;
119  }
120 
121 }
122