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 <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 {
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 <Pin_no pin_no, GPIO_Port port_base_address>
template <uint8_t pin_no, GPIO_Port port_base_address>
class STM_Pin : Pin
{
public:
@ -37,24 +49,26 @@ class STM_Pin : Pin
void setMode(mode mode) override
{
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER &= ~(0x3UL << (pin_no * 2));
switch (mode)
{
case undefined:
return;
// TODO : Implement some sort of error
break;
case input:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->MODER &= ~(MODER_IN << (pin_no * 2));
return;
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;
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;
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;
default:
reinterpret_cast<GPIO_TypeDef*>(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<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
{
/*
slow,
normal,
fast,
veryFast
*/
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR0_Msk << (2 * pin_no));
//reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR0_Msk << (2 * pin_no));
switch(speed) {
case slow:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR &= ~(OSPEEDR_LOW << (2 * pin_no));
return;
case normal:
reinterpret_cast<GPIO_TypeDef*>(port_base_address)->OSPEEDR |= (OSPEEDR_MEDIUM << (2 * pin_no));
return;
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;
case veryFast:
reinterpret_cast<GPIO_TypeDef*>(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<GPIO_TypeDef*>(port_base_address)->IDR & (1<<pin_no)) >> pin_no;
}
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);
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

@ -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_no::pin_3, Port_B_base_address> pin;
STM_Pin<Pin_no::pin_0, Port_A_base_address> pin_a0;
STM_Pin<LED_PIN, LED_PORT> led;
STM_Pin<A0_PIN, A0_PORT> 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;
}

@ -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 */

Loading…
Cancel
Save