From 4be74ef0d13114707fd8217907a5ec457f886160 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 18 Mar 2012 22:26:43 -0700 Subject: [PATCH] Fix STM LED driver and blink LEDs on discovery board This adds a task to blink the LEDs, after first fixing up the LED output code to enable the GPIO and talk to the right pins for the discovery board. Signed-off-by: Keith Packard --- src/stm-demo/Makefile | 1 + src/stm-demo/ao_demo.c | 13 +++++++++---- src/stm-demo/ao_pins.h | 11 +++++++++++ src/stm/ao_led.c | 17 ++++++++--------- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/stm-demo/Makefile b/src/stm-demo/Makefile index a675182e..b2413a2c 100644 --- a/src/stm-demo/Makefile +++ b/src/stm-demo/Makefile @@ -37,6 +37,7 @@ ALTOS_SRC = \ ao_romconfig.c \ ao_cmd.c \ ao_task.c \ + ao_led.c \ ao_stdio.c \ ao_panic.c \ ao_timer.c \ diff --git a/src/stm-demo/ao_demo.c b/src/stm-demo/ao_demo.c index 5fe0b154..94527089 100644 --- a/src/stm-demo/ao_demo.c +++ b/src/stm-demo/ao_demo.c @@ -22,9 +22,13 @@ struct ao_task demo_task; void ao_demo(void) { - int i = 0; for (;;) { - printf ("hello %d\n", i++); + ao_led_on(AO_LED_BLUE); + ao_delay(AO_MS_TO_TICKS(500)); + ao_led_off(AO_LED_BLUE); + ao_led_on(AO_LED_GREEN); + ao_delay(AO_MS_TO_TICKS(500)); + ao_led_off(AO_LED_GREEN); } } @@ -42,9 +46,10 @@ main(void) ao_serial_init(); ao_timer_init(); -// ao_cmd_init(); - + ao_cmd_init(); + ao_led_init(LEDS_AVAILABLE); ao_add_task(&demo_task, ao_demo, "demo"); + ao_start_scheduler(); return 0; } diff --git a/src/stm-demo/ao_pins.h b/src/stm-demo/ao_pins.h index f436e9c8..39d4fc3c 100644 --- a/src/stm-demo/ao_pins.h +++ b/src/stm-demo/ao_pins.h @@ -26,4 +26,15 @@ #define LOW_LEVEL_DEBUG 1 +#define LED_PORT_ENABLE STM_RCC_AHBENR_GPIOBEN +#define LED_PORT stm_gpiob +#define LED_PIN_GREEN 7 +#define LED_PIN_BLUE 6 +#define AO_LED_GREEN (1 << LED_PIN_GREEN) +#define AO_LED_BLUE (1 << LED_PIN_BLUE) + +#define AO_LED_RED AO_LED_BLUE /* a patent lie */ + +#define LEDS_AVAILABLE (AO_LED_BLUE | AO_LED_GREEN) + #endif /* _AO_PINS_H_ */ diff --git a/src/stm/ao_led.c b/src/stm/ao_led.c index db65afdf..0574aa2a 100644 --- a/src/stm/ao_led.c +++ b/src/stm/ao_led.c @@ -19,30 +19,28 @@ __pdata uint8_t ao_led_enable; -#define LED_PORT STM_GPIOD - void ao_led_on(uint8_t colors) { - LED_PORT->odr |= (colors & ao_led_enable); + LED_PORT.odr |= (colors & ao_led_enable); } void ao_led_off(uint8_t colors) { - LED_PORT->odr &= ~(colors & ao_led_enable); + LED_PORT.odr &= ~(colors & ao_led_enable); } void ao_led_set(uint8_t colors) { - LED_PORT->odr = (LED_PORT->odr & ~(ao_led_enable)) | (colors & ao_led_enable); + LED_PORT.odr = (LED_PORT.odr & ~(ao_led_enable)) | (colors & ao_led_enable); } void ao_led_toggle(uint8_t colors) { - LED_PORT->odr ^= (colors & ao_led_enable); + LED_PORT.odr ^= (colors & ao_led_enable); } void @@ -58,12 +56,13 @@ ao_led_init(uint8_t enable) { int bit; + stm_rcc.ahbenr |= (1 << LED_PORT_ENABLE); ao_led_enable = enable; - LED_PORT->odr &= ~enable; + LED_PORT.odr &= ~enable; for (bit = 0; bit < 16; bit++) { if (enable & (1 << bit)) { - stm_moder_set(LED_PORT, bit, STM_MODER_OUTPUT); - stm_otyper_set(LED_PORT, bit, STM_OTYPER_PUSH_PULL); + stm_moder_set(&LED_PORT, bit, STM_MODER_OUTPUT); + stm_otyper_set(&LED_PORT, bit, STM_OTYPER_PUSH_PULL); } } } -- 2.30.2