STM32F103 UART ADC 데이터 송신하기

STM32F103 UART ADC 데이터 송신하기

STM32F103 UART ADC 데이터 송신하기 예제

아마도 이전 글까지 읽으신 분들은 의문이 있으리라.

UART로 데이터를 송신하는 것은 고정된(Static) 데이터이다보니까, 사용자가 알 수 없는 아날로그 데이터는 어떻게 송신할 것인지 궁금했을 것이다.

결국 이 의문을 해결하기 위해서는 어떠한 코드나, 설정을 추가해야한다는 결론에 이른다.

코드를 추가하는 것은 같겠지만, 사용하는 컴파일러에 따라 별도 설정이 필요한 경우가 있다.

ADC를 사용하는 방법은 [이 링크]를 참고해서 설정해주길 바란다.

시리얼 데이터를 송신하는 코드를 알고 싶다면 [이 링크]를 참고해 주길 바란다.

데이터를 uint16_t ADC_data;로 선언하고, ADC1에서 데이터를 수신했다고 가정한다면 아래와 같이 코드를 작성할 수 있을 것이다.

ADC_data = HAL_ADC_GetValue(&hadc1);

그러면 이 데이터를 어떻게 송신 할 것인지가 문제인데, 때마침 printf를 차용한 함수가 하나 있다.

sprintf(buffer, “%d \r\n”, ADC_data);

이 의미는 “%d \r\n”의 값을 buffer의 주소에 삽입하겠다는 의미인데, buffer는 8비트의 데이터 집단이라고 볼 수 있다.

흔히 글자를 입력할 때 사용하는 데이터형은 char를 많이 사용하는데, 아스키코드를 사용하는 사람이라면 흔히 알 수 있을 것이다.

따라서 main문에 uint8_t 타입으로 buffer를 선언해주면된다. 문자열이 1개가 아닌 경우가 많으므로 배열로 길이를 설정해 줄 필요가 있다. 나는 넉넉히 256개의 문자를 저장할 수 있게 하고 싶어서 아래와 같이 선언했다.

uint8_t buffer[256];

정리하면 아래와 같다.

  1. buffer 와 ADC_data를 선언한다.
  2. ADC_data에 데이터를 넣는다.
  3. sprintf로 데이터를 문자열로 변환 후 buffer에 넣어준다.
  4. UART로 전송한다.
int main(void)
 { 
     uint8_t buffer[256]; 
     uint16_t ADC_data;
     
     ...
     while(1){
      	  HAL_ADC_Start(&hadc1);
	  ADC_data = HAL_ADC_GetValue(&hadc);
	  sprintf(buffer,"%d \r\n", ADC_data);
	  HAL_UART_Transmit(&huart2,buffer,strlen(buffer),100);
     }

uVision을 쓰는 사람이라면 문제가 없이 돌아가겠지만, TrueSTUDIO를 사용하는 사람이라면 안돌아 갈 가능성이 매우 크다. 이 경우 두 가지의 설정을 해주어야 한다.

부록 : 트루 스튜디오 부가 설정하기

트루 스튜디오의 프로젝트 탐색기에서 기타 버튼을 눌러 라이브러리를 하나 추가해야한다.

기타 버튼을 눌렀다면 Tiny printf implementation 라이브러리를 추가해줘야한다.

추가를 했다면 이제 프로젝트 설정을 해줘야한다.

프로젝트 탐색기가 선택된 상태에서 Alt + Enter를 눌러 프로젝트 특성을 켠다.

이제 C/C++ Build에서 Settings를 선택한다음 Tool Settings-General의 런타임 라이브러리를 Newlib standard로 바꿔준다.

그 다음 디버깅을 하면 코드가 돌아갈 것이다.

끗.

댓글 남기기

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d 블로거가 이것을 좋아합니다: