Forum: Mikrocontroller und Digitale Elektronik STM32F4 ADC config


von gulli (Gast)


Lesenswert?

Hallo zusammen,

ich bekomme meinen SMT32F411RE leider nicht so configuriert, dass er den 
ADC-Wert an PC1 misst.

ich hoffe es kann jemand helfen...

_init_Hardware.c
1
SystemClock_Config(void)
2
{
3
    RCC_OscInitTypeDef RCC_OscInitStruct;
4
    RCC_ClkInitTypeDef RCC_ClkInitStruct;
5
6
    __HAL_RCC_PWR_CLK_ENABLE();
7
8
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
9
10
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
11
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
12
    RCC_OscInitStruct.HSICalibrationValue = 16;
13
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
14
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
15
    {
16
      Error_Handler();
17
    }
18
19
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
20
                                |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
21
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
22
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
23
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
24
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
25
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
26
    {
27
      Error_Handler();
28
    }
29
30
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
31
32
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
33
34
    /* SysTick_IRQn interrupt configuration */
35
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
36
}
37
38
void ConfigureADC(ADC_HandleTypeDef g_AdcHandle)
39
{
40
41
   GPIO_InitTypeDef gpioInit;
42
43
      __GPIOC_CLK_ENABLE();
44
      __ADC1_CLK_ENABLE();
45
46
      gpioInit.Pin = GPIO_PIN_1;
47
      gpioInit.Mode = GPIO_MODE_ANALOG;
48
      gpioInit.Pull = GPIO_NOPULL;
49
      HAL_GPIO_Init(GPIOC, &gpioInit);
50
51
      HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
52
         HAL_NVIC_EnableIRQ(ADC_IRQn);
53
54
         ADC_ChannelConfTypeDef adcChannel;
55
56
         g_AdcHandle.Instance = ADC1;
57
58
         g_AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2;
59
         g_AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;
60
         g_AdcHandle.Init.ScanConvMode = DISABLE;
61
         g_AdcHandle.Init.ContinuousConvMode = ENABLE;
62
         g_AdcHandle.Init.DiscontinuousConvMode = DISABLE;
63
         g_AdcHandle.Init.NbrOfDiscConversion = 0;
64
         g_AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
65
         g_AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
66
         g_AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
67
         g_AdcHandle.Init.NbrOfConversion = 1;
68
         g_AdcHandle.Init.DMAContinuousRequests = ENABLE;
69
         g_AdcHandle.Init.EOCSelection = DISABLE;
70
71
         HAL_ADC_Init(&g_AdcHandle);
72
73
         adcChannel.Channel = ADC_CHANNEL_11;
74
         adcChannel.Rank = 1;
75
         adcChannel.SamplingTime = ADC_SAMPLETIME_480CYCLES;
76
         adcChannel.Offset = 0;
77
78
         if (HAL_ADC_ConfigChannel(&g_AdcHandle, &adcChannel) != HAL_OK)
79
         {
80
             asm("bkpt 255");
81
         }
82
}

main.c
1
int main(int argc, char* argv[])
2
{
3
  ADC_HandleTypeDef g_AdcHandle;
4
  g_ADCValue = 0;
5
... 
6
  ConfigureADC(&g_AdcHandle);
7
  HAL_ADC_Start(&g_AdcHandle);
8
while (1)
9
  {
10
11
    if (HAL_ADC_PollForConversion(&g_AdcHandle, 100) == HAL_OK)
12
    {
13
      g_ADCValue = HAL_ADC_GetValue(&g_AdcHandle);
14
      g_MeasurementNumber++;
15
    }
16
my_printf("ADC %u\r\n", g_ADCValue);
17
}

von hp-freund (Gast)


Lesenswert?

Da fehlt aber noch etwas.

ADC_EXTERNALTRIGCONV_T1_CC1;
DMAContinuousRequests = ENABLE;

Wo wird Timer 1 eingestellt? Wo DMA?

Schau dir das in CubeMX an, dann wird vieles klarer.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.