Problem
Using Mbed OS (v5.8.4), GPIOs can only toggle about every 5 µs max. Why? They can toggle on the order of tens of ns using the bare metal LPCOpen platform.
How can I reliably create one-shot pulses measured in single digit microseconds on Mbed OS?
Details
I'm trying to interface a DS18B20 1-wire temperature sensor to my Embedded Artists LPC4088QSB board. I see that there are several drivers out there, but they're not working in my scenario.
I have my board underclocked - down from the max 120 MHz core / 60 MHz peripheral clocks to 24 MHz for both. The fastest I can toggle a GPIO output pin gives me about a 20 µs pulse or more, but I need to be able to do < 15 µs reliably. (Running the board at full speed lets me get down in the 5 µs range. I was able to read the temperature from the device a couple times, but the pulsewidths aren't uniform, which makes me unsure if it's possible to do reliably this way, even at the max clock speed.)
int main()
{
DigitalOut testPin(P0_26);
{
CriticalSectionLock lock;
for (int i = 0; i < 10; i++)
{
//testPin.write(0);
//testPin.write(1);
LPC_GPIO0->SET = (1 << 26);
LPC_GPIO0->CLR = (1 << 26);
}
}
// ...
}
Probing the output pin with an oscilloscope shows the same pulsewidths regardless of whether I use the DigitalOut interface, or if I access the registers directly.
EDIT: Update
I got it toggling quickly by modifying mbed-os-example-blinky, so I guess I'm doing something else in my program to cause it. Investigation continues...
Problem
Using Mbed OS (v5.8.4), GPIOs can only toggle about every 5 µs max. Why? They can toggle on the order of tens of ns using the bare metal LPCOpen platform.
How can I reliably create one-shot pulses measured in single digit microseconds on Mbed OS?
Details
I'm trying to interface a DS18B20 1-wire temperature sensor to my Embedded Artists LPC4088QSB board. I see that there are several drivers out there, but they're not working in my scenario.
I have my board underclocked - down from the max 120 MHz core / 60 MHz peripheral clocks to 24 MHz for both. The fastest I can toggle a GPIO output pin gives me about a 20 µs pulse or more, but I need to be able to do < 15 µs reliably. (Running the board at full speed lets me get down in the 5 µs range. I was able to read the temperature from the device a couple times, but the pulsewidths aren't uniform, which makes me unsure if it's possible to do reliably this way, even at the max clock speed.)
int main() { DigitalOut testPin(P0_26); { CriticalSectionLock lock; for (int i = 0; i < 10; i++) { //testPin.write(0); //testPin.write(1); LPC_GPIO0->SET = (1 << 26); LPC_GPIO0->CLR = (1 << 26); } } // ... }Probing the output pin with an oscilloscope shows the same pulsewidths regardless of whether I use the DigitalOut interface, or if I access the registers directly.
EDIT: Update
I got it toggling quickly by modifying mbed-os-example-blinky, so I guess I'm doing something else in my program to cause it. Investigation continues...