stm32 printf 예제

폴링 모드: CPU는 IO 장치를 지속적으로 쿼리하고 장치에서 요구 사항을 처리합니다. 예를 들어 CPU는 데이터 전송이 완료되었는지 여부를 직렬 포트를 쿼리합니다. 전송 시간이 지남에 따라 시간 초과 오류가 반환됩니다. 폴링은 CPU 시간을 차지할 수 있기 때문에 비효율적인 방법입니다. C 언어로 된 표준 라이브러리의 표준 출력 함수의 경우 기본 출력 장치는 표시자입니다. 직렬 출력 또는 LCD 출력을 구현하려면 표준 라이브러리의 출력 기능을 재정의해야 합니다. 예를 들어 함수 printf를 직렬 포트로 출력하려면 함수 fputc의 출력을 직렬 포트(리디렉션)로 보내야 합니다. 그렇게 하는 것은 쉽습니다. 함수 int fputc(int ch, FILE *f)를 추가하고 직렬 포트가 문자를 출력할 수 있는지 확인합니다. 큐브 예제에는 purouse가 있지만 지원되는 모든 개발 플랫폼에 대해 수행되었기 때문에 인쇄에서 사용할 사용자 정의 fpuct (내 uart 쓰기 프로시저 포함)에 대한 링크링커 정보 / 라이브러리가 누락되었다고 생각합니다. printf 줄이있는 내 코드는 성공적으로 컴파일되지만 uart로 문자열이 전송되지 않습니다 (그리고 어디로 가는지 모르겠습니다). 일부 사이트에서 는 GCC에서 요구하는 스텁 모듈 을 구현에 대한 정보를 발견했습니다 (예 : CodeSourcery 도구 체인에는 이미 printf 리디렉션을 위해이 스텁을 지원하는 libcnano가 있습니다).

당신은 단순히 USART, LCD 등에 출력 문자열을 직접 인쇄를 사용할 수 있다면 그것은 좋은 것입니다. ARM C를 사용하면 이 작업을 수행할 수 있습니다. 몇 가지 사항을 구현하기만 하면 작업할 준비가 됩니다. 이 명령문은 HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF)는 직렬 포트 1을 통해 문자를 전송하는 것을 의미합니다. ch는 문자를 저장하기 위한 주소이며 0xFFFF는 시간 시간 지정 기간입니다. 파일 stm32f7xx_hal_uart.c에서 HAL_UART_Transmit 함수를 찾을 수 있습니다. 나는 Nucleo F401에 프로그래밍 USB를 통해 인쇄하려고합니다. syscalls.c 메서드를 따라 보았지만 여전히 터미널에 아무 것도 표시되지 않습니다.

누구든지 내가 메인에서 해야 할 일의 예를 제공하여 도움을 주시기 바랍니다 수 있습니다, 나는 큐브 hal에서 uart를 활성화하고 메인의 while 루프에 printf를 넣어했습니다. 변수 이름 __stdout이 중요합니다. 당신은 그렇지 않으면 printf가 작동하지 않습니다, 다른 이름을 사용할 수 없습니다. 마지막으로 만들어야 하는 것은 printf에서 자동으로 호출되며 실제로 문자별로 스트리밍할 함수를 인쇄하는 함수입니다. 함수는 고정 된 이름을 가지고 있으며 변경할 수 없습니다. 감사. 나는 플러시 ()가 해결책인지 확실하지 않다. 인쇄 기능을 사용하려면 먼저 새 __FILE 구조체를 만들어야 합니다. 그런 다음 이 구조체를 FILE 구조체로 호출합니다. 하나의 더미 매개 변수만 가질 수 있지만 스트리밍할 문자를 출력하려면 이 구조에 대한 포인터가 필요하기 때문에 만들어야 합니다. 이에 대한 제어가 필요한 경우 직접 만들 수 있습니다.

아래에서 직접 만들었습니다: 헤더 stm32f7xx_hal_uart.h를 엽니다. 파일의 끝에서, 당신은 IO 작업과 직렬 함수를 찾을 수 있습니다 아래 표시된.