Skip to main content
Graduate II
November 28, 2023
Solved

Getting more current from GPIO

  • November 28, 2023
  • 3 replies
  • 5425 views

I'm using an STM32F373's UART to output MIDI data.  Basiclly the TX USART pin needs to light an LED in the MIDI cable's opto-coupler.  I currently have the TX pin connected directly to the MIDI DIN connector pin through a 200ohm resistor.  

I know this is ok to power an LED locally on the PCB, but is this ok if the signal is powering an LED at the end of an external MIDI cable which potentially could be shorted or have power connected into it by mistake?  Should I isolate it the uC's TX pin?  ( was thinking using an 4N35 optoisolator like I did for the MIDI input/USART RX, but wanted to see if there was a more optimal design option.

Thanks,

    This topic has been closed for replies.
    Best answer by AScha.3

    you have to isolate the cpu pin ALWAYS !

    keep to the 35 y old standard:

     

    AScha3_0-1701194934625.png

    https://www.midi.org/specifications-old/item/midi-din-electrical-specification

    https://learn.sparkfun.com/tutorials/midi-tutorial/hardware--electronic-implementation

     

    what i would do:  invert the cpu out signal, put an nice mosfet as output ,  ie IRLML6344 + 220 or 10 ohms (depends: you drive 5V or 3v3 pos.supply );

     

    3 replies

    Technical Moderator
    November 28, 2023

    Hello,

    Note that the maximum output current sunk by any I/O on STM32F373 is 25mA:

    From the datasheet:

    SofLit_0-1701191192938.png

    So if you have a doubt regarding the usage of the pin and there is a risk to short-circuit it or exceed the current mentioned above, I think it's preferable to isolate it with an optocoupler like you proposed or simply an external MOS transistor.

    Super User
    November 28, 2023

    > is this ok if the signal is powering an LED at the end of an external MIDI cable which potentially could be shorted or have power connected into it by mistake?

    The STM32 GPIO pins generally do well if they are overdriven or shorted, provided the voltage is within the range of GND-VDD. The GPIO pins limit their output current in such an instance.

    Not sure there's an optimal solution here. It depends on your goals and what you're trying to protect against in particular. Some other cheap/easy options:

    • Put the current limiting resistor on the STM32 side of the cable. Then any shorting which happens after that will be limited to about 16mA, within the limits of most pins.
    • Separate the LED from the STM32 by driving it with a transistor. Then the STM32 only supplies the base current, which is negligible, and downstream matters less, although you'll need to ensure the transistor doesn't burn up by limiting current.
    LMorr.3Author
    Graduate II
    November 28, 2023

    Ok thanks.  I'll use a MMBT3904 transistor.  

    Now that I use a transistor for TX, the output is inverted.  Is it possible to set USART's TX to invert it's output and not invert RX, or should I use a component to invert TX?  I guess I could use a PNP instead of NPN...

    AScha.3Answer
    Super User
    November 28, 2023

    you have to isolate the cpu pin ALWAYS !

    keep to the 35 y old standard:

     

    AScha3_0-1701194934625.png

    https://www.midi.org/specifications-old/item/midi-din-electrical-specification

    https://learn.sparkfun.com/tutorials/midi-tutorial/hardware--electronic-implementation

     

    what i would do:  invert the cpu out signal, put an nice mosfet as output ,  ie IRLML6344 + 220 or 10 ohms (depends: you drive 5V or 3v3 pos.supply );

     

    LMorr.3Author
    Graduate II
    November 28, 2023

    Ok thanks.  I had read the spec however was concerned about the potential for shorting of cable with only 10ohm and 33ohm resistors in place. ( i'm using 3.3V source ).  Using the mosfet as you suggest would allow me to stick to the spec and also isolate the uC, thanks.

    Super User
    November 28, 2023

    you can use any other mosfet, which can drive some current (1A or so) ;

    maybe even the old 2N7002 is ok.

    and dont forget to invert the uart output, on F373 can use:

    AScha3_1-1701198015352.png

     

    AScha3_0-1701197969492.png