Forum: Mikrocontroller und Digitale Elektronik STM32F4 ADC + TIM


von Sukzessive A. (sukapxconv)


Lesenswert?

Hey hey,

Möchte den ADC vom TIM2 triggern.
ADC+DMA in Continuous Mode funktioniert.
ADC in DISABLED Continuous beginnt nicht zu samplen.

Jemand eine Idee?

Danke !
1
/* Includes ------------------------------------------------------------------*/
2
3
#include "global.h"
4
5
/* Private typedef -----------------------------------------------------------*/
6
/* Private define ------------------------------------------------------------*/
7
#define BUFFER_SIZE 16
8
9
/* Private macro -------------------------------------------------------------*/
10
/* Private variables ---------------------------------------------------------*/
11
__IO uint16_t uhADCxConvertedValue[BUFFER_SIZE] = { 0, };
12
__IO uint32_t uwADCxConvertedVoltage = 0;
13
__IO uint8_t state = 0;
14
/* Private function prototypes -----------------------------------------------*/
15
/* Private functions ---------------------------------------------------------*/
16
17
void init_tim2() {
18
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
19
  TIM_OCInitTypeDef TIM_OCInitStructure;
20
  RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
21
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
22
  TIM_TimeBaseStructure.TIM_Period = 10;
23
  TIM_TimeBaseStructure.TIM_Prescaler = 4200 - 1;
24
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4;
25
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
26
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
27
28
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
29
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
30
  TIM_OCInitStructure.TIM_Pulse = 10;
31
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
32
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);
33
34
  TIM_Cmd(TIM2, ENABLE);
35
}
36
37
void init_dma(void) {
38
  DMA_InitTypeDef DMA_InitStructure;
39
40
  ADC_DeInit();
41
  DMA_DeInit(DMA2_Stream0);
42
43
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
44
45
  DMA_InitStructure.DMA_Channel = DMA_Channel_2;
46
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &ADC3->DR;
47
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) uhADCxConvertedValue;
48
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
49
  DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE;
50
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
51
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
52
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
53
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
54
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
55
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
56
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
57
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
58
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
59
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
60
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
61
  DMA_Cmd(DMA2_Stream0, ENABLE);
62
63
  DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
64
  NVIC_InitTypeDef NVIC_InitStructure;
65
  NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
66
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
67
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
68
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
69
  NVIC_Init(&NVIC_InitStructure);
70
}
71
72
void init_adc() {
73
  GPIO_InitTypeDef GPIO_InitStructure;
74
  ADC_InitTypeDef ADC_InitStructure;
75
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
76
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
77
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
78
79
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
80
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
81
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
82
  GPIO_Init(GPIOA, &GPIO_InitStructure);
83
84
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
85
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
86
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
87
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
88
  ADC_CommonInit(&ADC_CommonInitStructure);
89
90
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
91
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
92
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
93
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
94
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;
95
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
96
  ADC_InitStructure.ADC_NbrOfConversion = 1;
97
  ADC_Init(ADC3, &ADC_InitStructure);
98
99
  ADC_RegularChannelConfig(ADC3, ADC_Channel_1, 1, ADC_SampleTime_15Cycles);
100
101
  ADC_ExternalTrigInjectedConvConfig(ADC3, ADC_ExternalTrigConv_T2_CC2);
102
103
  ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
104
105
  ADC_DMACmd(ADC3, ENABLE);
106
107
  ADC_Cmd(ADC3, ENABLE);
108
}
109
110
int main(void) {
111
  SystemInit();
112
113
  init_uart2(38400);
114
  init_uart2_IT();
115
  ms_delay(3000);
116
117
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
118
  GPIO_InitTypeDef GPIO_InitStructure;
119
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
120
  GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_13;
121
  GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_14;
122
  GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_15;
123
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
124
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
125
  GPIO_Init(GPIOD, &GPIO_InitStructure);
126
127
  init_tim2();
128
  GPIO_SetBits(GPIOD, GPIO_Pin_12);
129
  char buffer[10];
130
  while (1) {
131
    putString("--\n", 3);
132
    GPIO_ToggleBits(GPIOD, GPIO_Pin_13);
133
    init_dma();
134
    init_adc();
135
    ADC_SoftwareStartConv(ADC3);
136
    state = 0;
137
    while (state == 0)
138
      ;
139
    GPIO_ToggleBits(GPIOD, GPIO_Pin_13);
140
    uint16_t i;
141
    for (i = 0; i < BUFFER_SIZE; i++) {
142
      uwADCxConvertedVoltage = uhADCxConvertedValue[i] * 3300 / 0xFFF;
143
      myitoa(uwADCxConvertedVoltage, buffer, 9);
144
      putString(buffer, 10);
145
      putString("\n", 3);
146
    }
147
148
    ms_delay(500);
149
  }
150
}
151
152
void DMA2_Stream0_IRQHandler() {
153
  DMA_ClearITPendingBit(DMA2_Stream0, DMA_FLAG_TCIF0);
154
  state = 1;
155
  GPIO_ToggleBits(GPIOD, GPIO_Pin_14);
156
}

von Sukzessive A. (sukapxconv)


Lesenswert?

Keiner eine Idee ?
Hab bestimmt nur ein Flag oder so vergessen.
Im Manual habe ich bisher auch noch nichts finden können :/

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.