2017-01-11 8 views
1

저는 STM32 (L476RG)의 새로운 사용자입니다. 지금까지 Arduino에 대한 연구를 해보았습니다. 이제 ADC Value를 읽고이 값을 UART로 전송하고 싶습니다. 설치 하드웨어 부분과 초기 소프트웨어 구성 부분. while 루프의 코드 부분이 정확한지 알고 싶습니다.STM32, ADC 값 읽기 및 UART (HAL 라이브러리)를 사용한 전송

if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK) 
{ 
    ADCValue = HAL_ADC_GetValue(&hadc1); 
    sprintf(str, "%d", ADCValue); 
    HAL_UART_Transmit(&huart2,ADCValue,1,100); 
} 

답변

1

while 루프를 입력하기 전에 HAL_ADC_Start(&hadc1)을 호출한다고 가정합니다. 기본적으로 코드를 while 루프로 호출하는 것이 좋지만 몇 가지 언급이 있습니다.

ADCValue 변수가 return value HAL_ADC_GetValueuint32_t 인의 같은 uint32_t 또는 적어도 uin16_t 있는지 확인합니다. ADC의 해상도가 8 비트 이상이면 1 바이트로 결과를 저장할 수 없습니다.

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); 

HAL_UART_Transmit은 간단한 변수를 전달 코드 부여, 두 번째 매개 변수로 uint8_t* 기대하고있다. ADCValue 전에 & 연산자를 사용하고 uint8_t*으로 전송해야합니다. 또한 세 번째 매개 변수를 기반으로 코드에서 1 바이트 만 보냅니다. ADCValueuint32_t이면이 매개 변수를 4로 수정해야합니다. 또한 ASCII가 아닌 원시 바이트 값을 보냅니다. 모두 모두 :

uint32_t ADCValue; 

if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK) 
{ 
    ADCValue = HAL_ADC_GetValue(&hadc1); 
    sprintf(str, "%d", ADCValue); 
    HAL_UART_Transmit(&huart2, (uint8_t*)(&ADCValue), 4, 100); 
} 

(&ADCValue)HAL_UART_Transmit에 전달할 때 그래서 uint8_t*로 주조한다 uint32_t*입니다 ADCValue의 주소를 반환합니다. uint32_t이 4 바이트이면 세 번째 매개 변수는 4 여야합니다.

str을 보내려면 보내기 전에 올바른 길이를 계산해야합니다.

여기 ADC의 예가 STM32 HAL ADC Tutorial입니다.

uint32_t g_ADCValue;  
int g_MeasurementNumber; 


int main(void) 
{ 
    HAL_Init(); 
    SystemClock_Config(); 
    ConfigureADC(); 

    HAL_ADC_Start(&g_AdcHandle); 
    for (;;) 
    { 
     if (HAL_ADC_PollForConversion(&g_AdcHandle, 1000000) == HAL_OK) 
     { 
      g_ADCValue = HAL_ADC_GetValue(&g_AdcHandle); 
      g_MeasurementNumber++; 
     } 
    } 
} 
+0

의견을 보내 주셔서 감사합니다. 이제 adc 값을 읽었지만 샘플 코드에서 IF 문을 사용하면 ADC 값을 읽을 수 없습니다. HAL_ADC_PollForConversion()의 기능을 설명 할 수 있습니까? – king