STM32F103 UART ADC 데이터 송신하기 예제
STM32F103 ADC Multi Channel 코드를 작성하는 예제입니다.
- ADC Multi Channel CUBEMX로 초기설정하기
- ADC Multi Channel 코드 작성하기
- CUBEMX로 ADC DMA 초기설정하기
- ADC DMA 코드 작성하기
- 코드 작성하기 – 인터럽트
- 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];
정리하면 아래와 같다.
- buffer 와 ADC_data를 선언한다.
- ADC_data에 데이터를 넣는다.
- sprintf로 데이터를 문자열로 변환 후 buffer에 넣어준다.
- 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를 사용하는 사람이라면 안돌아 갈 가능성이 매우 크다. 이 경우 두 가지의 설정을 해주어야 한다.
부록 : 트루 스튜디오 부가 설정하기
트루 스튜디오의 프로젝트 탐색기에서 기타 버튼을 눌러 라이브러리를 하나 추가해야한다.
![](https://i2.wp.com/dkeemin.com/wp-content/uploads/2019/03/image-1.png?fit=640%2C342&ssl=1)
기타 버튼을 눌렀다면 Tiny printf implementation 라이브러리를 추가해줘야한다.
![](http://dkeemin.com/wp-content/uploads/2019/03/image-2.png)
추가를 했다면 이제 프로젝트 설정을 해줘야한다.
프로젝트 탐색기가 선택된 상태에서 Alt + Enter를 눌러 프로젝트 특성을 켠다.
![](https://i0.wp.com/dkeemin.com/wp-content/uploads/2019/03/image-3.png?fit=640%2C427&ssl=1)
이제 C/C++ Build에서 Settings를 선택한다음 Tool Settings-General의 런타임 라이브러리를 Newlib standard로 바꿔준다.
그 다음 디버깅을 하면 코드가 돌아갈 것이다.
끗.
ADC START를 While 안에다가 넣나요?
루프 들어가기전에 최초 한번만 실행 시켜주면 되는게 아닌가요?
안녕하세요. Continuous Conversion이면 한번만 실행하면 됩니다. 그 이외의 경우에는 그렇지 않을 수도 있습니다. 직접 코드를 수정해보면서 실험해보시는 것이 좋을 듯 합니다.