: C언어 표준 출력 함수
printf 를 하게 되면 일반적으로 콘솔창에 출력이 나온다.
리눅스를 보면 출력하는 곳을 바꾸는 방법이 있다
파일에 기록되게 할 수 있음
: 모듈이 UART 신호를 받아들여서 USB 형태로 전환해준다
이 모듈을 이용해서 UART로 printf 함수를 구현할 것이다
TX : 모듈이 데이터를 보냄
RX : 데이터를 받음
GND : TX,RX 신호의 기준선을 담당

모듈(3.3v) ----------- 보드(3.3v)
DTR
RX (수신부) ------ TX(송신부) PA9
TX (송신부) ------ RX(수신부) PA10
VCC (전원) : usb로 전원 입력
CTS
GND (그라운드) ---- GND

UART(Universal Asynchronous Receiver Transmit) : 비동기 모드로서 사용되는 시리얼 통신
USART(Universal Synchronus Receiver Transmit) : 동기모드로서 사용되는 시리얼 통신
동기모드 : 클럭을 사용함, 클럭과 데이터를 보내서 클럭을 기준으로 데이터를 읽을수 있다
비동기모드 : 클럽없이 시간에 맞춰서 데이터를 읽고 시작비트와 정지비트가 필요하다
baud rate : 115200 bits/s , 9600 bits/s
-> 9600 bits/s는 printf 가 너무 오래걸리므로 디버깅용으로는 별로다, 115200 bits/s 사용 권장
컴퓨터에서 Port5로 인식
x-shell 프로그램을 통해 Port5를 열어주고 포트로 오는 데이터를 화면에 뿌려줌
"Hello World"
모듈이 UART 신호를 받아들여서 USB 데이터 형태로 전환 해줌
PC에서는 USB 데이터를 받아서 컴퓨터에 뿌려줌
그 중간에는 드라이버가 있다
FTDI를 사용하려면 드라이버가 있어야 한다

PA9 - GND 오실로스코프로 찍어보기 : 파형확인
'h' : 1101000 과 같이 파형이 나옴
baudrate : 1초에 얼마나 많은 심볼을 전송하는 가
word length : 한 번 데이터 보낼 때 몇 비트 단위로 보내는가
parity : 오류 검출
stop bits : 정지 비트

char senddata[20] = "hello world\r\n";
while (1)
{
HAL_UART_Transmit(&huart1,senddata,strlen(senddata),1000);
HAL_Delay(1000);
}

그냥 printf 를 하면 아무 일도 일어나지 않음
표준출력을 바꿔야 함
# 기본 설정
int _write(int file, char * p, int len){
HAL_UART_Transmit(m_huart, (uint8_t *)p, len, 10);
return len;
}
printf 함수를 출력할 때 내부적으로 위 함수를 타고 들어옴
위 함수는 UART로 데이터를 보내겠다는 것임
아래에서 재정의 해줌으로서 UART로 printf 를 출력할 수 있게 됨
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
# 재정의 (m_huart -> &huart1)
int _write(int file, char * p, int len){
HAL_UART_Transmit(&huart1, (uint8_t *)p, len, 10);
return len;
}
/* USER CODE END 0 */
while (1)
{
printf("hello world printf!!\r\n");
HAL_Delay(1000);
}

디버깅용, 사용자 ui 용으로 사용함
전역에 선언하면 실시간으로 변하는 거 확인 가능
(정수는 가능, 실수는 조건이 필요하다)
typedef struct test{
int a;
int b;
int c;
}test;
test te;
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
...
/* USER CODE BEGIN WHILE */
te.a = 0;
te.b = 1;
te.c = 2;
while (1)
{
te.a++;
te.b++;
te.c++;
printf("============\r\n");
printf("a = %d\r\n",te.a);
printf("b = %d\r\n",te.b);
printf("c = %d\r\n",te.c);
printf("============\r\n");
HAL_Delay(1000);
}


: 링킹 옵션에 추가
파일의 properties - c/c++ build - settings - mcu gcc linker - miscellaneous
-u _printf_float 추가

float ff = 0.7;
while (1)
{
printf("============\r\n");
printf("a = %d\r\n",te.a);
printf("b = %d\r\n",te.b);
printf("c = %d\r\n",te.c);
printf("f = %f\r\n",ff);
printf("============\r\n");
