Ask a Question
Welcome to the MotorForum.RfidEpc.CoM Servo & Stepper Motor Industrial Automation Technology Community Forum


+2 votes
332 views
GD32F427 redirected printf cannot print

IAR has set library-full. USART2 is used

Also add the following code:

int fputc(int ch, FILE *f)

{

     usart_data_transmit(USART2, (uint8_t)ch);

     while(RESET == usart_flag_get(USART2, USART_FLAG_TBE));

     return ch;

}

It is found that when running printf, it will be stuck in the function usart_flag_get and cannot jump out.
by (62.8k points)

2 Answers

+3 votes
 
Best answer

The problem you encountered may be caused by several reasons, mainly about the USART transmission completion, mainly about the incorrect detection method of the USART transmission completion flag (Transmission Buffer Empty, TBE) or the USART configuration is incorrect.

Here are some possible solutions and checkpoints:

1. Check USART configuration

Make sure your USART2 is configured correctly, including baud rate, data bits, stop bits, check bits, etc. , check bits, etc. Incorrect configuration may cause data to be unable to be sent or received correctly. Incorrect configuration may cause data to be unable to be sent or received correctly.

2. Confirm the correctness of USART_FLAG_TBE

In GD32F4 series, confirm that `USART_FLAG_TBE` is correct. Indicates that the transmit buffer is empty. Usually, in STM32, this flag is `USART_FLAG_TXE` (Transmit Data Register Empty), while in GD32, it may be different, but there is usually a similar flag. Please refer to the reference manual of GD32F4 to confirm the correct flag. Please refer to the reference manual of GD32F4 to confirm the correct flag.

3. Modify the wait condition in the `fputc` function

If `USART_FLAG_TBE` is not the correct flag, or even if it is, your implementation causes the program to get stuck in the wait loop, you can try to modify the wait condition.

For example, if `USART_FLAG_TBE` does indicate that the transmit buffer is empty, but your device does not update this flag immediately under certain conditions (such as when an interrupt is processed), then your loop may wait infinitely.

An improved method is to set a timeout condition to avoid infinite waiting:

C language code:

int fputc

An improved method is to set a timeout condition to avoid infinite waiting:

C language code:

int fputc(int ch, FILE *f)

{

usart_data_transmit((int ch, FILE *f)

{

usart_data_transmit(USART2, (uint8_t)ch);

uint32_USART2, (uint8_t)ch);

uint32_t timeout = 10000; // Set a suitable timeout valuet timeout = 10000; // Set a suitable timeout value

while (RESET == usart_flag_get(USART2, USART

while (RESET == usart_flag_get(USART2, USART_FLAG_TBE) && timeout--) {

// You can add a simple delay_FLAG_TBE) && timeout--) {

// You can add a simple delay or no operation

}

if (timeout == 0) {

// Or no operation

}

if (timeout == 0) {

// Timeout processing, such as printing error information

}

return ch;

}

```

# Timeout processing, such as printing error information

}

return ch;

}

```

4. Check USART interrupts

If your USART is configured to use interrupts for data transfer, then 4. Check USART interrupts

If your USART is configured to use interrupts for data transfer, then `usart_flag_get(USART2, USART_FLAG_TBE`usart_flag_get(USART2, USART_FLAG_TBE)` in the interrupt service routine (ISR) may not always return the results you expect)`in the interrupt service routine (ISR) may not always return the results you expect. In this case, make sure that the interrupt processing does not interfere with your `fputc` function. In this case, make sure interrupt handling is not interfering with your `fputc` function.

5. Debug and log

Add more log output to the `fputc` function to see where the program is blocked. This can help you determine if the problem is indeed with the USART's transfer complete flag, or if it is caused by other parts of the code.

6. Consult documentation and examples

Revisit the official documentation and example code for GD32F4 to see if there are any specific instructions or examples on using `printf` to redirect through the USART.

7. Verify Hardware Connections

Finally, make sure the hardware connections for USART2 are correct, including the TX and RX pins and any necessary pull-up/pull-down resistors or termination resistors.

With the above steps, you should be able to diagnose and resolve the problem.

With the above steps, you should be able to diagnose and resolve the problem. If the problem persists, you may need to check your code in more detail or consult GD32's technical support. If the problem persists, you may need to check your code in more detail or consult GD32's technical support.

by (116k points)
selected by
+2 votes
Refer to the relevant documents of IAR, the version is too high! This should be a higher version of IAR to have this problem. You can write a redirection function yourself, so you don’t need to choose library-full
by (34.6k points)

Related questions

...