Home » Post » STM » STM32F103 UART ADC 데이터 송신하기

STM32F103 UART ADC 데이터 송신하기

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

STM32F103 ADC Multi Channel 코드를 작성하는 예제입니다.

  1. ADC Multi Channel CUBEMX로 초기설정하기
  2. ADC Multi Channel 코드 작성하기
  3. CUBEMX로 ADC DMA 초기설정하기
  4. ADC DMA 코드 작성하기
  5. 코드 작성하기 – 인터럽트
  6. UART ADC 데이터 송신하기 (현재 포스팅)

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

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

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

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

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로 바꿔준다.

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

끗.

“STM32F103 UART ADC 데이터 송신하기”에 대한 2개의 생각

  1. ADC START를 While 안에다가 넣나요?
    루프 들어가기전에 최초 한번만 실행 시켜주면 되는게 아닌가요?

    1. 안녕하세요. Continuous Conversion이면 한번만 실행하면 됩니다. 그 이외의 경우에는 그렇지 않을 수도 있습니다. 직접 코드를 수정해보면서 실험해보시는 것이 좋을 듯 합니다.

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.