2017-01-11 350 views
1

我是STM32(L476RG)的新用户。到目前为止,我已经完成了一些Arduino的工作。现在,我想读取ADC值并通过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变量是uint32_t或至少uin16_t为一体的return valueHAL_ADC_GetValueuint32_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)返回这是一个uint32_t*所以应该传递给HAL_UART_Transmit时浇铸uint8_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