diff options
Diffstat (limited to 'system-clock/src/gpio.c')
-rw-r--r-- | system-clock/src/gpio.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/system-clock/src/gpio.c b/system-clock/src/gpio.c new file mode 100644 index 0000000..ab3606d --- /dev/null +++ b/system-clock/src/gpio.c @@ -0,0 +1,48 @@ +#include "gpio.h" + +/* + * Sets the mode of a pin on a gpio por. + */ +void set_gpio_pin_mode( + __IO gpio_port_t* gpio_port, + gpio_pin_t pin, + gpio_pin_mode_t mode) +{ + /* Each pin has a 2-bit mode provided at bits pin#*2 and pin#*2+1 */ + gpio_port->mode_r &= ~(0x03 << pin * 2); + gpio_port->mode_r |= mode << pin * 2; +} + + +gpio_output_pin_t set_gpio_pin_output( + __IO gpio_port_t* gpio_port, + gpio_pin_t pin) +{ + set_gpio_pin_mode(gpio_port, pin, MODE_OUTPUT); + + return (gpio_output_pin_t) { + .gpio_port = gpio_port, + .pin = pin + }; +} + +void set_gpio_output_pin( + gpio_output_pin_t pin, + bool onoff) +{ + if (onoff) { + pin.gpio_port->output_r |= 1 << pin.pin; + } else { + pin.gpio_port->output_r &= ~(1 << pin.pin); + } +} + +#define GPIO_PORTS_BASE_ADDR ((uint32_t)0x48000000) +#define RCC_BASE ((uint32_t)0x40021000) +#define RCC_AHB2ENR (*((__IO uint32_t*) (RCC_BASE + 0x4c))) +__IO gpio_port_t* enable_gpio(gpio_port_number_t gpio_port_number) +{ + RCC_AHB2ENR |= 1 << gpio_port_number; /* Enable the port. */ + return + (__IO gpio_port_t*) (GPIO_PORTS_BASE_ADDR + (gpio_port_number * 0x400)); +} |