Search code examples
cembeddedstm32cubemx

Changing hardware flow control pins on STM32


I have been reading up on handshaking and hardware flow control for serial communication and I have a question that I can't seem to find an answer to.

If you set up hardware flow control for a serial port on cubeMX it will set the pins up that are required. I know you can use alternative pins as well and this can be done through cubeMX.

My question is, could you set up hardware flow control manually by using different pins or do you strictly have to use the implemented pins?

I am using a STM32F207ZETx and I am using USB as well as serial - however when using the USB peripheral it blocks the hardware flow control pins for USART1 which I need, and I need hardware flow control for my project! The alternate pins for hardware flow control are also already used so I'm in a bit of a pickle.


Solution

  • My question is, could you set up hardware flow control manually by using different pins or do you strictly have to use the implemented pins?

    You can do hardware flow control yourself in software, and in fact it is quite simple to do.

    The USART1_RTS is an output pin. It is set/high when the USART1 is ready to receive data. The USART1_CTS is an input pin. The other end sets it high when it is ready to receive data, and low when it is not.

    Let's say that you send and receive one character at a time, and use two GPIO pins for USART1_RTS and USART1_CTS instead of the hardware support.

    Normally, you keep USART1_RTS high. When receiving data, if you are running out of receive buffer, you set USART1_RTS low. When you make more room in the receive buffer, you set USART1_RTS high. (If you have a buffering scheme that cannot run out of receive buffer, you can tie the RTS line high.)

    Before sending each character, you check if USART1_CTS is high. If it is low, you don't send the data, but wait for USART1_CTS to become high before you do.

    That's it.