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  default:
33  return;
34  }
35 
36  mPinMask = 1 << pin;
37 
38  setPinFuncMode(mPort, mPin, func, mode, pupd);
39 }
40 
41 void DrvGpio::setPinFuncMode(DrvTypes::GPIO_FUNCTION func, DrvTypes::GPIO_MODE mode, DrvTypes::GPIO_PUPD pupd) {
42  setPinFuncMode(mPort, mPin, func, mode);
43 }
44 
45 void DrvGpio::setPinFuncMode(DrvTypes::PORT port, DrvTypes::PIN pin, DrvTypes::GPIO_FUNCTION func, DrvTypes::GPIO_MODE mode, DrvTypes::GPIO_PUPD pupd) {
46  GPIO_TypeDef* gpio;
47 
48  switch (port) {
49  case DrvTypes::DRV_PORTA:
50  gpio = GPIOA;
51  break;
52  case DrvTypes::DRV_PORTB:
53  gpio = GPIOB;
54  break;
55  case DrvTypes::DRV_PORTC:
56  gpio = GPIOC;
57  break;
58  case DrvTypes::DRV_PORTD:
59  gpio = GPIOD;
60  break;
61  case DrvTypes::DRV_PORTE:
62  gpio = GPIOE;
63  break;
64  case DrvTypes::DRV_PORTF:
65  gpio = GPIOF;
66  break;
67  default:
68  return;
69  }
70 
71  int pinShift = 2 * pin;
72  int pinMode;
73  gpio->OSPEEDR |= (0b11 << pinShift);
74  gpio->MODER &= ~(0b11 << pinShift);
75  gpio->PUPDR &= ~(0b11 << pinShift);
76 
77  switch (mode) {
78  case DrvTypes::DRV_MODE_INPUT:
79  pinMode = 0;
80  break;
81  case DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL:
82  pinMode = 1;
83  gpio->OTYPER &= ~((uint32_t) 1 << pin);
84  break;
85  case DrvTypes::DRV_MODE_OUTPUT_OPEN_DRAIN:
86  pinMode = 1;
87  gpio->OTYPER |= ((uint32_t) 1 << pin);
88  break;
89  case DrvTypes::DRV_MODE_ALTERNATE_FUNCTION:
90  pinMode = 2;
91  break;
92  case DrvTypes::DRV_MODE_ANALOG:
93  pinMode = 3;
94  break;
95  default:
96  return;
97  }
98 
99  switch (pupd) {
100  case DrvTypes::PUPD_NONE:
101  break;
102  case DrvTypes::PUPD_PULL_UP:
103  gpio->PUPDR |= 0x01 << pinShift;
104  break;
105  case DrvTypes::PUPD_PULL_DOWN:
106  gpio->PUPDR |= 0x10 << pinShift;
107  break;
108  }
109 
110  gpio->MODER |= pinMode << pinShift;
111 
112  pinShift = (4 * pin) % 32;
113  gpio->AFR[pin >> 3] &= ~(0xF << pinShift);
114  gpio->AFR[pin >> 3] |= func << pinShift;
115 
116 }
117