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...