2016-09-23 10 views
0

저는 STM32F103을 처음 접했습니다. 나는 STM32F103을위한 데모 코드를 가지고 있으며 그것을 컴파일하기 위해 arm-none-eabi를 사용하고있다.STM32F103에서 printf 작업을 수행하는 방법은 무엇입니까?

나는 Google에서 찾을 수있는 것을 시도했지만 지금까지 아무 것도 작동하지 않았습니다. 나는 이미 문제에 3 일을 보냈다.

누구나 잘 작동하는 printf 용 데모 코드를 제공 할 수 있습니까? 내 메이크의

부 :

CFLAG = -mcpu=$(CPU) -mthumb -Wall -fdump-rtl-expand -specs=nano.specs --specs=rdimon.specs -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group 
LDFLAG = -mcpu=$(CPU) -T ./stm32_flash.ld -specs=nano.specs --specs=rdimon.specs -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group 
+1

"작동하지 않는다"는 것은 무엇을 의미합니까? 그리고 그것은 마이크로 컨트롤러입니다. 텍스트를 인쇄 할 곳은 어디입니까? 보통 임베디드 타겟을 프로그래밍 할 때 UART (또는 다른 통신 프로토콜)를 사용하는 함수의 자신의'print' 세트를 만듭니다. 일부 UART 라이브러리 또는 디버거를 사용하는 일부 디버그 라이브러리 (예 : Segger 디버거가있는 경우 PC에서 JLink 뷰어로 Segger RTT 사용) – Tim

+0

나는 arm-none-eabi- to comiple을 사용합니다. 그것이 문제이다. keil 프로젝트에서 printf를 사용하는 방법을 알고있다. 출력 할 때 USART1을 사용합니다. 이 컴파일러를 사용하여 bin 파일을 작성하려고합니까? –

답변

0

Look there. 이것은 printf에서 glib입니다. 그러나 마이크로 컨트롤러가 있습니다. 따라서 printf을 작성해야합니다. 여기에서 vfprintf은 결과를 버퍼에 반환하고 다음으로는 버퍼에서 UART로 데이터를 보냅니다. 종류 :

void printf(const char * format, ...) 
{ 
    char buffer[256]; 
    va_list args; 
    va_start (args, format); 
    vsprintf (buffer,format, args); 
    send_via_USART1 (buffer); 
    va_end (args); 
} 

또한 vsprintf으로 작성할 수 있습니다. Standart vsprintf은 매우 무겁습니다. 일반적으로 vsprintf 기능의 일부가 사용됩니다.

2

printf 구현을 작성하는 것이 옵션이며, 아마도 나에게 가장 권장되는 옵션입니다. 표준 라이브러리 구현에서 영감을 얻어 자신의 버전을 작성하십시오. 요구 사항 만 충족하면됩니다. 일반적으로, 먼저 직렬 인터페이스를 통해 문자를 보내도록 putc 함수를 재 지정해야합니다. 그런 다음 사용자 지정 구현을 사용하여 printf 메서드를 재정의합니다. 아마도 매우 간단한 접근법은 putc 함수에 대한 재귀 호출을 통해 문자를 문자열로 보내는 것입니다.

가벼운 printf 구현을 찾을 수 있습니다. 이 경량 구현에 의해 제공되는 코드 크기와 기능 세트는 맞춤 작성된 printf 기능과 주식 표준 printf 기능 (일명 짐승) 사이에 놓여 있습니다. 나는 최근에이 Tiny Printf을 시도해 보았으며 메모리 풋 프린트와 필요한 실행주기의 관점에서 ARM 코어의 성능에 매우 만족하고 있습니다.

언젠가 다시 내 자신의 writings에서 복사 -ps.

1

링크 : How to retarget printf() on an STM32F10x?

지금처럼 _write 기능을 하이재킹 시도 :

#define STDOUT_FILENO 1 
#define STDERR_FILENO 2 

int _write(int file, char *ptr, int len) 
{ 
    switch (file) 
    { 
    case STDOUT_FILENO: /*stdout*/ 
     // Send the string somewhere 
     break; 
    case STDERR_FILENO: /* stderr */ 
     // Send the string somewhere 
     break; 
    default: 
     return -1; 
    } 
    return len; 
} 

원래의 printf가 (당신이 물론 무엇을 사용 libs와)에 따라이 기능을 통해 이동합니다. 다음 링커 플래그를 포함하여

+0

이 방법은 STM32F072에서 사용하고 있습니다. 여기에 세부 정보가 있습니다. http://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32/279945#279945 –

0

:

당신이 세미 호스팅 를라는 것을 사용하려고하는 것 같습니다
LDFLAGS += --specs=rdimon.specs -lc -lrdimon 

. 링커에게 시스템 호출 라이브러리를 포함하도록 지시하고 있습니다.

세미 호스팅은 ARM 타겟에서 실행되는 코드가 통신하고 디버거를 실행중인 호스트 컴퓨터에서 입출력 기능을 사용할 수있게 해주는 메커니즘입니다.

이러한 기능의 예로 키보드 입력, 화면 출력 및 디스크 I/O가 있습니다. 예를 들어,이 메커니즘을 사용하여 C 라이브러리의 함수 (예 : printf() 및 scanf())가 대상 시스템에 화면 및 키보드가있는 대신 호스트의 화면 및 키보드를 사용할 수 있습니다.

당신이 (메이크와 팔 - 없음 - EABI) 당신의 STM32 개발을위한 오픈 소스 도구를 사용하고 있기 때문에, 당신은 또한 당신의 마이크로 컨트롤러를 프로그래밍 할 수 openOCD를 사용하는 가정입니다. openOCD는 다음과 같은 명령을 사용하여뿐만 아니라 세미 호스팅을 사용하려면이 필요합니다

arm semihosting enable 

당신은 당신의 openOCD 스크립트 명령에 당신이 구성 단계를 종료하고 '초기화하기'명령으로 실행 단계를 입력 확인하고 있습니다. 당신의 목표를 재설정는 UART 인터페이스에 fputc() 기능도 작동하고 힘 것이다 여기에 언급

source [find target/stm32f1x.cfg] 
init 
arm semihosting enable 

다른 솔루션 : 아래 (STM32F103에 맞게)를 openOCD 스크립트의 예입니다. 세미 호스팅은 최근의 모든 ARM Cortex-M에서 작동하지만 일부 컴파일러는 & 디버거 구성이 필요합니다 (위 참조). fputc() 기능을 UART 인터페이스로 재조정하면 모든 컴파일러에서 작동하지만 모든 보드의 핀 구성을 확인해야합니다.