Forum: Mikrocontroller und Digitale Elektronik STM32: ADC mit Timer triggern (non-HAL).


von da1l6 (Gast)


Lesenswert?

Hallo zusammen

Ich versuche in einem bestehenden Firmware für den STM32G474 den ADC1 
periodisch per Timer zu triggern (bisher ging das per Software Trigger).

Dazu habe ich mir den TIM7 ausgesucht und wie folgt initialisiert:
1
TIM7->PSC = prescaler
2
TIM7->ARR = period_us;
3
TIM7->CR2 = TIM_CR2_MMS_1; //Trigger out on update
4
TIM7->CNT = 0;
5
TIM7->CR1 = TIM_CR1_CEN;

Setzte ich zusätzlich
1
TIM7->DIER |= TIM_DIER_UIE;
 wird der TIM7 Interrupt ausgelöst. Der Timer läuft also.

Den bestehenden ADC Code habe ich um die Zeile
1
ADC1->CFGR |= ADC_EXTERNALTRIG_T7_TRGO | ADC_CFGR_EXTEN_0;
 ergänzt.

Jedoch passiert nichts. Der ADC startet nicht. DR bleibt 0, keine 
Interrupts.

Setze ich, wie bisher, manuell
1
ADC1->CR |= ADC_CR_ADSTART;
 läuft der ADC einmalig und liefert Daten.

Was habe ich übersehen?


Grundsatzfrage: Im Reference Manual wird für ADC_CFGR_EXTSELx nur "Event 
0 - Event 31" geschrieben, aber ich finde nirgendwo eine Tabelle wo 
welches Event her kommt. Die Konstante ADC_EXTERNALTRIG_T7_TRGO habe ich 
auch dem HAL kopiert (ist 31).

Gibt es irgendwo eine Event Tabelle für den G474?


Grüße,
da1l6

von STM Apprentice (Gast)


Lesenswert?

da1l6 schrieb:
> Was habe ich übersehen?

Ich sehe nirgends die Schreibvorgänge zum Enablen der Clocks
(mindestens Timer und ADC, evtl. mehr, sollte zu allererst
passieren). Hältst du die geheim oder hast du sie vergessen?

von da1l6 (Gast)


Lesenswert?

STM Apprentice schrieb:
> da1l6 schrieb:
>> Was habe ich übersehen?
>
> Ich sehe nirgends die Schreibvorgänge zum Enablen der Clocks
> (mindestens Timer und ADC, evtl. mehr, sollte zu allererst
> passieren). Hältst du die geheim oder hast du sie vergessen?

Hallo,

Ja, Clocks sind aktiviert.

Timer:
1
RCC->APB1ENR1 |= RCC_APB1ENR1_TIM7EN;

ADC:
1
RCC->AHB2ENR |= RCC_AHB2ENR_ADC12EN;
2
MODIFY_REG(ADC12_COMMON->CCR, ADC_CCR_CKMODE_Msk, ADC_CCR_CKMODE_0|ADC_CCR_CKMODE_1);

Wie gesagt, sowohl ADC als auch Timer laufen für sich. Nur das Trigger 
Event geht nicht.

Grüße,
da1l6

von Johannes S. (Gast)


Lesenswert?

da scheint noch die Konfiguration der ClockSource zu fehlen. Habe das 
bisher nur mal mit CubeMX gemacht.
Das hier erfolgt noch nach der Timer BaseInit (MasterSlave enable ist 
vermutlich nicht nötig gewesen):
1
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
2
  TIM_MasterConfigTypeDef sMasterConfig = {0};
3
4
  /* USER CODE BEGIN TIM8_Init 1 */
5
6
  /* USER CODE END TIM8_Init 1 */
7
  htim8.Instance = TIM8;
8
  htim8.Init.Prescaler = 9;
9
  htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
10
  htim8.Init.Period = 199;
11
  htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
12
  htim8.Init.RepetitionCounter = 0;
13
  htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
14
  if (HAL_TIM_Base_Init(&htim8) != HAL_OK)
15
  {
16
    Error_Handler();
17
  }
18
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
19
  if (HAL_TIM_ConfigClockSource(&htim8, &sClockSourceConfig) != HAL_OK)
20
  {
21
    Error_Handler();
22
  }
23
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
24
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
25
  if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK)
26
  {
27
    Error_Handler();
28
  }

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.