Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: high speed light Bracelet
Fork of PololuLedStrip by
PololuLedStrip.cpp
- Committer:
- DavidEGrayson
- Date:
- 2013-03-01
- Revision:
- 16:eaed541b08b0
- Parent:
- 15:d69eebdee025
- Child:
- 17:91fb934a2166
File content as of revision 16:eaed541b08b0:
#include "PololuLedStrip.h"
bool PololuLedStrip::interruptFriendly = false;
// The three timed delays, in units of half-cycles.
uint8_t led_strip_write_delays[3];
void PololuLedStrip::calculateDelays()
{
int f_mhz = SystemCoreClock / 1000000; // Clock frequency in MHz.
if (f_mhz <= 48)
{
// The delays below result in 800/1590 ns pulses and a 2500 ns period on the mbed NXP LPC11U24.
led_strip_write_delays[0] = 0;
led_strip_write_delays[1] = 0;
led_strip_write_delays[2] = 5;
}
else
{
// Try to generally compute what the delays should be for a ide range of clock frequencies.
// The fudge factors below were experimentally chosen so that we would have
// 700/1300 ns pulses and a ~2500 ns period on the mbed NXP LPC1768 (96 MHz Cortex-M3).
// If you ever change these numbers, it is important to check the the subtractions below
// will not overflow in the worst case, which is f_mhz = 49.
led_strip_write_delays[0] = 700*f_mhz/1000 - 23;
led_strip_write_delays[1] = 600*f_mhz/1000 - 18;
led_strip_write_delays[2] = 1200*f_mhz/1000 - 33;
}
// Convert from units of cycles to units of half-cycles; it makes the assembly faster.
for(int i = 0; i < 3; i++)
{
led_strip_write_delays[i] <<= 1;
}
}
PololuLedStrip::PololuLedStrip(PinName pinName)
{
gpio_init(&gpio, pinName, PIN_OUTPUT);
}
void PololuLedStrip::write(rgb_color * colors, unsigned int count)
{
calculateDelays();
__disable_irq(); // Disable interrupts temporarily because we don't want our pulse timing to be messed up.
while(count--)
{
led_strip_write_color(colors, gpio.reg_set, gpio.reg_clr, gpio.mask);
colors++;
if (interruptFriendly)
{
__enable_irq();
__nop();
__nop();
__nop();
__disable_irq();
}
}
__enable_irq(); // Re-enable interrupts now that we are done.
wait_us(24); // Hold the line low for 24 microseconds to send the reset signal.
//*(gpio.reg_set) = gpio.mask;
//*(gpio.reg_clr) = gpio.mask;
}
