Loading...
 

Zephyr project on STM32

   Zephyr Workbench, a VSCode extension to manage Zephyr on STM32.
It enables users to easily create, develop, and debug Zephyr applications.
Main features:
  • Install host dependencies.
  • Import toolchain and SDK.
  • Create, configure, build and manage apps.
  • Debug STM32.
You can directly download it from the VSCode marketplace
For more details, visit the Zephyr Workbench

System Workbench for STM32


STM32F767ZI nucleo board printf to console

Hello. I have got my nucleo stm32 board and created a brand new project. I have used a default configuration so all the peripherals are already configured for me.

All I want to do is to print some debug messages as following:


while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
HAL_Delay(1000);
printf(“UART Printf Example: retarget the C library printf function to the UART \n\r”);
printf(“** Test finished successfully. ** \n\r”);
}
/* USER CODE END 3 */
}




After looking up at the internet I have found many solutions for this problem. I have tried to add some additional code to my main.c as suggested:

  1. ifdef GNUC

/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to ‘Yes’) calls __io_putchar() */

  1. define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  2. else
  3. define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  4. endif /* GNUC */



and then furhter down the main.c I have declared the prototype;

PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF);

return ch;
}



In my syscalls I have put a breakpoint in _write function and I can see that it is being called, but no messsage appears on the console. Can someone help me understand how printf works and how to get it to print to console?

> have put a breakpoint in _write function and I can see that it is being called

So, just implement int _write(int file, char *data, int len) function?


Thanks for response. The _write function is already implemented in syscalls.c, unless i need to make a custom one which I could not find any information how to do? Perhaps you could clarify?

_read() and _write() in autogenerated syscalls.c is are weak functions.

Virtually any possible own implementation will do the thing. E.g. https://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32Question

BTW, the file syscalls.c mostly contains “always failing” mock syscall implementations and may be safely deleted: anyway, you will need to implement own working variant of every one used )

printf() uses _write(), no more.



parts of vanilla “blinky” example modified to printf() blinks:

main.c


...
/* Private includes ----------------------*/
/* USER CODE BEGIN Includes */

  1. include ‹stdio.h›

/* USER CODE END Includes */
...
...
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
HAL_Delay(500);
printf(“Hello, world!\r\n”);
}
/* USER CODE END 3 */
...
...
/* USER CODE BEGIN 4 */

int _write(int file, char *ptr, int len)
{
if (len > 0)
HAL_UART_Transmit(&huart2, (uint8_t*)ptr, len, len/10+5); // because baudrate is 115200
return len;
}


/* USER CODE END 4 */
...



Hello. I have read through the website that you have suggested, unfortunately still cannot fully understand how printing to console works and differs from printing to any other serial console.

I am able to print to serial console ( see image4 in the attachments).

I have tried replacing the _write with whatever has been suggested in that website:
```
int _write(int file, char *data, int len)
{
if ((file != STDOUT_FILENO) && (file != STDERR_FILENO))
{
errno = EBADF;
return -1;
}

// arbitrary timeout 1000
HAL_StatusTypeDef status =
HAL_UART_Transmit(&huart3, (uint8_t*)data, len, 1000);

// return # of bytes written - as best we can tell
return (status == HAL_OK ? len : 0);
}
```
However, still no text appearing in cubeIDE console window. How can it work in serial terminal but not the cubeIDE console?


Ah, you meant printing through semihosting. )

Just don’t forget to remove (or conditionally define) that calls from standalone, w/o debugger builds — they may hang.


 

Newest Forum Posts

  1. reservation car service Seattle by Jamesprede, 2025-05-01 10:06
  2. Last day: drone bonus by Danielrug, 2025-04-19 16:55
  3. SPI on Nucleo_STMH533RE by higginsa1, 2025-03-25 07:37
  4. SPI on Nucleo_STMH533RE by royjamil, 2025-03-23 11:31
  5. SPI on Nucleo_STMH533RE by higginsa1, 2025-03-23 09:33
  6. Configuring DMA for ADC in SW? by sam.hodgson, 2025-03-04 12:58
  7. Insightful Perspectives on This Subject by davidsycle, 2025-03-04 05:45
  8. Build a project in "release" mode by info@creosrl.it, 2025-02-20 18:12
  9. Build a project in "release" mode by info@creosrl.it, 2025-02-20 17:05
  10. Build a project in "release" mode by tang, 2025-02-20 10:36

Last-Modified Blogs