STM32CubeIDE는 printf를 직렬 포트로 리디렉션

9947 단어 단편기
많은 글을 봤는데 다시 쓰는 함수io_putchar 및 fputc
/* USER CODE BEGIN 0 */
#include "stdio.h"

#ifdef __GNUC__

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

PUTCHAR_PROTOTYPE
{

  //           &huart1,  cubemx     1     
  HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);

  return ch;
}
#endif
/* USER CODE END 0 */ 

위의 방법은 이전 버전에서 실행할 수 있다.현재의 버전은 업그레이드된 후에 바뀌었다.다시 써야 함write 함수.한참을 해내다가 결국 납득하였다.이 대신의 가르침에 감사 드립니다https://blog.csdn.net/kyzb002/article/details/101100922
직렬 포트를 어떻게 설정했는지 상세하게 설명하지 않겠습니다.메일에서만c 파일에서USER CODE BEGIN 0 사이에 아래 코드를 추가하면 인터넷에 있는 글은 두 번째 함수만 적습니다io_putchar은 다시 정의해야 한다고 쓰지 않았어요write 함수, 여기는 두 함수 모두 반드시 실현해야 합니다.attribute((weak))의 작용은 약함수write 함수는syscalls에 있습니다.c에서 사용weak 정의, 그래서 다른 파일에서 직접 정의할 수 있습니다write 함수
이전에 을 다시 쓰기만 하면 됩니다.io_putchar 함수는 실행할 수 있습니다. stdio 때문일 것 같습니다.h안의 코드가 바뀌었다.
/* USER CODE BEGIN 0 */
#include "stdio.h"
//    print start
int __io_putchar(int ch)
{
    //          USART1     
    while ((USART1->SR & 0X40) == 0); //    ,      
    USART1->DR = (uint8_t) ch;
    return ch;
}

//_write   syscalls.c ,   __weak  ,               _write  
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
	int DataIdx;
	for (DataIdx = 0; DataIdx < len; DataIdx++)
	{
		__io_putchar(*ptr++);
	}
	return len;
}
//    print  end
/* USER CODE END 0 */

또는 두 개를 하나의 함수로 합치다
/* USER CODE BEGIN 0 */
#include "stdio.h"
//    print start 
//_write   syscalls.c ,   __weak  ,               _write  
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
	int DataIdx;
	for (DataIdx = 0; DataIdx < len; DataIdx++)
	{
		  while ((USART1->SR & 0X40) == 0); //      
		  USART1->DR = (uint8_t) *ptr++;
	}
	return len;
}
//    print  end
/* USER CODE END 0 */

더 깔끔한 거.
/* USER CODE BEGIN 0 */
#include "stdio.h"
//    printf start 
//_write   syscalls.c ,   __weak  ,               _write  
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
	 if(HAL_UART_Transmit(&huart1,ptr,len,0xffff) != HAL_OK)
	 {
		 Error_Handler();
	 }
}
//    printf end

printf에서 부동점수% f를 지원하려면 설정을 열어야 합니다.아래 문장을 참고하시오https://blog.csdn.net/qq_42980638/article/details/98359026

좋은 웹페이지 즐겨찾기