mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			STM32: Change Set_GPIO_Clock return type
Directly return a GPIO_TypeDef pointer to avoid extra casts. Also move it to GPIO file.pull/3665/head
							parent
							
								
									6bd488db4d
								
							
						
					
					
						commit
						3517eb108e
					
				| 
						 | 
					@ -49,42 +49,7 @@ static const uint32_t gpio_mode[13] = {
 | 
				
			||||||
    0x10000000  // 12 = Reset IT and EVT (not in STM32Cube HAL)
 | 
					    0x10000000  // 12 = Reset IT and EVT (not in STM32Cube HAL)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Enable GPIO clock and return GPIO base address
 | 
					extern GPIO_TypeDef *Set_GPIO_Clock(uint32_t port_idx);
 | 
				
			||||||
uint32_t Set_GPIO_Clock(uint32_t port_idx) {
 | 
					 | 
				
			||||||
    uint32_t gpio_add = 0;
 | 
					 | 
				
			||||||
    switch (port_idx) {
 | 
					 | 
				
			||||||
        case PortA:
 | 
					 | 
				
			||||||
            gpio_add = GPIOA_BASE;
 | 
					 | 
				
			||||||
            __GPIOA_CLK_ENABLE();
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        case PortB:
 | 
					 | 
				
			||||||
            gpio_add = GPIOB_BASE;
 | 
					 | 
				
			||||||
            __GPIOB_CLK_ENABLE();
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
#if defined(GPIOC_BASE)
 | 
					 | 
				
			||||||
        case PortC:
 | 
					 | 
				
			||||||
            gpio_add = GPIOC_BASE;
 | 
					 | 
				
			||||||
            __GPIOC_CLK_ENABLE();
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if defined(GPIOD_BASE)
 | 
					 | 
				
			||||||
        case PortD:
 | 
					 | 
				
			||||||
            gpio_add = GPIOD_BASE;
 | 
					 | 
				
			||||||
            __GPIOD_CLK_ENABLE();
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if defined(GPIOF_BASE)
 | 
					 | 
				
			||||||
        case PortF:
 | 
					 | 
				
			||||||
            gpio_add = GPIOF_BASE;
 | 
					 | 
				
			||||||
            __GPIOF_CLK_ENABLE();
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
            error("Pinmap error: wrong port number.");
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return gpio_add;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Configure pin (mode, speed, output type and pull-up/pull-down)
 | 
					 * Configure pin (mode, speed, output type and pull-up/pull-down)
 | 
				
			||||||
| 
						 | 
					@ -101,8 +66,7 @@ void pin_function(PinName pin, int data) {
 | 
				
			||||||
    uint32_t pin_index  = STM_PIN(pin);
 | 
					    uint32_t pin_index  = STM_PIN(pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Enable GPIO clock
 | 
					    // Enable GPIO clock
 | 
				
			||||||
    uint32_t gpio_add = Set_GPIO_Clock(port_index);
 | 
					    GPIO_TypeDef *gpio = Set_GPIO_Clock(port_index);
 | 
				
			||||||
    GPIO_TypeDef *gpio = (GPIO_TypeDef *)gpio_add;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Configure GPIO
 | 
					    // Configure GPIO
 | 
				
			||||||
    GPIO_InitTypeDef GPIO_InitStructure;
 | 
					    GPIO_InitTypeDef GPIO_InitStructure;
 | 
				
			||||||
| 
						 | 
					@ -130,8 +94,7 @@ void pin_mode(PinName pin, PinMode mode) {
 | 
				
			||||||
    uint32_t pin_index  = STM_PIN(pin);
 | 
					    uint32_t pin_index  = STM_PIN(pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Enable GPIO clock
 | 
					    // Enable GPIO clock
 | 
				
			||||||
    uint32_t gpio_add = Set_GPIO_Clock(port_index);
 | 
					    GPIO_TypeDef *gpio = Set_GPIO_Clock(port_index);
 | 
				
			||||||
    GPIO_TypeDef *gpio = (GPIO_TypeDef *)gpio_add;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Configure pull-up/pull-down resistors
 | 
					    // Configure pull-up/pull-down resistors
 | 
				
			||||||
    uint32_t pupd = (uint32_t)mode;
 | 
					    uint32_t pupd = (uint32_t)mode;
 | 
				
			||||||
| 
						 | 
					@ -148,7 +111,7 @@ void pin_function_gpiomode(PinName pin, uint32_t gpiomode) {
 | 
				
			||||||
    /* Read current pull state from HW to avoid over-write*/
 | 
					    /* Read current pull state from HW to avoid over-write*/
 | 
				
			||||||
    uint32_t port_index = STM_PORT(pin);
 | 
					    uint32_t port_index = STM_PORT(pin);
 | 
				
			||||||
    uint32_t pin_index  = STM_PIN(pin);
 | 
					    uint32_t pin_index  = STM_PIN(pin);
 | 
				
			||||||
    GPIO_TypeDef *gpio = (GPIO_TypeDef *) Set_GPIO_Clock(port_index);
 | 
					    GPIO_TypeDef *gpio = Set_GPIO_Clock(port_index);
 | 
				
			||||||
    uint32_t temp = gpio->PUPDR;
 | 
					    uint32_t temp = gpio->PUPDR;
 | 
				
			||||||
    uint32_t pull = (temp  >> (pin_index * 2U)) & GPIO_PUPDR_PUPDR0;
 | 
					    uint32_t pull = (temp  >> (pin_index * 2U)) & GPIO_PUPDR_PUPDR0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,7 +32,78 @@
 | 
				
			||||||
#include "pinmap.h"
 | 
					#include "pinmap.h"
 | 
				
			||||||
#include "mbed_error.h"
 | 
					#include "mbed_error.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern uint32_t Set_GPIO_Clock(uint32_t port_idx);
 | 
					// Enable GPIO clock and return GPIO base address
 | 
				
			||||||
 | 
					GPIO_TypeDef *Set_GPIO_Clock(uint32_t port_idx) {
 | 
				
			||||||
 | 
					    uint32_t gpio_add = 0;
 | 
				
			||||||
 | 
					    switch (port_idx) {
 | 
				
			||||||
 | 
					        case PortA:
 | 
				
			||||||
 | 
					            gpio_add = GPIOA_BASE;
 | 
				
			||||||
 | 
					            __GPIOA_CLK_ENABLE();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case PortB:
 | 
				
			||||||
 | 
					            gpio_add = GPIOB_BASE;
 | 
				
			||||||
 | 
					            __GPIOB_CLK_ENABLE();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					#if defined(GPIOC_BASE)
 | 
				
			||||||
 | 
					        case PortC:
 | 
				
			||||||
 | 
					            gpio_add = GPIOC_BASE;
 | 
				
			||||||
 | 
					            __GPIOC_CLK_ENABLE();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined GPIOD_BASE
 | 
				
			||||||
 | 
					        case PortD:
 | 
				
			||||||
 | 
					            gpio_add = GPIOD_BASE;
 | 
				
			||||||
 | 
					            __GPIOD_CLK_ENABLE();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined GPIOE_BASE
 | 
				
			||||||
 | 
					        case PortE:
 | 
				
			||||||
 | 
					            gpio_add = GPIOE_BASE;
 | 
				
			||||||
 | 
					            __GPIOE_CLK_ENABLE();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined GPIOF_BASE
 | 
				
			||||||
 | 
					        case PortF:
 | 
				
			||||||
 | 
					            gpio_add = GPIOF_BASE;
 | 
				
			||||||
 | 
					            __GPIOF_CLK_ENABLE();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined GPIOG_BASE
 | 
				
			||||||
 | 
					        case PortG:
 | 
				
			||||||
 | 
					            gpio_add = GPIOG_BASE;
 | 
				
			||||||
 | 
					            __GPIOG_CLK_ENABLE();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined GPIOH_BASE
 | 
				
			||||||
 | 
					        case PortH:
 | 
				
			||||||
 | 
					            gpio_add = GPIOH_BASE;
 | 
				
			||||||
 | 
					            __GPIOH_CLK_ENABLE();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined GPIOI_BASE
 | 
				
			||||||
 | 
					        case PortI:
 | 
				
			||||||
 | 
					            gpio_add = GPIOI_BASE;
 | 
				
			||||||
 | 
					            __GPIOI_CLK_ENABLE();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined GPIOJ_BASE
 | 
				
			||||||
 | 
					        case PortJ:
 | 
				
			||||||
 | 
					            gpio_add = GPIOJ_BASE;
 | 
				
			||||||
 | 
					            __GPIOJ_CLK_ENABLE();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined GPIOK_BASE
 | 
				
			||||||
 | 
					        case PortK:
 | 
				
			||||||
 | 
					            gpio_add = GPIOK_BASE;
 | 
				
			||||||
 | 
					            __GPIOK_CLK_ENABLE();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            error("Pinmap error: wrong port number.");
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return (GPIO_TypeDef *) gpio_add;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t gpio_set(PinName pin) {
 | 
					uint32_t gpio_set(PinName pin) {
 | 
				
			||||||
    MBED_ASSERT(pin != (PinName)NC);
 | 
					    MBED_ASSERT(pin != (PinName)NC);
 | 
				
			||||||
| 
						 | 
					@ -51,8 +122,7 @@ void gpio_init(gpio_t *obj, PinName pin) {
 | 
				
			||||||
    uint32_t port_index = STM_PORT(pin);
 | 
					    uint32_t port_index = STM_PORT(pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Enable GPIO clock
 | 
					    // Enable GPIO clock
 | 
				
			||||||
    uint32_t gpio_add = Set_GPIO_Clock(port_index);
 | 
					    GPIO_TypeDef *gpio = Set_GPIO_Clock(port_index);
 | 
				
			||||||
    GPIO_TypeDef *gpio = (GPIO_TypeDef *)gpio_add;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Fill GPIO object structure for future use
 | 
					    // Fill GPIO object structure for future use
 | 
				
			||||||
    obj->mask    = gpio_set(pin);
 | 
					    obj->mask    = gpio_set(pin);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,7 +43,7 @@
 | 
				
			||||||
typedef struct gpio_channel {
 | 
					typedef struct gpio_channel {
 | 
				
			||||||
    uint32_t pin_mask;                   // bitmask representing which pins are configured for receiving interrupts
 | 
					    uint32_t pin_mask;                   // bitmask representing which pins are configured for receiving interrupts
 | 
				
			||||||
    uint32_t channel_ids[MAX_PIN_LINE];  // mbed "gpio_irq_t gpio_irq" field of instance
 | 
					    uint32_t channel_ids[MAX_PIN_LINE];  // mbed "gpio_irq_t gpio_irq" field of instance
 | 
				
			||||||
    uint32_t channel_gpio[MAX_PIN_LINE]; // base address of gpio port group
 | 
					    GPIO_TypeDef* channel_gpio[MAX_PIN_LINE]; // base address of gpio port group
 | 
				
			||||||
    uint32_t channel_pin[MAX_PIN_LINE];  // pin number in port group
 | 
					    uint32_t channel_pin[MAX_PIN_LINE];  // pin number in port group
 | 
				
			||||||
} gpio_channel_t;
 | 
					} gpio_channel_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -159,7 +159,7 @@ static void gpio_irq6(void)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern uint32_t Set_GPIO_Clock(uint32_t port_idx);
 | 
					extern GPIO_TypeDef *Set_GPIO_Clock(uint32_t port_idx);
 | 
				
			||||||
extern void pin_function_gpiomode(PinName pin, uint32_t gpiomode);
 | 
					extern void pin_function_gpiomode(PinName pin, uint32_t gpiomode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id)
 | 
					int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id)
 | 
				
			||||||
| 
						 | 
					@ -221,7 +221,7 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Enable GPIO clock
 | 
					    // Enable GPIO clock
 | 
				
			||||||
    uint32_t gpio_add = Set_GPIO_Clock(port_index);
 | 
					    GPIO_TypeDef *gpio_add = Set_GPIO_Clock(port_index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Save informations for future use
 | 
					    // Save informations for future use
 | 
				
			||||||
    obj->irq_n = pin_lines_desc[pin_index].irq_n;
 | 
					    obj->irq_n = pin_lines_desc[pin_index].irq_n;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if DEVICE_PORTIN || DEVICE_PORTOUT
 | 
					#if DEVICE_PORTIN || DEVICE_PORTOUT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern uint32_t Set_GPIO_Clock(uint32_t port_idx);
 | 
					extern GPIO_TypeDef *Set_GPIO_Clock(uint32_t port_idx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// high nibble = port number (0=A, 1=B, 2=C, 3=D, 4=E, 5=F, ...)
 | 
					// high nibble = port number (0=A, 1=B, 2=C, 3=D, 4=E, 5=F, ...)
 | 
				
			||||||
// low nibble  = pin number
 | 
					// low nibble  = pin number
 | 
				
			||||||
| 
						 | 
					@ -48,8 +48,7 @@ void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
 | 
				
			||||||
    uint32_t port_index = (uint32_t)port;
 | 
					    uint32_t port_index = (uint32_t)port;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Enable GPIO clock
 | 
					    // Enable GPIO clock
 | 
				
			||||||
    uint32_t gpio_add = Set_GPIO_Clock(port_index);
 | 
					    GPIO_TypeDef *gpio =  Set_GPIO_Clock(port_index);
 | 
				
			||||||
    GPIO_TypeDef *gpio = (GPIO_TypeDef *)gpio_add;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Fill PORT object structure for future use
 | 
					    // Fill PORT object structure for future use
 | 
				
			||||||
    obj->port      = port;
 | 
					    obj->port      = port;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue