I have changed the structure of stm_pin.hpp but nothing big. Pull Up/donw is working and Read too. TODO: define some more structure

interrupts
key 4 years ago
parent d3210314ae
commit cc2c1d766f

@ -6,13 +6,25 @@
#include <array> #include <array>
#include <stdint.h> #include <stdint.h>
#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 { enum GPIO_Port {
Port_A_base_address = GPIOA_BASE, Port_A_base_address = GPIOA_BASE, // 0x4800'0000
Port_B_base_address = GPIOB_BASE 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{ enum Pin_no{
@ -26,7 +38,7 @@ enum Pin_no{
pin_7 pin_7
}; };
template <Pin_no pin_no, GPIO_Port port_base_address> template <uint8_t pin_no, GPIO_Port port_base_address>
class STM_Pin : Pin class STM_Pin : Pin
{ {
public: public:
@ -37,24 +49,26 @@ class STM_Pin : Pin
void setMode(mode mode) override void setMode(mode mode) override
{ {
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER &= ~(0x3UL << (pin_no * 2));
switch (mode) switch (mode)
{ {
case undefined: case undefined:
return; return;
// TODO : Implement some sort of error
break; break;
case input: case input:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER &= ~(MODER_IN << (pin_no * 2));
return; return;
case output: case output:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER |= 0x1UL << (pin_no * 2); reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER |= (MODER_OUT << (pin_no * 2));
return; return;
case analog: case analog:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER |= 0x3UL << (pin_no * 2); reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER |= (MODER_ANALOG << (pin_no * 2));
return; return;
case alternate: case alternate:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER |= 0x2UL << (pin_no * 2); reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER |= (MODER_ALTERNATE << (pin_no * 2));
return; return;
default: default:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER |= (MODER_ANALOG << (pin_no * 2));
break; break;
}; };
} }
@ -81,28 +95,36 @@ class STM_Pin : Pin
void setPullUpDonw(pullUpDown resistance) override void setPullUpDonw(pullUpDown resistance) override
{ {
switch(resistance) {
case none:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->PUPDR &= ~(PUPDR_NO_PULL << (2 * pin_no));
return;
case pullUp:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->PUPDR |= (PUPDR_PULL_UP << (2 * pin_no));
return;
case pullDown:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->PUPDR |= (PUPDR_PULL_DOWN << (2 * pin_no));
return;
default:
break;
};
} }
void setSpeed(speed speed) override void setSpeed(speed speed) override
{ {
/* //reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR0_Msk << (2 * pin_no));
slow,
normal,
fast,
veryFast
*/
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR0_Msk << (2 * pin_no));
switch(speed) { switch(speed) {
case slow: case slow:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR &= ~(OSPEEDR_LOW << (2 * pin_no));
return; return;
case normal: case normal:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR |= (OSPEEDR_MEDIUM << (2 * pin_no));
return; return;
case fast: case fast:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR |= (0x01UL << (2 * pin_no)); reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR |= (OSPEEDR_HIGH << (2 * pin_no));
return; return;
case veryFast: case veryFast:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR |= (0x3UL << (2 * pin_no));
return; return;
default: default:
break; break;
@ -116,8 +138,8 @@ class STM_Pin : Pin
bool read() override bool read() override
{ {
return (reinterpret_cast<GPIO_TypeDef*>(port_base_address)->IDR & (1<<pin_no)) >> pin_no;
} }
bool toggle() override bool toggle() override
{ {
@ -131,7 +153,7 @@ class STM_Pin : Pin
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->BSRR |= (GPIO_BSRR_BS_0 << pin_no); reinterpret_cast<GPIO_TypeDef*>(port_base_address)->BSRR |= (GPIO_BSRR_BS_0 << pin_no);
return; return;
} }
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->BSRR |= (GPIO_BSRR_BR_0 << pin_no); reinterpret_cast<GPIO_TypeDef*>(port_base_address)->BSRR |= (GPIO_BSRR_BR_0<< pin_no);
} }
void init() override void init() override

@ -1,33 +1,41 @@
#include "bsl_nucleo_f042k6.hpp" #include "bsl_nucleo_f042k6.hpp"
#include "../csl/interfaces/pin.hpp"
#include "../csl/interfaces/delay.hpp"
#include "../csl/stm32f042/Inc/stm_pin.hpp"
int startBSL() int startBSL()
{ {
stmStart(); stmStart();
Delay delay; Delay delay;
STM_Pin<Pin_no::pin_3, Port_B_base_address> pin; STM_Pin<LED_PIN, LED_PORT> led;
STM_Pin<Pin_no::pin_0, Port_A_base_address> pin_a0; STM_Pin<A0_PIN, A0_PORT> pin_a0;
pin.init(); led.init();
pin.setMode(Pin::mode::output); led.setMode(Pin::mode::output);
pin.setSpeed(Pin::speed::veryFast); led.setSpeed(Pin::speed::fast);
pin_a0.init(); pin_a0.init();
pin_a0.setMode(Pin::mode::output); pin_a0.setMode(Pin::mode::input);
pin_a0.setSpeed(Pin::speed::veryFast); pin_a0.setSpeed(Pin::speed::slow);
pin_a0.setOutputState(Pin::state::pushPull); pin_a0.setPullUpDonw(Pin::pullUpDown::pullDown);
while(1) uint8_t i = 0;
for(i = 0 ; i < 10 ; i++)
{ {
delay.ms(100); delay.ms(100);
pin.write(true); led.write(true);
pin_a0.write(true);
delay.ms(100); delay.ms(100);
pin.write(false); led.write(false);
pin_a0.write(false); }
while(1)
{
if(pin_a0.read())
{
led.write(true);
}
else
{
led.write(false);
}
} }
return 1; return 1;
} }

@ -1,8 +1,81 @@
#ifndef BSL_NUCLEO_F042K6_H #ifndef BSL_NUCLEO_F042K6_H
#define 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" #include "stm32f0xx_csl.h"
int startBSL(); 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 */ #endif /* BSL_NUCLEO_F042K6_H */

Loading…
Cancel
Save