Loading...
 

SW4STM32 and SW4Linux fully supports the STM32MP1 asymmetric multicore Cortex/A7+M4 MPUs

   With System Workbench for Linux, Embedded Linux on the STM32MP1 family of MPUs from ST was never as simple to build and maintain, even for newcomers in the Linux world. And, if you install System Workbench for Linux in System Workbench for STM32 you can seamlessly develop and debug asymmetric applications running partly on Linux, partly on the Cortex-M4.
You can get more information from the ac6-tools website and download (registration required) various documents highlighting:

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.