pins: add inlineable pin changing methods

This commit is contained in:
Daniel Fekete 2017-05-29 20:44:45 +02:00
parent a84b8f4bb9
commit 3c00150306
2 changed files with 65 additions and 6 deletions

View File

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

View File

@ -91,6 +91,65 @@ inline int digitalRead(uint8_t pin) {
}
///////////////////////////////
// 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[] = {
VARIANT_PIN_LIST
};
#undef PIN
inline 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);
}
inline int digitalReadConst(uint8_t pin) {
return HAL_GPIO_ReadPin(variant_pin_list_static[pin].port, variant_pin_list_static[pin].pin_mask);
}
inline void pinModeConst(uint8_t pin, uint8_t mode) {
stm32_port_pin_type port_pin = variant_pin_list_static[pin];
stm32GpioClockEnable(port_pin.port);
GPIO_InitTypeDef init;
init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
init.Pin = port_pin.pin_mask;
switch ( mode ) {
case INPUT:
init.Mode = GPIO_MODE_INPUT;
init.Pull = GPIO_NOPULL;
break;
case INPUT_PULLUP:
init.Mode = GPIO_MODE_INPUT;
init.Pull = GPIO_PULLUP;
break;
case INPUT_PULLDOWN:
init.Mode = GPIO_MODE_INPUT;
init.Pull = GPIO_PULLDOWN;
break;
case OUTPUT:
init.Mode = GPIO_MODE_OUTPUT_PP;
init.Pull = GPIO_NOPULL;
break;
default:
return;
break;
}
HAL_GPIO_Init(port_pin.port, &init);
}
#ifdef __cplusplus
}
#endif