cancel
Showing results for 
Search instead for 
Did you mean: 

USART Communication Question

Minseo Kim
Associate II
Posted on July 25, 2017 at 16:25

I use chip STM32L073RzTx and STM32F103C8 , compiler and IDE True Studio, HAL base coding, develop board stm32nucleo

I want using printf() in UART Communication  

I used TDR register UART Communication good working but printf() don't working

now situation explain...

=======================================

int fputc(int ch, FILE *f)

{

   HAL_UART_Transmit (&huart2, (uint8_t*)ch, 1, 2);

   return(ch);

}

add this code and using printf() in while() function

========================================

that code .. don't working

so, how to use printf() in UART Communication and teach me principal printf()

and I have another question.

I look at stm32nucleo board circuit that board uart line pass through another MCU and connect micro usb, so nucleo board recognize USB well on my computer.

but STM32F103C8 is cheap develop board in internet that circuit is direct tx, rx(USART Pin) ,vcc, gnd connected noting pass through, so... that is not recognizing...

so... how to use direct connected siation UART communication

English sentences are strange but thank you for reading them.

7 REPLIES 7
Olivier GALLIEN
ST Employee
Posted on July 25, 2017 at 16:38

Hi

polar8950

‌,

For printf probably refering to

http://www.st.com/resource/en/application_note/dm00354pdf

chapter 7 may help you.

BR,

Olivier

Olivier GALLIEN
In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.
Posted on July 25, 2017 at 16:39

You can't apply Keil methods to GNU/GCC tools.

For the latter you need to use a 'newlib' approach

Your HAL equivalent of this, plus whatever USART initialization code you require

//******************************************************************************
/**
 * @brief Retargets the C library printf function to the USART (GNU)
 * @param None
 * @retval None
 */
int __io_putchar(int ch)
{
 /* Place your implementation of fputc here */
 /* e.g. write a character to the USART */
 /* Loop until the transmission buffer is empty */
 while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
 USART_SendData(USART3, (uint8_t) ch);
 return(ch);
}
//******************************************************************************
/**
 * @brief Retargets the C library scanf function to the USART (GNU)
 * @param None
 * @retval None
 */
int __io_getchar(void)
{
 /* Place your implementation of fgetc here */
 /* e.g. read a character from the USART */
 /* Loop until the reception buffer is not empty */
 while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);
 return((int)USART_ReceiveData(USART3));
}
//******************************************************************************
�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?

And newlib_stubs.c like this

/*
 * newlib_stubs.c
 *
 * Minimal implementation after nanoage.co.uk
 */
#include <errno.h>
#include <sys/stat.h>
#include <sys/times.h>
#include <sys/unistd.h>
#include 'stm32f4xx.h'
extern int __io_putchar(int ch);
extern int __io_getchar(void);
#undef errno
extern int errno;
/*
 environ
 A pointer to a list of environment variables and their values.
 For a minimal environment, this empty list is adequate:
 */
char *__env[1] = { 0 };
char **environ = __env;
int _write(int file, char *ptr, int len);
void _exit(int status) {
 _write(1, 'exit', 4);
 while (1) {
 ;
 }
}
int _close(int file) {
 return -1;
}
/*
 execve
 Transfer control to a new process. Minimal implementation (for a system without processes):
 */
int _execve(char *name, char **argv, char **env) {
 errno = ENOMEM;
 return -1;
}
/*
 fork
 Create a new process. Minimal implementation (for a system without processes):
 */
int _fork() {
 errno = EAGAIN;
 return -1;
}
/*
 fstat
 Status of an open file. For consistency with other minimal implementations in these examples,
 all files are regarded as character special devices.
 The `sys/stat.h' header file required is distributed in the `include' subdirectory for this C library.
 */
int _fstat(int file, struct stat *st) {
 st->st_mode = S_IFCHR;
 return 0;
}
/*
 getpid
 Process-ID; this is sometimes used to generate strings unlikely to conflict with other processes. Minimal implementation, for a system without processes:
 */
