From a4e8827b0652be1133d7491fc749fcb55b7c3333 Mon Sep 17 00:00:00 2001 From: Perry Hung Date: Thu, 22 Apr 2010 01:18:48 -0400 Subject: PinMode pullup bug fix, wiring pin mode bug fix --- libmaple/gpio.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'libmaple/gpio.c') diff --git a/libmaple/gpio.c b/libmaple/gpio.c index be9db6e..9759df8 100644 --- a/libmaple/gpio.c +++ b/libmaple/gpio.c @@ -40,19 +40,28 @@ void gpio_init(void) { rcc_enable_clk_afio(); } -void gpio_set_mode(GPIO_Port* port, uint8 gpio_pin, uint8 mode) { - uint32 tmp; - uint32 shift = POS(gpio_pin % 8); - GPIOReg CR; +void gpio_set_mode(GPIO_Port* port, uint8 gpio_pin, GPIOPinMode mode) { + uint32 tmp; + uint32 shift = POS(gpio_pin % 8); + GPIOReg CR; + uint32 pullup = 0; - ASSERT(port); - ASSERT(gpio_pin < 16); + ASSERT(port); + ASSERT(gpio_pin < 16); - CR = (gpio_pin < 8) ? &(port->CRL) : &(port->CRH); + if (mode == GPIO_MODE_INPUT_PU) { + pullup = 1; + mode = CNF_INPUT_PD; + } - tmp = *CR; - tmp &= POS_MASK(shift); - tmp |= mode << shift; + CR = (gpio_pin < 8) ? &(port->CRL) : &(port->CRH); - *CR = tmp; + tmp = *CR; + tmp &= POS_MASK(shift); + tmp |= mode << shift; + + *CR = tmp; + + if (pullup) + port->ODR = BIT(gpio_pin); } -- cgit v1.2.3