Fix STM LED driver and blink LEDs on discovery board
authorKeith Packard <keithp@keithp.com>
Mon, 19 Mar 2012 05:26:43 +0000 (22:26 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 29 Mar 2012 04:37:03 +0000 (21:37 -0700)
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 <keithp@keithp.com>
src/stm-demo/Makefile
src/stm-demo/ao_demo.c
src/stm-demo/ao_pins.h
src/stm/ao_led.c

index a675182e7a5c6a5199181fe4f70522d63977b23b..b2413a2ce5801935e94ba825574134932439ef57 100644 (file)
@@ -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 \
index 5fe0b1547764e43a48d66398a3b6ae1202a37200..94527089b407225a4b3c92993c9c1899e23e777d 100644 (file)
@@ -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;
 }
index f436e9c88b14abf901693c94cfd7409a7205e442..39d4fc3cbf1c83233a6f8c0d0da9fa65a0c4f288 100644 (file)
 
 #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_ */
index db65afdf8b94d5685b6d8599dc73a435458365ae..0574aa2a087ce33bb46831f1bbdfc0aa8d599d3e 100644 (file)
 
 __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);
                }
        }
 }