This is an example program for the PololuLedStrip library. It generates a simple moving gradient pattern.

Dependencies:   PololuLedStrip mbed LedStripGradient

Dependents:   LedStripGradient led_phare_crf

For more information, see the PololuLedStrip library.

Committer:
DavidEGrayson
Date:
Tue Feb 26 02:18:55 2013 +0000
Revision:
4:27b5c9cafe92
Parent:
3:f566eea13f49
Child:
5:8b685ba2f16b
Got it to use the SET and CLEAR arguments properly.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DavidEGrayson 1:ac1550d65296 1 #include "mbed.h"
DavidEGrayson 1:ac1550d65296 2 #include "gpio_api.h"
DavidEGrayson 1:ac1550d65296 3
DavidEGrayson 1:ac1550d65296 4 namespace Pololu
DavidEGrayson 1:ac1550d65296 5 {
DavidEGrayson 1:ac1550d65296 6 #ifndef _POLOLU_RGB_COLOR
DavidEGrayson 1:ac1550d65296 7 #define _POLOLU_RGB_COLOR
DavidEGrayson 1:ac1550d65296 8 typedef struct rgb_color
DavidEGrayson 1:ac1550d65296 9 {
DavidEGrayson 1:ac1550d65296 10 uint8_t red, green, blue;
DavidEGrayson 1:ac1550d65296 11 } rgb_color;
DavidEGrayson 1:ac1550d65296 12 #endif
DavidEGrayson 1:ac1550d65296 13
DavidEGrayson 3:f566eea13f49 14 extern "C" int led_strip_write(rgb_color *, volatile uint32_t * set, volatile uint32_t * clear, uint32_t mask);
DavidEGrayson 3:f566eea13f49 15
DavidEGrayson 1:ac1550d65296 16 class PololuLedStrip
DavidEGrayson 1:ac1550d65296 17 {
DavidEGrayson 1:ac1550d65296 18 static bool interruptFriendly;
DavidEGrayson 1:ac1550d65296 19 public:
DavidEGrayson 1:ac1550d65296 20 gpio_t gpio;
DavidEGrayson 1:ac1550d65296 21 PololuLedStrip(PinName pin);
DavidEGrayson 3:f566eea13f49 22 void write(rgb_color * colors, unsigned int count);
DavidEGrayson 1:ac1550d65296 23 };
DavidEGrayson 1:ac1550d65296 24
DavidEGrayson 1:ac1550d65296 25 bool PololuLedStrip::interruptFriendly;
DavidEGrayson 1:ac1550d65296 26
DavidEGrayson 1:ac1550d65296 27 PololuLedStrip::PololuLedStrip(PinName pinName)
DavidEGrayson 1:ac1550d65296 28 {
DavidEGrayson 1:ac1550d65296 29 gpio_init(&gpio, pinName, PIN_OUTPUT);
DavidEGrayson 1:ac1550d65296 30 }
DavidEGrayson 1:ac1550d65296 31
DavidEGrayson 1:ac1550d65296 32 void PololuLedStrip::write(rgb_color * colors, unsigned int count)
DavidEGrayson 1:ac1550d65296 33 {
DavidEGrayson 1:ac1550d65296 34 uint32_t pinValue = gpio.pin & 0x1F; // Mimicing mbed/libraries/mbed/vendor/NXP/capi/gpio_api.c
DavidEGrayson 1:ac1550d65296 35
DavidEGrayson 1:ac1550d65296 36 __disable_irq(); // Disable interrupts temporarily because we don't want our pulse timing to be messed up.
DavidEGrayson 1:ac1550d65296 37
DavidEGrayson 1:ac1550d65296 38 while(count--)
DavidEGrayson 1:ac1550d65296 39 {
DavidEGrayson 1:ac1550d65296 40 /**
DavidEGrayson 1:ac1550d65296 41 // Send a color to the LED strip.
DavidEGrayson 1:ac1550d65296 42 // The assembly below also increments the 'colors' pointer,
DavidEGrayson 1:ac1550d65296 43 // it will be pointing to the next color at the end of this loop.
DavidEGrayson 1:ac1550d65296 44 __ASM volatile(
DavidEGrayson 1:ac1550d65296 45 "ldr r12, [%0], #3\n" // Read the next color and advance the pointer.
DavidEGrayson 1:ac1550d65296 46 "rbit r12, r12\n" // Reverse the order of the bits.
DavidEGrayson 1:ac1550d65296 47 "rev r12, r12\n" // Reverse the order of the bytes.
DavidEGrayson 1:ac1550d65296 48 "mov r3, #24\n" // Initialize the loop counter register.
DavidEGrayson 1:ac1550d65296 49
DavidEGrayson 1:ac1550d65296 50 "send_led_strip_bit%=:\n"
DavidEGrayson 1:ac1550d65296 51 "str %[val], %[set]\n" // Drive the line high.
DavidEGrayson 1:ac1550d65296 52 "rrxs r12, r12\n" // Rotate right through carry.
DavidEGrayson 1:ac1550d65296 53 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 54 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 55 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 56 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 57 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 58 "nop\n"
DavidEGrayson 1:ac1550d65296 59 "it cc\n" "strcc %[val], %[clear]\n" // If the bit to send is 0, set the line low now.
DavidEGrayson 1:ac1550d65296 60 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 61 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 62 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 63 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 64 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 65 "it cs\n" "strcs %[val], %[clear]\n" // If the bit to send is 1, set the line low now.
DavidEGrayson 1:ac1550d65296 66 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 67 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 68 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 69 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 1:ac1550d65296 70
DavidEGrayson 1:ac1550d65296 71 "sub r3, r3, #1\n" // Decrement the loop counter.
DavidEGrayson 1:ac1550d65296 72 "cbz r3, led_strip_asm_end%=\n" // If we have sent 24 bits, go to the end.
DavidEGrayson 1:ac1550d65296 73 "b send_led_strip_bit%=\n"
DavidEGrayson 1:ac1550d65296 74
DavidEGrayson 1:ac1550d65296 75 "led_strip_asm_end%=:\n"
DavidEGrayson 1:ac1550d65296 76
DavidEGrayson 1:ac1550d65296 77 : "=r" (colors)
DavidEGrayson 1:ac1550d65296 78 : "0" (colors),
DavidEGrayson 1:ac1550d65296 79 [set] "m" (gpio.reg_set),
DavidEGrayson 1:ac1550d65296 80 [clear] "m" (gpio.reg_clr),
DavidEGrayson 1:ac1550d65296 81 [val] "r" (pinValue)
DavidEGrayson 1:ac1550d65296 82 : "r3", "r12", "cc"
DavidEGrayson 1:ac1550d65296 83 );**/
DavidEGrayson 1:ac1550d65296 84
DavidEGrayson 1:ac1550d65296 85 if (interruptFriendly)
DavidEGrayson 1:ac1550d65296 86 {
DavidEGrayson 1:ac1550d65296 87 __enable_irq();
DavidEGrayson 1:ac1550d65296 88 //asm volatile("nop\n");
DavidEGrayson 1:ac1550d65296 89 __disable_irq();
DavidEGrayson 1:ac1550d65296 90 }
DavidEGrayson 1:ac1550d65296 91 }
DavidEGrayson 1:ac1550d65296 92 __enable_irq(); // Re-enable interrupts now that we are done.
DavidEGrayson 1:ac1550d65296 93 //delayMicroseconds(24); // Hold the line low for 24 microseconds to send the reset signal.
DavidEGrayson 1:ac1550d65296 94 }
DavidEGrayson 1:ac1550d65296 95
DavidEGrayson 1:ac1550d65296 96 }
DavidEGrayson 1:ac1550d65296 97
DavidEGrayson 1:ac1550d65296 98 using namespace Pololu;
DavidEGrayson 1:ac1550d65296 99
DavidEGrayson 1:ac1550d65296 100 DigitalOut myled(LED1);
DavidEGrayson 4:27b5c9cafe92 101 PololuLedStrip ledStrip(LED1);
DavidEGrayson 1:ac1550d65296 102
DavidEGrayson 4:27b5c9cafe92 103 DigitalOut myled2(LED2);
DavidEGrayson 1:ac1550d65296 104
DavidEGrayson 1:ac1550d65296 105 int main() {
DavidEGrayson 1:ac1550d65296 106 gpio_t gpio;
DavidEGrayson 1:ac1550d65296 107 gpio_init(&gpio, LED1, PIN_OUTPUT);
DavidEGrayson 1:ac1550d65296 108
DavidEGrayson 1:ac1550d65296 109 while(1) {
DavidEGrayson 1:ac1550d65296 110 myled2 = 1;
DavidEGrayson 3:f566eea13f49 111 led_strip_write(NULL, gpio.reg_set, gpio.reg_clr, 1);
DavidEGrayson 1:ac1550d65296 112 wait(0.2);
DavidEGrayson 3:f566eea13f49 113 led_strip_write(NULL, gpio.reg_set, gpio.reg_clr, 0);
DavidEGrayson 1:ac1550d65296 114 myled2 = 0;
DavidEGrayson 1:ac1550d65296 115 wait(1);
DavidEGrayson 1:ac1550d65296 116 }
DavidEGrayson 1:ac1550d65296 117 }