mirror of https://github.com/ARMmbed/mbed-os.git
STM32: gpio few performance improvements
Those are minor changes to increase performance of widely used GPIO functions.pull/3665/head
parent
3517eb108e
commit
dce2ca75d8
|
@ -31,6 +31,9 @@
|
||||||
#include "gpio_api.h"
|
#include "gpio_api.h"
|
||||||
#include "pinmap.h"
|
#include "pinmap.h"
|
||||||
#include "mbed_error.h"
|
#include "mbed_error.h"
|
||||||
|
#include "pin_device.h"
|
||||||
|
|
||||||
|
extern const uint32_t ll_pin_defines[16];
|
||||||
|
|
||||||
// Enable GPIO clock and return GPIO base address
|
// Enable GPIO clock and return GPIO base address
|
||||||
GPIO_TypeDef *Set_GPIO_Clock(uint32_t port_idx) {
|
GPIO_TypeDef *Set_GPIO_Clock(uint32_t port_idx) {
|
||||||
|
@ -113,6 +116,7 @@ uint32_t gpio_set(PinName pin) {
|
||||||
return (uint32_t)(1 << ((uint32_t)pin & 0xF)); // Return the pin mask
|
return (uint32_t)(1 << ((uint32_t)pin & 0xF)); // Return the pin mask
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void gpio_init(gpio_t *obj, PinName pin) {
|
void gpio_init(gpio_t *obj, PinName pin) {
|
||||||
obj->pin = pin;
|
obj->pin = pin;
|
||||||
if (pin == (PinName)NC) {
|
if (pin == (PinName)NC) {
|
||||||
|
@ -126,6 +130,8 @@ void gpio_init(gpio_t *obj, PinName pin) {
|
||||||
|
|
||||||
// Fill GPIO object structure for future use
|
// Fill GPIO object structure for future use
|
||||||
obj->mask = gpio_set(pin);
|
obj->mask = gpio_set(pin);
|
||||||
|
obj->gpio = gpio;
|
||||||
|
obj->ll_pin = ll_pin_defines[STM_PIN(obj->pin)];
|
||||||
obj->reg_in = &gpio->IDR;
|
obj->reg_in = &gpio->IDR;
|
||||||
obj->reg_set = &gpio->BSRR;
|
obj->reg_set = &gpio->BSRR;
|
||||||
#ifdef GPIO_IP_WITHOUT_BRR
|
#ifdef GPIO_IP_WITHOUT_BRR
|
||||||
|
@ -139,11 +145,15 @@ void gpio_mode(gpio_t *obj, PinMode mode) {
|
||||||
pin_mode(obj->pin, mode);
|
pin_mode(obj->pin, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gpio_dir(gpio_t *obj, PinDirection direction) {
|
inline void gpio_dir(gpio_t *obj, PinDirection direction) {
|
||||||
MBED_ASSERT(obj->pin != (PinName)NC);
|
|
||||||
if (direction == PIN_OUTPUT) {
|
if (direction == PIN_INPUT)
|
||||||
pin_function(obj->pin, STM_PIN_DATA(STM_MODE_OUTPUT_PP, GPIO_NOPULL, 0));
|
{
|
||||||
} else { // PIN_INPUT
|
LL_GPIO_SetPinMode(obj->gpio, obj->ll_pin, LL_GPIO_MODE_INPUT);
|
||||||
pin_function(obj->pin, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LL_GPIO_SetPinMode(obj->gpio, obj->ll_pin, LL_GPIO_MODE_OUTPUT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,16 +46,17 @@ extern "C" {
|
||||||
* if BRR does not exist, family shall define GPIO_DOES_NOT_HAVE_BRR
|
* if BRR does not exist, family shall define GPIO_DOES_NOT_HAVE_BRR
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PinName pin;
|
|
||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
__IO uint32_t *reg_in;
|
__IO uint32_t *reg_in;
|
||||||
__IO uint32_t *reg_set;
|
__IO uint32_t *reg_set;
|
||||||
__IO uint32_t *reg_clr;
|
__IO uint32_t *reg_clr;
|
||||||
|
PinName pin;
|
||||||
|
GPIO_TypeDef *gpio;
|
||||||
|
uint32_t ll_pin;
|
||||||
} gpio_t;
|
} gpio_t;
|
||||||
|
|
||||||
static inline void gpio_write(gpio_t *obj, int value)
|
static inline void gpio_write(gpio_t *obj, int value)
|
||||||
{
|
{
|
||||||
MBED_ASSERT(obj->pin != (PinName)NC);
|
|
||||||
if (value) {
|
if (value) {
|
||||||
*obj->reg_set = obj->mask;
|
*obj->reg_set = obj->mask;
|
||||||
} else {
|
} else {
|
||||||
|
@ -69,7 +70,6 @@ static inline void gpio_write(gpio_t *obj, int value)
|
||||||
|
|
||||||
static inline int gpio_read(gpio_t *obj)
|
static inline int gpio_read(gpio_t *obj)
|
||||||
{
|
{
|
||||||
MBED_ASSERT(obj->pin != (PinName)NC);
|
|
||||||
return ((*obj->reg_in & obj->mask) ? 1 : 0);
|
return ((*obj->reg_in & obj->mask) ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,6 +78,7 @@ static inline int gpio_is_connected(const gpio_t *obj)
|
||||||
return obj->pin != (PinName)NC;
|
return obj->pin != (PinName)NC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue