printf (및 다른 모든 콘솔 지향 stdio 함수)가 작동하는 방법은 _read() 및 _write()와 같은 하위 수준의 I / O 함수의 사용자 정의 구현을 만드는 것이었습니다. 헤더 stm32f7xx_hal_uart.h를 엽니다. 파일의 끝에서, 당신은 IO 작업과 직렬 함수를 찾을 수 있습니다 아래 표시된. 폴링 모드: CPU는 IO 장치를 지속적으로 쿼리하고 장치에서 요구 사항을 처리합니다. 예를 들어 CPU는 데이터 전송이 완료되었는지 여부를 직렬 포트를 쿼리합니다. 전송 시간이 지남에 따라 시간 초과 오류가 반환됩니다. 폴링은 CPU 시간을 차지할 수 있기 때문에 비효율적인 방법입니다. 그래서 USB 포트를 통해 인쇄를 구현하는 USART2를 구성하고 USART에 PUTCHAR를 리디렉션해야합니다. C 언어로 된 표준 라이브러리의 표준 출력 함수의 경우 기본 출력 장치는 표시자입니다.

직렬 출력 또는 LCD 출력을 구현하려면 표준 라이브러리의 출력 기능을 재정의해야 합니다. 예를 들어 함수 printf를 직렬 포트로 출력하려면 함수 fputc의 출력을 직렬 포트(리디렉션)로 보내야 합니다. 그렇게 하는 것은 쉽습니다. 함수 int fputc(int ch, FILE *f)를 추가하고 직렬 포트가 문자를 출력할 수 있는지 확인합니다. 이 예제는 USB를 통해 PC로 데이터를 전송하기 위해 STM32 NUCLEO 보드에 인쇄기를 구현하는 방법을 보여 준다. 당신은 단순히 USART, LCD 등에 출력 문자열을 직접 인쇄를 사용할 수 있다면 그것은 좋은 것입니다. ARM C를 사용하면 이 작업을 수행할 수 있습니다. 몇 가지 사항을 구현하기만 하면 작업할 준비가 됩니다. 이 명령문은 HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF)는 직렬 포트 1을 통해 문자를 전송하는 것을 의미합니다.

ch는 문자를 저장하기 위한 주소이며 0xFFFF는 시간 시간 지정 기간입니다. 파일 stm32f7xx_hal_uart.c에서 HAL_UART_Transmit 함수를 찾을 수 있습니다. 버퍼링 이없는 경우와 줄 버퍼링 케이스 모두에서 printf 코드가 `n`문자가 표시되면 플러시됩니다. 문제는 두 번째 경우 `n` 이후의 “abcd” 문자가 인쇄되지 않는다는 것입니다. 감사. 나는 플러시 ()가 해결책인지 확실하지 않다. 어쩌면 내가 더 나은 예를 줄 수 있습니다 : CUBE-MX 덕분에 다른 STM32 mcu에서이 예제를 매우 쉽게 전송할 수 있습니다.