Implemented pin_impl Branch onto master branch. the pin configuration is made in the bsl/csl/nucleo_f042k6/*.cpp
parent
36a2806884
commit
0f4fda1f7a
@ -0,0 +1,181 @@
|
|||||||
|
#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__
|
@ -1,82 +0,0 @@
|
|||||||
#include "pin.hpp"
|
|
||||||
#include "../Drivers/CMSIS/Device/ST/STM32F0xx/Include/stm32f042x6.h"
|
|
||||||
//#include "stm32f042x6.h"
|
|
||||||
|
|
||||||
|
|
||||||
Pin::Pin(){
|
|
||||||
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
|
|
||||||
// Set PIN 3 of port B as Output
|
|
||||||
GPIOB->MODER |= GPIO_MODER_MODER3_0;
|
|
||||||
GPIOB->MODER &=~ GPIO_MODER_MODER3_1;
|
|
||||||
}
|
|
||||||
Pin::~Pin(){}
|
|
||||||
|
|
||||||
|
|
||||||
void Pin::setMode(mode mode)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Pin::setOutputState(state state)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Pin::setPullUpDonw(pullUpDown resistance)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Pin::setSpeed(speed speed)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Pin::config(mode mode, state state, pullUpDown resistance, speed speed)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Pin::read()
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Pin::toggle()
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Pin::write(bool state)
|
|
||||||
{
|
|
||||||
if(state == 1)
|
|
||||||
{
|
|
||||||
GPIOB->BSRR |= GPIO_BSRR_BS_3;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
GPIOB->BSRR |= GPIO_BSRR_BR_3;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Pin::init()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Pin::deInit()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Pin::hardwareInfo()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Pin::throwError(uint16_t line, errors errNo)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
@ -1,22 +1,34 @@
|
|||||||
#include "bsl_nucleo_f042k6.hpp"
|
#include "bsl_nucleo_f042k6.hpp"
|
||||||
#include "../csl/interfaces/pin.hpp"
|
#include "../csl/interfaces/pin.hpp"
|
||||||
#include "../csl/interfaces/delay.hpp"
|
#include "../csl/interfaces/delay.hpp"
|
||||||
|
#include "../csl/stm32f042/Inc/stm_pin.hpp"
|
||||||
|
|
||||||
int startBSL()
|
int startBSL()
|
||||||
{
|
{
|
||||||
stmStart();
|
stmStart();
|
||||||
|
|
||||||
Pin pin;
|
|
||||||
Delay delay;
|
Delay delay;
|
||||||
|
|
||||||
|
STM_Pin<Pin_no::pin_3, Port_B_base_address> pin;
|
||||||
|
STM_Pin<Pin_no::pin_0, Port_A_base_address> pin_a0;
|
||||||
|
|
||||||
|
pin.init();
|
||||||
|
pin.setMode(Pin::mode::output);
|
||||||
|
pin.setSpeed(Pin::speed::veryFast);
|
||||||
|
|
||||||
|
pin_a0.init();
|
||||||
|
pin_a0.setMode(Pin::mode::output);
|
||||||
|
pin_a0.setSpeed(Pin::speed::veryFast);
|
||||||
|
pin_a0.setOutputState(Pin::state::pushPull);
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
delay.ms(50);
|
delay.ms(100);
|
||||||
pin.write(true);
|
pin.write(true);
|
||||||
delay.ms(50);
|
pin_a0.write(true);
|
||||||
|
delay.ms(100);
|
||||||
pin.write(false);
|
pin.write(false);
|
||||||
|
pin_a0.write(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in new issue