2017-01-11 1 views
1

Je suis un nouvel utilisateur de STM32 (L476RG) .J'ai fait un peu de travail avec Arduino jusqu'à maintenant. Maintenant, je veux lire la valeur ADC et transmettre cette valeur avec UART. Je configure la partie matérielle et la partie de configuration logicielle initiale. Je veux savoir, cette partie du code dans la boucle while est correcte?STM32, lecture de valeurs ADC et transmission à l'aide d'UART (bibliothèque 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); 
} 

Répondre

1

En supposant que vous appelez HAL_ADC_Start(&hadc1) avant d'entrer dans la boucle while. Fondamentalement, il est OK de vous appeler du code dans une boucle while, mais j'ai quelques remarques.

Assurez-vous que la variable ADCValue est uint32_t ou au moins uin16_t comme return value de HAL_ADC_GetValue est uint32_t. Si la résolution de l'ADC est supérieure à 8 bits, 1 octet ne sera pas suffisant pour stocker le résultat.

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

Le HAL_UART_Transmit attend un uint8_t* comme second paramètre, étant donné votre code, vous passez une variable simple. Vous devez utiliser l'opérateur & avant ADCValue et le convertir en uint8_t*. En outre, il envoie seulement 1 octet dans votre code, basé sur le troisième paramètre. Si ADCValue est uint32_t alors vous devez modifier ce paramètre à 4. Notez également que vous envoyez une valeur d'octet brut et non ASCII. Dans l'ensemble:

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) renvoie l'adresse de ADCValue qui est un uint32_t* il devrait donc être casté en uint8_t* lors du passage à HAL_UART_Transmit. Et comme un uint32_t est de 4 octets, troisième paramètre devrait être 4.

Si vous souhaitez envoyer le str, vous devez calculer sa longueur correcte avant de l'envoyer. Par ailleurs, voici un exemple ADC à partir de ce 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

Merci pour votre commentaire. Maintenant, je lis la valeur adc, mais quand j'ai utilisé IF Statement dans l'exemple de code, la valeur ADC n'a pas été lue. Pouvez-vous expliquer la fonction de HAL_ADC_PollForConversion()? – king