You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
KED/bsl/csl/stm32f042/Inc/stm_pin.hpp

182 lines
4.4 KiB

#ifndef __STM_PIN_HPP__
#define __STM_PIN_HPP__
#include "../../interfaces/pin.hpp"
#include "../Drivers/CMSIS/Device/ST/STM32F0xx/Include/stm32f042x6.h"
#include <array>
#include <stdint.h>
// https://accu.org/journals/overload/13/68/goodliffe_281/
enum GPIO_Port {
Port_A_base_address = GPIOA_BASE,
Port_B_base_address = GPIOB_BASE
};
enum Pin_no{
pin_0,
pin_1,
pin_2,
pin_3,
pin_4,
pin_5,
pin_6,
pin_7
};
template <Pin_no pin_no, GPIO_Port port_base_address>
class STM_Pin : Pin
{
public:
STM_Pin() {
static_assert(pin_no < 7, "GPIO has only 8 ports!");
}
void setMode(mode mode) override
{
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER &= ~(0x3UL << (pin_no * 2));
switch (mode)
{
case undefined:
return;
break;
case input:
return;
case output:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER |= 0x1UL << (pin_no * 2);
return;
case analog:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER |= 0x3UL << (pin_no * 2);
return;
case alternate:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER |= 0x2UL << (pin_no * 2);
return;
default:
break;
};
}
void setOutputState(state state) override
{
// TODO: test it!
switch (state)
{
case openDrain:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OTYPER |= (1UL << pin_no);
return;
break;
case pushPull:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OTYPER &= ~(1UL << pin_no);
return;
break;
case floating:
break;
default:
break;
};
}
void setPullUpDonw(pullUpDown resistance) override
{
}
void setSpeed(speed speed) override
{
/*
slow,
normal,
fast,
veryFast
*/
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR0_Msk << (2 * pin_no));
switch(speed) {
case slow:
return;
case normal:
return;
case fast:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR |= (0x01UL << (2 * pin_no));
return;
case veryFast:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR |= (0x3UL << (2 * pin_no));
return;
default:
break;
};
}
void config(mode mode, state state, pullUpDown resistance, speed speed) override
{
}
bool read() override
{
}
bool toggle() override
{
}
void write(bool state) override
{
if(state) {
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->BSRR |= (GPIO_BSRR_BS_0 << pin_no);
return;
}
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->BSRR |= (GPIO_BSRR_BR_0 << pin_no);
}
void init() override
{
// TODO: find better way
switch (port_base_address)
{
case GPIOA_BASE:
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
return;
break;
case GPIOB_BASE:
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
return;
break;
case GPIOC_BASE:
RCC->AHBENR |= RCC_AHBENR_GPIOCEN;
return;
break;
case GPIOF_BASE:
RCC->AHBENR |= RCC_AHBENR_GPIOFEN;
return;
break;
default:
break;
};
}
void deInit() override
{
}
void hardwareInfo() override
{
}
private:
void throwError(uint16_t line, errors errNo) override
{
}
};
#endif //__STM_PIN_HPP__