임베디드/고추건조기

UART로 printf() 구현

twoweeks-within 2024. 11. 29. 04:25

리눅스에서 표준출력 바꾸는 방법 있음
printf > 파일에 기록되게 할 수 있다.

UART : 장치 관리자 > 포트 > usb serial port(com3)

3.3v 로 스위치 바꾸어 줘야함


모듈                  보드
DTR
RX (수신부) - 보드에서는 TX   (PA9), 60번
TX(송신부) - 보드에서는 RX (PA10) ,55번
VCC
CTS
GND //신호의 기준선

XShell5
세션만들기 > 프로토콜 :serial > serial 설정 : com3

STM32
char senddata[20]= "hello world\r\n"; // 엔터 하려면 \r\n

FTDI 모듈 > 컴퓨터 (드라이버)  >Port3 > xshell > hello world 


 오실로스코프
 start 1 data 8 (패리티비트) stop 1
   0                                 1
// 리틀 엔디안 방식 : 우 > 좌
//ex) " he " : 1101000 1100101
                : 0 00010110 1 0 10100110 1

리틀엔디안! 
    : 전송순서는 안바뀜, 각각의 data 저장 순서가 바뀜 
(전송순서) h -> e 
(저장순서) 0 0001011 1 0 1010011 1 


>> 비동기 방식이라 clock 이 없어서
   data 길이로만 판단해야하는데 구분이 쉽지않음


동기 방식 (클럭)  : SPI , USART
비동기 방식 (클럭x) : UART

동기: 클럭만을 따름 > 클럭마다 시간이 다르더라도
비동기: 시간만을 따름 ex) 115200 bit/s // 1초를 115200으로 나눔

printf 하는법

int _write(int file,char *p, int len){
HAL_UART_Transmit(&huart1, (uint8_t *)p,len,10);
return len;
}

_write 함수 , 반환 >문자열길이 (printf와 동일)


디버깅 >
 expressions : break point 걸면 실행마다 값 보임
live expressions : 실시간으로 보임 // 전역으로 선언 해야 보임
  > main 에 넣으면 스택으로 들어가기 때문에 실시간으로 보는데 문제있음
  >>전역에 함으로서 컴파일 단계에서 메모리를 따로 빼서 볼 수 있음 

// __attribute__((weak)) int _write(int file, char *ptr, int len)
   weak :  약한정의
    >  함수의 기본 구현을 제공 + 필요에 따라 해당 함수를 덮어쓸 수 있는 유연성을 확보.

실수까지 하려면
   속성 > c 빌드 > 셋팅 > mcu gcc linker > miscellaneous > 플래그 설정 > -u _printf_float //링커 옵션  

__attribute__((__format__(__printf__, 1, 2)))
 : 형식 지정자와 인수들이 올바르게 일치하는지 컴파일러가 확인하도록함.

'임베디드 > 고추건조기' 카테고리의 다른 글

FND 모듈제어  (0) 2024.12.01
LED 회로  (0) 2024.11.29
오실로스코프  (1) 2024.11.26
데이터시트 해석  (1) 2024.11.25
데이터 시트 보는법  (1) 2024.11.23