diff options
author | Perry Hung <iperry@alum.mit.edu> | 2010-04-22 01:18:48 -0400 |
---|---|---|
committer | Perry Hung <iperry@alum.mit.edu> | 2010-04-22 01:18:48 -0400 |
commit | a4e8827b0652be1133d7491fc749fcb55b7c3333 (patch) | |
tree | 4a98222c74fd1c3698a0422e28d2e499dccc14e9 /libmaple/gpio.c | |
parent | e9eda8f74c4775ef160bbe90325b8be7def91b7d (diff) | |
download | librambutan-a4e8827b0652be1133d7491fc749fcb55b7c3333.tar.gz librambutan-a4e8827b0652be1133d7491fc749fcb55b7c3333.zip |
PinMode pullup bug fix, wiring pin mode bug fix
Diffstat (limited to 'libmaple/gpio.c')
-rw-r--r-- | libmaple/gpio.c | 31 |
1 files changed, 20 insertions, 11 deletions
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); } |