int _getpid() {
 return 1;
}
/*
 isatty
 Query whether output stream is a terminal. For consistency with the other minimal implementations,
 */
int _isatty(int file) {
 switch (file){
 case STDOUT_FILENO:
 case STDERR_FILENO:
 case STDIN_FILENO:
 return 1;
 default:
 //errno = ENOTTY;
 errno = EBADF;
 return 0;
 }
}

/*
 kill
 Send a signal. Minimal implementation:
 */
int _kill(int pid, int sig) {
 errno = EINVAL;
 return (-1);
}
/*
 link
 Establish a new name for an existing file. Minimal implementation:
 */
int _link(char *old, char *new) {
 errno = EMLINK;
 return -1;
}
/*
 lseek
 Set position in a file. Minimal implementation:
 */
int _lseek(int file, int ptr, int dir) {
 return 0;
}
/*
 sbrk
 Increase program data space.
 Malloc and related functions depend on this
 */
caddr_t _sbrk(int incr) {
 extern char _ebss; // Defined by the linker
 static char *heap_end;
 char *prev_heap_end;
 if (heap_end == 0) {
 heap_end = &_ebss;
 }
 prev_heap_end = heap_end;
char * stack = (char*) __get_MSP();
 if (heap_end + incr > stack)
 {
 _write (STDERR_FILENO, 'Heap and stack collision
', 25);
 errno = ENOMEM;
 return (caddr_t) -1;
 //abort ();
 }
 heap_end += incr;
 return (caddr_t) prev_heap_end;
}
/*
 read
 Read a character to a file. `libc' subroutines will use this system routine for input from all files, including stdin
 Returns -1 on error or blocks until the number of characters have been read.
 */

int _read(int file, char *ptr, int len) {
 int n;
 int num = 0;
 switch (file) {
 case STDIN_FILENO:
 for (n = 0; n < len; n++) {
 *ptr++ = __io_getchar();
 num++;
 }
 break;
 default:
 errno = EBADF;
 return -1;
 }
 return num;
}
/*
 stat
 Status of a file (by name). Minimal implementation:
 int _EXFUN(stat,( const char *__path, struct stat *__sbuf ));
 */
int _stat(const char *filepath, struct stat *st) {
 st->st_mode = S_IFCHR;
 return 0;
}
/*
 times
 Timing information for current process. Minimal implementation:
 */
clock_t _times(struct tms *buf) {
 return -1;
}
/*
 unlink
 Remove a file's directory entry. Minimal implementation:
 */
int _unlink(char *name) {
 errno = ENOENT;
 return -1;
}
/*
 wait
 Wait for a child process. Minimal implementation:
 */
int _wait(int *status) {
 errno = ECHILD;
 return -1;
}
/*
 write
 Write a character to a file. `libc' subroutines will use this system routine for output to all files, including stdout
 Returns -1 on error or number of bytes sent
 */
int _write(int file, char *ptr, int len) {
 int n;
 switch (file) {
 case STDOUT_FILENO: /*stdout*/
 case STDERR_FILENO: /* stderr */
 for (n = 0; n < len; n++) {
 __io_putchar(*ptr++);
 }
 break;
 default:
 errno = EBADF;
 return -1;
 }
 return len;
}
�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
Posted on July 26, 2017 at 03:44

Hi Oliver

Thank your answer that too halpful~

I readed reference chapter 7 .. that is why different? gcc compiler and keil compiler that both based on C++/C ?

Posted on July 26, 2017 at 04:48

Ford and Toyota make cars, differently, parts are generally incompatible.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
Posted on July 26, 2017 at 17:16

Oh~ thank you so much

Now I can usa USART communication with PC

Posted on July 26, 2017 at 17:26

Minseo Kim wrote:

Oh~ thank you so much

Now I can usa USART communication with PC

https://community.st.com/0D50X00009bMM5DSAW

 
Daniel Schuman
Associate
Posted on July 28, 2017 at 07:24

There is a very easy way to do this with TrueSTUDIO. It is described in the user's manual in the I/O Redirection section. Open syscalls.c and rewrite the _write function.