pin: use LL for compile time gpio

This commit is contained in:
Daniel Fekete 2017-05-31 19:13:41 +02:00
parent 40a079585f
commit 16c1e52650
3 changed files with 77 additions and 37 deletions

View File

@ -40,10 +40,10 @@ void USBDeviceClass::reenumerate() {
volatile unsigned int i;
#ifdef USB_DISC_PIN
pinModeConst(USB_DISC_PIN, OUTPUT);
digitalWriteConst(USB_DISC_PIN, HIGH);
pinMode(USB_DISC_PIN, OUTPUT);
digitalWrite(USB_DISC_PIN, HIGH);
for(i=0;i<512;i++);
digitalWriteConst(USB_DISC_PIN, LOW);
digitalWrite(USB_DISC_PIN, LOW);
#else
//pinMode(USBDP_PIN, OUTPUT);
//digitalWrite(USBDP_PIN, LOW);
@ -51,11 +51,11 @@ void USBDeviceClass::reenumerate() {
//digitalWrite(USBDP_PIN, HIGH);
pinModeConst(PA12, OUTPUT);
digitalWriteConst(PA12, LOW);
pinMode(PA12, OUTPUT);
digitalWrite(PA12, LOW);
//HAL_Delay(1000);
for(i=0;i<1512;i++){};
pinModeConst(PA12, INPUT);
pinMode(PA12, INPUT);
//digitalWrite(PA12, HIGH);
//HAL_Delay(1000);
for(i=0;i<512;i++){};

View File

@ -29,6 +29,8 @@
#include "variant.h"
#include "stm32_HAL/stm32XXxx_ll_gpio.h"
#define INPUT 0x0
#define OUTPUT 0x1
#define INPUT_PULLUP 0x2
@ -93,53 +95,66 @@ inline int digitalRead(uint8_t pin) {
}
#ifdef __cplusplus
}
#endif
///////////////////////////////
// The following functions are meant to be used with compile time constant parameters
#define PIN(a, b) { GPIO##a , GPIO_PIN_##b }
static const stm32_port_pin_type variant_pin_list_static[] = {
#define PIN(a, b) { GPIO##a , LL_GPIO_PIN_##b }
static const stm32_port_pin_type variant_pin_list_ll_static[] = {
PIN_LIST
};
#undef PIN
inline static void digitalWriteConst(uint8_t pin, uint8_t value) {
HAL_GPIO_WritePin(variant_pin_list_static[pin].port, variant_pin_list_static[pin].pin_mask, value ? GPIO_PIN_SET : GPIO_PIN_RESET);
#ifdef __cplusplus
inline void digitalWrite(__ConstPin pin, uint8_t value) {
if (value) {
LL_GPIO_SetOutputPin(variant_pin_list_ll_static[pin].port, variant_pin_list_ll_static[pin].pin_mask);
} else {
LL_GPIO_ResetOutputPin(variant_pin_list_ll_static[pin].port, variant_pin_list_ll_static[pin].pin_mask);
}
}
inline static int digitalReadConst(uint8_t pin) {
return HAL_GPIO_ReadPin(variant_pin_list_static[pin].port, variant_pin_list_static[pin].pin_mask);
inline int digitalRead(__ConstPin pin) {
return LL_GPIO_IsInputPinSet(variant_pin_list_ll_static[pin].port, variant_pin_list_ll_static[pin].pin_mask);
}
inline static void pinModeConst(uint8_t pin, uint8_t mode) {
stm32_port_pin_type port_pin = variant_pin_list_static[pin];
inline void pinMode(__ConstPin pin, uint8_t mode) {
stm32_port_pin_type port_pin = variant_pin_list_ll_static[pin];
stm32GpioClockEnable(port_pin.port);
GPIO_InitTypeDef init;
init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
init.Pin = port_pin.pin_mask;
int pinMode;
int outputType;
int pull;
switch ( mode ) {
case INPUT:
init.Mode = GPIO_MODE_INPUT;
init.Pull = GPIO_NOPULL;
pinMode = LL_GPIO_MODE_INPUT;
outputType = LL_GPIO_OUTPUT_OPENDRAIN;
pull = LL_GPIO_PULL_DOWN;
break;
case INPUT_PULLUP:
init.Mode = GPIO_MODE_INPUT;
init.Pull = GPIO_PULLUP;
pinMode = LL_GPIO_MODE_INPUT;
outputType = LL_GPIO_OUTPUT_PUSHPULL;
pull = LL_GPIO_PULL_UP;
break;
case INPUT_PULLDOWN:
init.Mode = GPIO_MODE_INPUT;
init.Pull = GPIO_PULLDOWN;
pinMode = LL_GPIO_MODE_INPUT;
outputType = LL_GPIO_OUTPUT_PUSHPULL;
pull = LL_GPIO_PULL_DOWN;
break;
case OUTPUT:
init.Mode = GPIO_MODE_OUTPUT_PP;
init.Pull = GPIO_NOPULL;
pinMode = LL_GPIO_MODE_OUTPUT;
outputType = LL_GPIO_OUTPUT_PUSHPULL;
pull = LL_GPIO_PULL_DOWN;
break;
default:
@ -147,13 +162,14 @@ inline static void pinModeConst(uint8_t pin, uint8_t mode) {
break;
}
HAL_GPIO_Init(port_pin.port, &init);
LL_GPIO_SetPinMode(port_pin.port, port_pin.pin_mask, pinMode);
LL_GPIO_SetPinPull(port_pin.port, port_pin.pin_mask, pull);
LL_GPIO_SetPinOutputType(port_pin.port, port_pin.pin_mask, outputType);
LL_GPIO_SetPinSpeed(port_pin.port, port_pin.pin_mask, LL_GPIO_SPEED_FREQ_HIGH);
}
#ifdef __cplusplus
}
#endif
#endif

View File

@ -3,19 +3,43 @@
#include "variant.h"
#include "stm32_HAL/stm32XXxx_ll_gpio.h"
#ifdef VARIANT_PIN_LIST
#define PIN_LIST VARIANT_PIN_LIST
#else
#define PIN_LIST CHIP_PIN_LIST
#endif
#ifdef __cplusplus
#define PIN(a, b) P ## a ## b
enum {
PIN_LIST
NUM_PINS,
};
#undef PIN
class __ConstPin {
public:
constexpr __ConstPin(const int val): val(val) {};
constexpr operator int() const { return val; }
const int val;
};
#define PIN(a, b) __P##a##b
enum {
PIN_LIST
NUM_PINS,
};
#undef PIN
#define PIN(a, b) P##a##b(__P##a##b)
constexpr __ConstPin PIN_LIST __IGNORE(-1);
#undef PIN
#else
#define PIN(a, b) P ## a ## b
enum {
PIN_LIST
NUM_PINS,
};
#undef PIN
#endif
#endif