diff --git a/bsl/csl/stm32f042/Inc/stm_pin.hpp b/bsl/csl/stm32f042/Inc/stm_pin.hpp index da0e81b..ea19ba3 100644 --- a/bsl/csl/stm32f042/Inc/stm_pin.hpp +++ b/bsl/csl/stm32f042/Inc/stm_pin.hpp @@ -6,13 +6,25 @@ #include #include +#define MODER_IN 0x0UL +#define MODER_OUT 0x1UL +#define MODER_ALTERNATE 0x2UL +#define MODER_ANALOG 0x3UL -// https://accu.org/journals/overload/13/68/goodliffe_281/ +#define OSPEEDR_LOW 0x0UL +#define OSPEEDR_MEDIUM 0x1UL +#define OSPEEDR_HIGH 0x3UL +#define PUPDR_NO_PULL 0x0UL +#define PUPDR_PULL_UP 0x1UL +#define PUPDR_PULL_DOWN 0x2UL +// https://accu.org/journals/overload/13/68/goodliffe_281/ enum GPIO_Port { - Port_A_base_address = GPIOA_BASE, - Port_B_base_address = GPIOB_BASE + Port_A_base_address = GPIOA_BASE, // 0x4800'0000 + Port_B_base_address = GPIOB_BASE, // 0x4800'0400 + Port_C_base_address = GPIOC_BASE, // 0x4800'0800 + Port_F_base_address = GPIOF_BASE // 0x4800'1400 }; enum Pin_no{ @@ -26,7 +38,7 @@ enum Pin_no{ pin_7 }; -template +template class STM_Pin : Pin { public: @@ -37,24 +49,26 @@ class STM_Pin : Pin void setMode(mode mode) override { - reinterpret_cast(port_base_address)->MODER &= ~(0x3UL << (pin_no * 2)); switch (mode) { case undefined: return; + // TODO : Implement some sort of error break; case input: + reinterpret_cast(port_base_address)->MODER &= ~(MODER_IN << (pin_no * 2)); return; case output: - reinterpret_cast(port_base_address)->MODER |= 0x1UL << (pin_no * 2); + reinterpret_cast(port_base_address)->MODER |= (MODER_OUT << (pin_no * 2)); return; case analog: - reinterpret_cast(port_base_address)->MODER |= 0x3UL << (pin_no * 2); + reinterpret_cast(port_base_address)->MODER |= (MODER_ANALOG << (pin_no * 2)); return; case alternate: - reinterpret_cast(port_base_address)->MODER |= 0x2UL << (pin_no * 2); + reinterpret_cast(port_base_address)->MODER |= (MODER_ALTERNATE << (pin_no * 2)); return; default: + reinterpret_cast(port_base_address)->MODER |= (MODER_ANALOG << (pin_no * 2)); break; }; } @@ -81,28 +95,36 @@ class STM_Pin : Pin void setPullUpDonw(pullUpDown resistance) override { - + switch(resistance) { + case none: + reinterpret_cast(port_base_address)->PUPDR &= ~(PUPDR_NO_PULL << (2 * pin_no)); + return; + case pullUp: + reinterpret_cast(port_base_address)->PUPDR |= (PUPDR_PULL_UP << (2 * pin_no)); + return; + case pullDown: + reinterpret_cast(port_base_address)->PUPDR |= (PUPDR_PULL_DOWN << (2 * pin_no)); + return; + default: + break; + }; + } void setSpeed(speed speed) override { - /* - slow, - normal, - fast, - veryFast - */ - reinterpret_cast(port_base_address)->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR0_Msk << (2 * pin_no)); + //reinterpret_cast(port_base_address)->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR0_Msk << (2 * pin_no)); switch(speed) { case slow: + reinterpret_cast(port_base_address)->OSPEEDR &= ~(OSPEEDR_LOW << (2 * pin_no)); return; case normal: + reinterpret_cast(port_base_address)->OSPEEDR |= (OSPEEDR_MEDIUM << (2 * pin_no)); return; case fast: - reinterpret_cast(port_base_address)->OSPEEDR |= (0x01UL << (2 * pin_no)); + reinterpret_cast(port_base_address)->OSPEEDR |= (OSPEEDR_HIGH << (2 * pin_no)); return; case veryFast: - reinterpret_cast(port_base_address)->OSPEEDR |= (0x3UL << (2 * pin_no)); return; default: break; @@ -116,8 +138,8 @@ class STM_Pin : Pin bool read() override { - - } + return (reinterpret_cast(port_base_address)->IDR & (1<> pin_no; + } bool toggle() override { @@ -131,7 +153,7 @@ class STM_Pin : Pin reinterpret_cast(port_base_address)->BSRR |= (GPIO_BSRR_BS_0 << pin_no); return; } - reinterpret_cast(port_base_address)->BSRR |= (GPIO_BSRR_BR_0 << pin_no); + reinterpret_cast(port_base_address)->BSRR |= (GPIO_BSRR_BR_0<< pin_no); } void init() override diff --git a/bsl/nucleo_f042k6/bsl_nucleo_f042k6.cpp b/bsl/nucleo_f042k6/bsl_nucleo_f042k6.cpp index b58d50f..f23299c 100644 --- a/bsl/nucleo_f042k6/bsl_nucleo_f042k6.cpp +++ b/bsl/nucleo_f042k6/bsl_nucleo_f042k6.cpp @@ -1,33 +1,41 @@ #include "bsl_nucleo_f042k6.hpp" -#include "../csl/interfaces/pin.hpp" -#include "../csl/interfaces/delay.hpp" -#include "../csl/stm32f042/Inc/stm_pin.hpp" - int startBSL() { stmStart(); Delay delay; - STM_Pin pin; - STM_Pin pin_a0; + STM_Pin led; + STM_Pin pin_a0; - pin.init(); - pin.setMode(Pin::mode::output); - pin.setSpeed(Pin::speed::veryFast); + led.init(); + led.setMode(Pin::mode::output); + led.setSpeed(Pin::speed::fast); pin_a0.init(); - pin_a0.setMode(Pin::mode::output); - pin_a0.setSpeed(Pin::speed::veryFast); - pin_a0.setOutputState(Pin::state::pushPull); + pin_a0.setMode(Pin::mode::input); + pin_a0.setSpeed(Pin::speed::slow); + pin_a0.setPullUpDonw(Pin::pullUpDown::pullDown); - while(1) + uint8_t i = 0; + + for(i = 0 ; i < 10 ; i++) { delay.ms(100); - pin.write(true); - pin_a0.write(true); + led.write(true); delay.ms(100); - pin.write(false); - pin_a0.write(false); + led.write(false); + } + + while(1) + { + if(pin_a0.read()) + { + led.write(true); + } + else + { + led.write(false); + } } return 1; } diff --git a/bsl/nucleo_f042k6/bsl_nucleo_f042k6.hpp b/bsl/nucleo_f042k6/bsl_nucleo_f042k6.hpp index 8683abd..16b908f 100644 --- a/bsl/nucleo_f042k6/bsl_nucleo_f042k6.hpp +++ b/bsl/nucleo_f042k6/bsl_nucleo_f042k6.hpp @@ -1,8 +1,81 @@ #ifndef BSL_NUCLEO_F042K6_H #define BSL_NUCLEO_F042K6_H - +#include "../csl/interfaces/pin.hpp" +#include "../csl/interfaces/delay.hpp" +#include "../csl/stm32f042/Inc/stm_pin.hpp" #include "stm32f0xx_csl.h" int startBSL(); +#define PORT_A Port_A_base_address +#define PORT_B Port_B_base_address +#define PORT_C Port_C_base_address +#define PORT_F Port_F_base_address + +#define D0_PORT PORT_A +#define D0_PIN 10 + +#define D1_PORT PORT_A +#define D1_PIN 9 + +#define D2_PORT PORT_A +#define D2_PIN 12 + +#define D3_PORT PORT_B +#define D3_PIN 0 + +#define D4_PORT PORT_B +#define D4_PIN 7 + +#define D5_PORT PORT_B +#define D5_PIN 6 + +#define D6_PORT PORT_B +#define D6_PIN 1 + +#define D7_PORT PORT_F +#define D7_PIN 0 + +#define D8_PORT PORT_F +#define D8_PIN 1 + +#define D10_PORT PORT_A +#define D10_PIN 11 + +#define D11_PORT PORT_B +#define D11_PIN 5 + +#define D12_PORT PORT_B +#define D12_PIN 4 + +#define D13_PORT PORT_B +#define D13_PIN 3 + +#define A0_PORT PORT_A +#define A0_PIN 0 + +#define A1_PORT PORT_A +#define A1_PIN 1 + +#define A2_PORT PORT_A +#define A2_PIN 3 + +#define A3_PORT PORT_A +#define A3_PIN 4 + +#define A4_PORT PORT_A +#define A4_PIN 5 + +#define A5_PORT PORT_A +#define A5_PIN 6 + +#define A6_PORT PORT_A +#define A6_PIN 7 + +#define A7_PORT PORT_A +#define A7_PIN 2 + +#define LED_PORT D13_PORT +#define LED_PIN D13_PIN + #endif /* BSL_NUCLEO_F042K6_H */