[HAL, CubeMX, TrueSTUDIO] STM32F4 Tutorial 2-2. USART(UART) printf.

แชร์
ฝัง
  • เผยแพร่เมื่อ 20 ก.ย. 2024
  • Hello I'm ChrisP.
    This is STM32 tutorial with TrueSTUDIO, CubeMX and HAL drivers.
    This video is chapter 2-2. USART(UART) printf.
    The contents are
    - How to use printf function in TrueSTUDIO.
    - Definition of int _write(int file, char* p, int len) function.
    - How to print floating point variables(float, double) using "%f" in printf.
    - Implementation for tiny_printf. (But doesn't use)
    ※ In this tutorial, I'm using CubeMX V4.26. The latest is V5.
    ※ In this tutorial, I'm using TrueSTUDIO 9.0.1. The latest is 9.2.0.
    The hardware devices are available in Korea only for now.
    (Because of the payment issue.)
    Thank you!
    - This video has been recorded on July. 2018

ความคิดเห็น • 78

  • @장상현-p8s
    @장상현-p8s 5 ปีที่แล้ว +3

    참으로 쉽게 쉽게 설명해 주시네요.write()에 대한 리디렉션(??) 이 뭔지 공부를 좀 더 하고 그래도 이해가 않되면 문의 드리겠습니다.좋은 자료 고맙습니다. 잘 봤습니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      매번 좋은 말씀 감사드립니다 ㅎㅎ :) 여기서 리디렉션의 의미는 printf 함수의 출력 대상을 UART로 지정한다는 말이라고 보시면 됩니다!

  • @홍현의-u9d
    @홍현의-u9d 6 ปีที่แล้ว +2

    감사합니다... ^^;

  • @3be3da73
    @3be3da73 4 ปีที่แล้ว

    터미널 매크로에 왠지 블루투스 하신 것 같은 기록이 ㅋㅋㅋ 넘 잘보고 있습니다 ^♡^

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  4 ปีที่แล้ว +1

      안녕하세요 ㅎㅎ 네 그렇네요 AT 커맨드가 송신창에 남아있군요... ㅎㅎ;; 잘봐주셔서 감사합니다 :) 즐거운 STM32 개발되시기 바래요~

  • @user-lp5bb8io4m
    @user-lp5bb8io4m 4 ปีที่แล้ว +2

    안녕하십니까 궁금 한게 있어 여쭤보려고 합니다
    int _write(int file, char* p, int len) {
    HAL_UART_Transmit(&huart2, &p, len, 10);
    return len;
    } 형식으로 작성 했는데 2번째 passing argument 2 of 'HAL_UART_Transmit' from incompatible pointer type [-Wincompatible-pointer-types] 이런식으로 워닝이 뜨네요 ㅠㅠ 이것 떄문에 printf 가 안되는건지 궁금해서 질문 남깁니다 ㅠㅠ

    • @user-lp5bb8io4m
      @user-lp5bb8io4m 4 ปีที่แล้ว

      툴은 STM32에 true studio 똑같이 쓰고 있습니다...

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  4 ปีที่แล้ว

      HAL_UART_Transmit() 이 함수의 사용법을 잘 생각해보셔야 할 듯 합니다. 두번째 매개변수는 보낼 배열의 주소를 전달해줘야 합니다. 작성하신 코드에서 p가 의미하는게 뭔지 잘 생각해보세요~ 포인터를 좀 보셔야 할 것 같습니다.

    • @user-lp5bb8io4m
      @user-lp5bb8io4m 4 ปีที่แล้ว +1

      @@ChrisWonyeobPark 아 주소연산자를 잘못 붙였습니다... 죄송합니다
      주소연산자를 떼더라도 같은 워닝이 발생합니다
      두번째 인자 문제 워닝이긴한데 그냥 넘어 갈순 없을거같아서 실례를 무릅쓰고 다시 질문 남깁니다

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  4 ปีที่แล้ว

      주소연산자 &를 지우면 정상동작하긴 할 겁니다. warning 이 발생하는 이유는 아마도 char* p 를 unsigned char* 로 바꾸면 없어질 것 같습니다. 한번 확인해보세요~

    • @user-lp5bb8io4m
      @user-lp5bb8io4m 4 ปีที่แล้ว +1

      @@ChrisWonyeobPark 정말 감사합니다 .
      덕분에 워닝 없이 잘됩니다 열심히 배우겠습니다

  • @랜덤-s4c
    @랜덤-s4c 16 วันที่ผ่านมา

    본론 7:08

  • @hasanakkoc6584
    @hasanakkoc6584 5 ปีที่แล้ว +1

    Hii Dear Sir,
    I watch from TURKISH. I like You.
    How printf write without any relationship with the _write() function to the usart3? I didnt understand can you explaint it with details?

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว +1

      Dear sir. My pleasure! In TrueSTUDIO, You have to define int _write() function to use printf() function. In the _write() function, re-direct printf through USARTn channel. In my video, I use USART3. To change USART channel, configure USART channel you want via CubeMX and set the USART channel using HAL_UART_Transmit(&huart3, p, len, 10); in the _write() function. Change "&huart" as you configure.

  • @구구단-w2o
    @구구단-w2o ปีที่แล้ว +1

    감사합니다. 잘 배우고 있습니다
    질문이 하나 있는데 retrun len를 하는 이유가 궁금합니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  ปีที่แล้ว

      안녕하세요! 제 영상이 도움이 되었으면 좋겠네요~
      printf() 사용법은 보통 IDE 마다 다릅니다.
      표준출력장치가 정의되어있지 않은 MCU의 경우 printf()를 호출했을때 출력 대상을 직접 지정해줘야 하는데 이걸 redirection 한다고 합니다.
      CubeIDE의 경우엔 printf()를 사용하기 위해 int _write() 함수를 정의하도록 되어있고, 이 함수의 정의 방법은
      www.st.com/resource/en/user_manual/um2609-stm32cubeide-user-guide-stmicroelectronics.pdf
      공식 문서에 소개되어 있습니다. 문서의 91페이지를 보시면 설명되어있으니 확인해보시면 이해하시는데 도움이 될 겁니다!

  • @정명훈-j6k
    @정명훈-j6k 4 ปีที่แล้ว +2

    안녕하세요! 강의 전부 잘 봤습니다. 좋은 감사합니다. printf로 실수를 출력하기 위해 했던것처럼 sscanf로 실수를 받아오려면 어떤 설정을 해줘야 하나요? %d %c %s전부 잘 받아오는데 %f만 못받아오네요..ㅠ

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  4 ปีที่แล้ว +1

      안녕하세요! 제 강의가 STM32 시작하는데 도움이 많이 되었으면 좋겠네요 ㅎㅎ
      xscanf도 xprintf와 마찬가지로 -u _scanf_float 설정을 추가해주셔야 할 겁니다. (sscanf도 scanf의 일종입니다.)
      한번 확인해보신후에 잘 동작하면 댓글로 부탁드립니다!

    • @정명훈-j6k
      @정명훈-j6k 4 ปีที่แล้ว +1

      @@ChrisWonyeobPark 완벽하네요.. GPS데이터를 파싱하려고 했는데 말씀해 주신대로 하니 잘 됩니다. 매번 감사합니다!
      아 그리고 STM32 시작하는데 매우큰 도움이 됩니다. 장담합니다ㅋㅋ

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  4 ปีที่แล้ว

      @@정명훈-j6k 잘 된다니 다행이네요! ㅎㅎ 좋은 말씀도 감사합니다. 하시는 프로젝트 잘 마무리되기 바랍니다~

  • @집에가서잠이나자자
    @집에가서잠이나자자 4 ปีที่แล้ว +1

    감사합니다. 영상을 통해 정말 많은 공부가 되고 있습니다.
    질문 하나 드리고 싶습니다.
    영상에서 짠 HAL 코드를 LL 코드로 변환해가며 HAL과 LL 모두 공부하려고 하는데, 레지스터에 대한 자료가 하나도 없어서 변환하는게 쉽지 않네요.
    혹시 AVR과 같이 레지스터에 대해 정리한 자료 같은게 있을까요?
    예를 들어, LL_USART_IsActiveFlag_TXE(USARTx) 이 레지스터는 송신이 완료되었을 때 활성화되는 flag이다 라는 설명이 되어있는 매뉴얼 같은게 있는지 궁금합니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  4 ปีที่แล้ว

      제 영상이 도움이 되었다니 다행입니다. 말씀하신매뉴얼의 정식 명칭은 reference manual 입니다. 인터넷에서 찾으면 쉽게 구하실 수 있고, ST 홈페이지에서도 다운받으실 수 있습니다.
      AVR처럼 레지스터 맵과 설명에 대해 문서로 된게 있는데, 32bit 구조로 되어있어서 AVR이랑은 비교도 안 될만큼 종류가 많고 복잡합니다. 한번 찾아서 공부해보세요~

    • @집에가서잠이나자자
      @집에가서잠이나자자 4 ปีที่แล้ว +1

      @@ChrisWonyeobPark 감사합니다

  • @sejinyang2506
    @sejinyang2506 3 ปีที่แล้ว

    1강 강의부터 정주행중입니다!!
    IAR에서는 동일방법으로 설정했을 때, UART에 출력이 안되네요.ㅠㅠㅠ
    터미널 I/O에서 출력되는 것은 확인했는데~ UART로 출력하기 위해서는 영상에 나온 설정 외 별도의 설정이 필요한가요?

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  3 ปีที่แล้ว

      아뇨 다른 설정은 필요없고 동영상 강좌와 똑같이 하면 됩니다. 혹시 모르니 IAR 말고 CubeIDE를 사용해보세요~

  • @jinsuan7179
    @jinsuan7179 3 ปีที่แล้ว

    ATMEGA 에서 STM으로 넘어가고 있는 공대생입니다.
    여런 영상 업로드 해서 무척 감사함을 느끼며 공부하고 있습니다.
    다름이 아니라 int _write함수문을 만드는 부분에서 궁금점이 있어 댓글남깁니다.
    1. write 앞에 언더바(_)를 붙인 이유가 궁금합니다.
    2. printf 함수에서 어떻게 _write함수로 넘어가게 되는건지가 궁금하네요....
    두 질문은 관련이 있을것으로 생각이 됩니다만... printf 내제 함수문에서 찾아봐도 모르겟어서 질문남깁니다.
    오래된 영상이라 댓글을 보실지는 모르겠지만 보신다면 답변부탁드립니다. 감사합니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  3 ปีที่แล้ว

      안녕하세요~ 제 영상이 도움이 되었길 바랍니다!
      질문에 대한 답을 드리자면, (다른분들도 이 질문을 했었는데 답변을 어디다가 드렸는지 못찾겠네요.)
      int _write() 함수는 사용자가 임의로 작성해서 사용되는 함수가 아닙니다.
      CubeIDE(TrueSTUDIO)에서 정의된 printf redirection 함수이지요.
      OS가 없는 MCU는 기본 입출력 장치가 정의되어있지 않기 때문에 어떤 장치로 입출력 할건지를 지정해주어야 합니다(redirection). 그걸 지정해서 사용하기 위한 함수가 _write() 함수이고, 이 함수는 IDE에 따라 함수이름과 정의 방식이 모두 다르므로 해당 IDE의 매뉴얼을 보셔야 합니다.
      www.st.com/resource/en/user_manual/dm00629856-stm32cubeide-user-guide-stmicroelectronics.pdf
      이 문서에서 printf로 검색하시면 86페이지에 잘 설명되어있습니다.
      한번 읽어보시고 잘 이해하셨길 바라겠습니다~
      참고로, ATMEGA 역시 printf를 사용하기 위해 별도의 함수를 정의해야하고 IDE마다 함수가 다릅니다~

  • @mjaysg
    @mjaysg ปีที่แล้ว

    다른 사람들은 잘 모르고 크리스님께만 알고 계신것들이 많아서 추가 질문 드립니다.
    아래 소스에서 huart3 으로 하면 출력이 잘 되는데 huart2로 변경을 하면 출력이 안됩니다. ​
    혹시 huart3와 huart2 쓰임새 차이가 있는건지 궁금하네요
    (USART2/USART3 global interrupt Enabled 설정함)​
    #ifdef __GNUC__
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    #else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    #endif /* __GNUC__ */

    PUTCHAR_PROTOTYPE{
    HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF);
    *이 부분에서 huart3 으로 하면 출력이 잘 되는데 huart2로 변경을 하면 출력이 안되네요
    return ch;
    }
    int main(void){
    while (1)
    {
    printf("ccccccccccccccccccc
    ");
    HAL_Delay(1000);
    }
    }

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  ปีที่แล้ว

      음,, 단순 uart로만 사용하신다면 모든 uart 채널의 차이는 없을텐데요.
      uart2 초기화 및 GPIO 핀 초기화가 안되어있던지, GPIO핀에 제대로 연결이 안되어있던지 하지 않을까 합니다.
      uart2 어떤 핀에 연결하셨나요?

    • @mjaysg
      @mjaysg ปีที่แล้ว

      @@ChrisWonyeobPark 저는 429를 사용하고 있고 PA3 USART2_Rx
      PD5 USART2_Tx 입니다. 정말 단순한 소스인데 2랑 3이랑 차이가 나네요..

    • @mjaysg
      @mjaysg ปีที่แล้ว

      @@ChrisWonyeobPark 지금 제가 수신인터럽트쪽 영상 보고 있었는데요 여기에서도 UART2로 트랜스하면 출력이 안되요 UART3은 출력 잘 됩니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  ปีที่แล้ว

      @@mjaysg 음 제 STM32 EduBoard V1.2로 확인해보니 uart2로도 문제없이 잘 출력됩니다. 혹시 사용하시는 보드의 회로에서 PD5 핀이 이미 다른 용도로 사용되고 있는것은 아닌지도 확인해보세요. 그렇지 않다면 초기화 설정이나 출력장치가 uart2로 지정되지 않아서 발생하는 문제일 확률이 높겠네요!

    • @mjaysg
      @mjaysg ปีที่แล้ว

      @@ChrisWonyeobPark PA3 USART2_Rx
      PD5 USART2_Tx 연결했씁니다. 근데 웃긴건 Uart4도 먹통입니다.

  • @참구리네
    @참구리네 2 ปีที่แล้ว

    11:10 에서 똑같이 printf("Hello
    "); 로 작성했는데
    제 터미널에서는 HelloHelloHelloHello 로 출력되는 이유를 알 수 있을까요?
    Hello
    Hello
    Hello
    Hello
    처럼 출력하고 싶습니다!
    터미널은 본 영상에서 쓰이는 것과 같은 프로그램을 쓰고 있습니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  2 ปีที่แล้ว

      안녕하세요! 터미널 옵션중에 CR=LF 를 체크하시면 됩니다.

  • @mjaysg
    @mjaysg ปีที่แล้ว

    안녕하세요. int _write함수에 대해서 질문이 있습니다.
    STM32에서 printf로 출력할 때 반드시 _write함수를 사용해야하는거죠? _write가 아닌 write나 다른 이름으로 변경하면 출력이 안되네요
    _write에서 F3 눌러도 점프해서 볼수도 없고 네이버에 특별한 내용이 없어서 질문 드립니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  ปีที่แล้ว

      안녕하세요! 해당 내용은 truestudio 의 매뉴얼에 설명되어있습니다.
      www.st.com/resource/en/user_manual/usermanual_truestudio-user-manual-for-truestudio-930-stmicroelectronics.pdf
      이 문서의 160페이지 I/O Redirection 의 내용을 읽어보시면 될 것 같습니다.
      대부분의 크로스컴파일러(truestudio나 iar 등)은 i/o redirection 기능을 가지고 있는데, MCU의 경우 printf() 함수를 통해 출력할 표준 출력장치가 정의되어있지 않기 때문에 사용자가 직접 i/o redirection을 통해 어떤 장치로 출력할지 정의해줍니다.

    • @mjaysg
      @mjaysg ปีที่แล้ว +1

      @@ChrisWonyeobPark 역시 답은 크리스님께 있었네요 감사합니다.

    • @mjaysg
      @mjaysg ปีที่แล้ว

      혹시 _write 함수와 아래 소스와 printf 차이가 있을까요?
      #ifdef __GNUC__
      #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
      #else
      #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
      #endif /* __GNUC__ */
      PUTCHAR_PROTOTYPE
      {
      HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
      return ch;
      }

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  ปีที่แล้ว

      @@mjaysg 저도 궁금해서 찾아보다보니 매뉴얼에 있었거든요~ 다행히 제가 알고있는 내용을 질문주셔서 답을 드릴수 있었네요! 감사합니다!

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  ปีที่แล้ว

      @@mjaysg 혹시 해당 코드가 어떤 IDE에서 사용되는지 알려주시겠어요? 제 기억에 PUTCHAR_PROTOTYPE
      으로 redirection 하는건 KEIL IDE로 알고있습니다.
      만약 truestudio에서도 PUTCHAR_PROTOTYPE
      을 사용한다면 해당 내용은 저도 다시 찾아봐야겠네요. truestudio는 int _write() 만 사용하는 줄 알고있었거든요~

  • @kkh8623
    @kkh8623 5 ปีที่แล้ว

    질문이있습니다.
    Wonyeob Chris Park
    님의 강의를 IAR을 이용해서 하고 있는데요. 이번 내용은 이상하게 IAR에선 정상적으로 Hello를 출력하지 못하고, TrueStudio에선 정상적으로 출력됩니다. 같은 HAL을 써도 컴파일러마다 문법이 달라서 생기는 문제인가요? IAR에선 빌드 오류가 뜨지는 않는데, 출력을 하지 못하니 이상하네요

    • @kkh8623
      @kkh8623 5 ปีที่แล้ว

      IAR에서 main소스를 통째로 복사하여 True Studio에 붙여 넣어 실행해도 정상적으로 작동합니다..

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      안녕하세요!
      IDE마다 printf 사용법이 다르기 때문에 IDE가 달라지면 해당하는 IDE의 printf 함수의 사용법을 확인하셔야 합니다. IAR의 UART printf 사용방법을 검색해보시면 될 것 같습니다!
      문법 에러가 없기때문에 빌드는 잘 되는겁니다. int _write() 함수를 정의만 했기때문에 문법적인 에러는 없습니다.

    • @kkh8623
      @kkh8623 5 ปีที่แล้ว

      @@ChrisWonyeobPark 그렇군요.. 답변감사합니다. 자주 질문드리겠습니다 ^^

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      @@kkh8623 네 하다가 막히시면 질문주세요~ 확인하는대로 가능한 빨리 답글달아드리겠습니다. 즐거운 STM32F 개발 되세요~

  • @Alzalddak
    @Alzalddak 6 ปีที่แล้ว

    강의 감사드립니다. 다만 질문이 있어서 답글 남깁니다. 강의해주신대로 printf를 사용하고 있는데 문자열을 길게 전송하려고 하면 대충 12byte부터 잘려서 전송되는 것 같은데 원래 이런것인가요?

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  6 ปีที่แล้ว

      아뇨 바이트 수가 어떻게 되든 문제없이 잘 출력되어야 합니다. 영상에서도 printf("Hello %d %f
      ", a++, f); 이렇게 출력을 하는데 총 출력되는 바이트 수는 17바이트 정도가 됩니다. 그래도 잘 출력되고 있죠. 어딘가 다른 문제가 있지않을까 생각되네요~

  • @doran-guitar
    @doran-guitar 5 ปีที่แล้ว

    따라해보다가 printf("Hello
    "); 에서
    을 입력하지 않으면 출력이 되지 않더라구요 이것때문에 시간좀 잡아먹었네요 따라하시는분들은 참고하세요~
    그리고 카페 가입해서 잘 보고있습니다! 근데 카페 게시물에는 댓글을 달수 없게 되어 있던데 일부러 막아 놓으신건가요? 질문하려고 했는데 댓글 기능이 꺼져있어서 여쭤봅니다 ㅎㅎ

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว


      을 입력하지 않으면 출력 되지 않는다는건 잘못된 정보입니다. 어떤 환경에서 테스트 하셨는지 모르겠지만 사용하신 터미널 프로그램의 문제일 겁니다~ 당연히
      이 없어도 출력되는게 맞아요~
      카페는 일부러 그런건 아닌데 권한설정이 그렇게 되있나보네요 ㅎㅎ 질문은 이곳에 달아주셔서 매일 확인하고 답글 달아드립니다~

    • @doran-guitar
      @doran-guitar 5 ปีที่แล้ว

      아하 감사합니다!
      터미널은 TrueStudio의 자체 터미널, 강의에서 사용하신 터미널, tera term 세가지 모두 같은 현상이네요 ㅎㅎ
      강의에서 사용된 보드가 아니라서 그럴수도 있을것 같아요~

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      @@doran-guitar 보드의 문제일 가능성도 크진 않습니다. 무슨 이유인지는 모르겠지만 printf의 설정이 잘못되었던지 출력 대상이 uart가 아니던지 그런이유일 듯 합니다.
      을 안쓰면 출력이 되지않는 현상은 또 처음보네요 ㅎㅎ오실로스코프로도 한번 확인해보시는게 좋겠네요~

    • @doran-guitar
      @doran-guitar 5 ปีที่แล้ว

      네 ㅎㅎ 조언 감사합니다.
      그리고 디버그모드 안들어가고 칩에 다운로드하는 방법 이전 영상에서 알려달려고 하셨는데 이미 알고 계실지는 모르겠지만
      th-cam.com/video/R2hfq4S_-B0/w-d-xo.html
      영상 참고하시면 될 것 같습니다!

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      @@doran-guitar 네 ㅎㅎ 감사합니다. 사실 이 방식은 디버그모드로 들어갔다가 자동으로 빠져나오는 방식이라서.. 아예 디버그모드로 진입안되는 방법이 있는지 궁금한거였어요ㅎㅎ 디버그모드 진입하는데 시간이 너무 오래걸려서 ㅜㅜ

  • @jaeyoonlee4892
    @jaeyoonlee4892 5 ปีที่แล้ว

    8:57 부터 작성하는 코드요!! 저 위치에 작성하는 이유가 있나요?? 메인에 포함시키면 안되는건가요?

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      안녕하세요! 그 부분은 함수 정의에 관한 C언어 기본 문법입니다. 함수에 대한 내용을 공부해보세요!

  • @phillipkim2864
    @phillipkim2864 5 ปีที่แล้ว

    _write 함수에 대해 질문이 있습니다. _write함수가 printf를 호출하면 printf 내부에 있어서 _write함수도 자동으로 호출이 된다는건 이해했습니다. 그런데, printf 내부에 있다는건 이미 이 _write함수가 정의 되어 있다는건데... 사용자가 정의되어 있는 함수를 같은 이름으로 다시 정의해서 사용하면 충돌이 일어나거나, 컴파일러에서 이건 이미 있는 거라고 에러를 발생시키는 것 아닌가요?
    printf 부분 소스로 가서 _write 부분이 어떻게 작성되어 있는지 보려고, printf 블록지정하고 f3눌러서 declaration 보려고 했는데
    'could not find symbol 'printf' in index ' 이렇게 나오네요..

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว +2

      안녕하세요! printf 함수는 이미 정의된 표준 라이브러리 함수라서 함수의 내부를 볼수없습니다. 이미 컴파일 되어있는 형태라고 보시면 될 것 같습니다. 저도 정확히 정의를 찾아보진 않았으나 (사실 내부를 찾아볼 이유가 없습니다.) _write 함수가 아마도 __weak 처리 된 형태가 아닐까 싶습니다. TrueSTUDIO에서는 __weak 처리된 함수는 사용자가 재지정해서 사용하라는 의미입니다.
      각 IDE마다 printf 사용법이 다 다르기 때문에 궂이 함수 내부 동작 상황까지 이해할필욘 없습니다. 우리가 해야할 일은 어떻게 해야 그 printf 함수를 원하는대로 쓸수있는지를 찾아내는 것이죠! 내부를 찾아보는건 무의미합니다.
      참고로 모든 표준 라이브러리 함수는 함수 정의 내부코드를 볼 수 없습니다.

    • @phillipkim2864
      @phillipkim2864 5 ปีที่แล้ว +1

      @@ChrisWonyeobPark 아하! 다음 강의에서 _weak에 대한 언급이 잠깐 나오네요!! 신기하네요~ 감사합니다 :)

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      @@phillipkim2864 네! 그럼 또 즐거운 STM32 개발 되시고 질문있으시면 답글 주세요~ㅎㅎ

  • @도로동-h1y
    @도로동-h1y 5 ปีที่แล้ว

    강좌 잘 보고있습니다. 질문이 있는데요... stdio.h 에 있는 gets 함수를 사용하고싶은데... printf 처럼 이런식으로 무언가 해줘야되는건지... 사용이 안되는데 어떻게 하는지 알고있으신거 있을가요 ?

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      안녕하세요~ gets 함수는 stdio.h가 아니라 string.h에 정의되어있습니다. include 를 해보세요!
      정정합니다. gets는 stdio가 맞습니다~ 제가 착각했네요 ㅎㅎ

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      근데 gets면 표준입력장치로 문자열을 입력받는 함수인데 표준입력장치 정의가 따로 되어있어야 할 것 같습니다. 그리고 MCU에서는 gets 함수는 거의 사용하지 않습니다. 말씀드린대로 표준입력장치가 없기 때문이죠. 다른 용도로 사용하시려는것 같은데 무엇을 하시려는건가요?

    • @도로동-h1y
      @도로동-h1y 5 ปีที่แล้ว

      @@ChrisWonyeobPark 다른 MCU랑 UART로 통신하여 gets함수로 RX 데이터를 배열에 넣고, 하나하나 비교하여(비밀번호처럼) 그거로 특정 동작을 하게 하고 싶어서요. 예를 들어 HELLO 라고 보내면 LED가 켜지고 BYE 라고 보내면 LED가 꺼지는 동작을 작동시켜보고 싶어서 질문드렸습니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      DongGi Lee 아 그러실거면 gets로 저장하시는게 아니고 한 바이트 받을때마다 임시버퍼에 저장한 후에 strcmp같은걸로 비교하셔도 됩니다. strcmp를 사용하시려면 string.h를 include 해주셔야 합니다. 그리고 string 관련 함수는 모두 '\0'를 기준으로 문자열의 끝을 검색하므로 반드시 끝에 꼭 넣어주셔야 합니다~ (위에서 잘못 설명드렸네요 gets는 stdio가 맞습니다ㅜㅜ)

    • @도로동-h1y
      @도로동-h1y 5 ปีที่แล้ว

      @@ChrisWonyeobPark 답변 감사합니다. 그리고 혹시 아까 영상에서 보니 hal_uart_receive함수에서 배열로해서 넣으면 여러개 받을수 있다는 말씀을 하셨는데 저는 좀 이상하게 동작하는거 같아서요... 혹시 확인해보셨나용 ??

  • @최백연-c9c
    @최백연-c9c 3 ปีที่แล้ว

    코드도 똑같고 터미널도 똑같은데 아무것도 출력이 안됩니다ㅜ keil에서 사용하는데 무엇이 문제일까요...

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  3 ปีที่แล้ว

      안녕하세요 keil 에서는 printf를 사용하는 방식이 TrueSTUDIO에서 사용하는 방식과 다릅니다. 구글에서 keil printf 로 검색해보시기 바랍니다! PUTCHAR_PROTOTYPE을 정의해주셔야 합니다.