8 void DrvGpio::init(DrvTypes::PORT port, DrvTypes::PIN pin, DrvTypes::GPIO_FUNCTION func, DrvTypes::GPIO_MODE mode, DrvTypes::GPIO_PUPD pupd) {
14 case DrvTypes::DRV_PORTA:
17 case DrvTypes::DRV_PORTB:
20 case DrvTypes::DRV_PORTC:
23 case DrvTypes::DRV_PORTD:
26 case DrvTypes::DRV_PORTE:
29 case DrvTypes::DRV_PORTF:
38 setPinFuncMode(mPort, mPin, func, mode, pupd);
41 void DrvGpio::setPinFuncMode(DrvTypes::GPIO_FUNCTION func, DrvTypes::GPIO_MODE mode, DrvTypes::GPIO_PUPD pupd) {
42 setPinFuncMode(mPort, mPin, func, mode);
45 void DrvGpio::setPinFuncMode(DrvTypes::PORT port, DrvTypes::PIN pin, DrvTypes::GPIO_FUNCTION func, DrvTypes::GPIO_MODE mode, DrvTypes::GPIO_PUPD pupd) {
49 case DrvTypes::DRV_PORTA:
52 case DrvTypes::DRV_PORTB:
55 case DrvTypes::DRV_PORTC:
58 case DrvTypes::DRV_PORTD:
61 case DrvTypes::DRV_PORTE:
64 case DrvTypes::DRV_PORTF:
71 int pinShift = 2 * pin;
73 gpio->OSPEEDR |= (0b11 << pinShift);
74 gpio->MODER &= ~(0b11 << pinShift);
75 gpio->PUPDR &= ~(0b11 << pinShift);
78 case DrvTypes::DRV_MODE_INPUT:
81 case DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL:
83 gpio->OTYPER &= ~((uint32_t) 1 << pin);
85 case DrvTypes::DRV_MODE_OUTPUT_OPEN_DRAIN:
87 gpio->OTYPER |= ((uint32_t) 1 << pin);
89 case DrvTypes::DRV_MODE_ALTERNATE_FUNCTION:
92 case DrvTypes::DRV_MODE_ANALOG:
100 case DrvTypes::PUPD_NONE:
102 case DrvTypes::PUPD_PULL_UP:
103 gpio->PUPDR |= 0x01 << pinShift;
105 case DrvTypes::PUPD_PULL_DOWN:
106 gpio->PUPDR |= 0x10 << pinShift;
110 gpio->MODER |= pinMode << pinShift;
112 pinShift = (4 * pin) % 32;
113 gpio->AFR[pin >> 3] &= ~(0xF << pinShift);
114 gpio->AFR[pin >> 3] |= func << pinShift;