STM32 - Puls HIGH von Beginn an und bei CCR auf LOW

OP #7241286
Hi,

Ich kämpfe gerade mit einem einfacheren Problem auf einem STM32F446RE 
(https://www.st.com/resource/en/reference_manual/rm0390-stm32f446xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf).

Ich möchte einen Single Puls Timer starten, der direkt beim Start den 
Ausgang auf High setzt und dann bei CCR2 den Ausgang permanent auf low 
setzt. Das Problem ist jetzt, dass wenn ich CCR2 = 0 setze, mir der 
Ausgang immer auf HIGH bleibt und bei CCR2 = 1 gibt es mir nur einen 
kurzen Puls.

Was ich gemacht habe:

Timer Init (CLK ist extern und läuft sauber):
1
static void MX_TIM3_Init(void)
2
{
3

4
  /* USER CODE BEGIN TIM3_Init 0 */
5

6
  /* USER CODE END TIM3_Init 0 */
7

8
  TIM_SlaveConfigTypeDef sSlaveConfig = {0};
9
  TIM_MasterConfigTypeDef sMasterConfig = {0};
10
  TIM_IC_InitTypeDef sConfigIC = {0};
11
  TIM_OC_InitTypeDef sConfigOC = {0};
12

13
  /* USER CODE BEGIN TIM3_Init 1 */
14

15
  /* USER CODE END TIM3_Init 1 */
16
  htim3.Instance = TIM3;
17
  htim3.Init.Prescaler = 1;
18
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
19
  htim3.Init.Period = 50;
20
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
21
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
22
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
23
  {
24
    Error_Handler();
25
  }
26
  if (HAL_TIM_IC_Init(&htim3) != HAL_OK)
27
  {
28
    Error_Handler();
29
  }
30
  if (HAL_TIM_OC_Init(&htim3) != HAL_OK)
31
  {
32
    Error_Handler();
33
  }
34
  if (HAL_TIM_OnePulse_Init(&htim3, TIM_OPMODE_SINGLE) != HAL_OK)
35
  {
36
    Error_Handler();
37
  }
38
  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;
39
  sSlaveConfig.InputTrigger = TIM_TS_TI1F_ED;
40
  sSlaveConfig.TriggerFilter = 1;
41
  if (HAL_TIM_SlaveConfigSynchro(&htim3, &sSlaveConfig) != HAL_OK)
42
  {
43
    Error_Handler();
44
  }
45
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC2REF;
46
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
47
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
48
  {
49
    Error_Handler();
50
  }
51
  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
52
  sConfigIC.ICSelection = TIM_ICSELECTION_TRC;
53
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
54
  sConfigIC.ICFilter = 0;
55
  if (HAL_TIM_IC_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
56
  {
57
    Error_Handler();
58
  }
59
  sConfigOC.OCMode = TIM_OCMODE_TIMING;
60
  sConfigOC.Pulse = 0;
61
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
62
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
63
  if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
64
  {
65
    Error_Handler();
66
  }
67
  /* USER CODE BEGIN TIM3_Init 2 */
68

69
  /* USER CODE END TIM3_Init 2 */
70
  HAL_TIM_MspPostInit(&htim3);
71

72
}

Dann starte ich den Timer mit:
1
  TIM3->CNT = 0;
2
  TIM3->CCR2 = 0;
3
  TIM3->ARR = 50;
4
  HAL_TIM_Base_Start(&htim3); //Start Encoder Timer
5
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);

Denn Reset triggere ich mit
1
      TIM3->CR1 &= ~TIM_CR1_CEN; //This re-enables the One-Shot Timer
2
      TIM3->CNT = 0;
3
      TIM3->CCR2 = 0;
4
      TIM3->ARR = 50;
5
      TIM3->CR1 |= TIM_CR1_CEN;

Jemand eine Idee, wie man das hinbekommt?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.