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 "pinmap.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
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
void gpio_init(gpio_t *obj, PinName pin) {
|
||||
obj->pin = pin;
|
||||
if (pin == (PinName)NC) {
|
||||
|
@ -126,6 +130,8 @@ void gpio_init(gpio_t *obj, PinName pin) {
|
|||
|
||||
// Fill GPIO object structure for future use
|
||||
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_set = &gpio->BSRR;
|
||||
#ifdef GPIO_IP_WITHOUT_BRR
|
||||
|
@ -139,11 +145,15 @@ void gpio_mode(gpio_t *obj, PinMode mode) {
|
|||
pin_mode(obj->pin, mode);
|
||||
}
|
||||
|
||||
void gpio_dir(gpio_t *obj, PinDirection direction) {
|
||||
MBED_ASSERT(obj->pin != (PinName)NC);
|
||||
if (direction == PIN_OUTPUT) {
|
||||
pin_function(obj->pin, STM_PIN_DATA(STM_MODE_OUTPUT_PP, GPIO_NOPULL, 0));
|
||||
} else { // PIN_INPUT
|
||||
pin_function(obj->pin, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
||||
inline void gpio_dir(gpio_t *obj, PinDirection direction) {
|
||||
|
||||
if (direction == PIN_INPUT)
|
||||
{
|
||||
LL_GPIO_SetPinMode(obj->gpio, obj->ll_pin, LL_GPIO_MODE_INPUT);
|
||||
}
|
||||
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
|
||||
*/
|
||||
typedef struct {
|
||||
PinName pin;
|
||||
uint32_t mask;
|
||||
__IO uint32_t *reg_in;
|
||||
__IO uint32_t *reg_set;
|
||||
__IO uint32_t *reg_clr;
|
||||
PinName pin;
|
||||
GPIO_TypeDef *gpio;
|
||||
uint32_t ll_pin;
|
||||
} gpio_t;
|
||||
|
||||
static inline void gpio_write(gpio_t *obj, int value)
|
||||
{
|
||||
MBED_ASSERT(obj->pin != (PinName)NC);
|
||||
if (value) {
|
||||
*obj->reg_set = obj->mask;
|
||||
} else {
|
||||
|
@ -69,7 +70,6 @@ static inline void gpio_write(gpio_t *obj, int value)
|
|||
|
||||
static inline int gpio_read(gpio_t *obj)
|
||||
{
|
||||
MBED_ASSERT(obj->pin != (PinName)NC);
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue