Forum: Mikrocontroller und Digitale Elektronik STM32F030xx > TIMx->CCRx Register


von Jan H. (janiiix3)


Lesenswert?

Hallo,

ich bin gerade mal wieder am verzweifeln..
Nach dem Reset ist das Capture / Compare Modul als Ausgang gesetzt.
Das heißt man musste in dem o.g Register einen Wert laden können.

Laut CubeIDE Debugger passiert das aber nicht. Was habe ich nicht 
bedacht?.
1
void TIMERSetPreloadValue( TIM_TypeDef *pTim, TIMER_CHn_t eCHn, uint32_t uiPreloadValue )
2
{
3
  typedef struct
4
  {
5
    TIM_TypeDef   *pTim;
6
    TIMER_CHn_t    eCHn; // Wie viele COMP/CAP Channel hat TIMx
7
8
  }TIMER_PreloadCfg_t;
9
10
  TIMER_PreloadCfg_t TIMER_PreloadCfg[] =
11
  {
12
      { TIM1,   TIMER_CH_4},
13
      { TIM3,   TIMER_CH_4},
14
      { TIM14,   TIMER_CH_1},
15
      { TIM15,  TIMER_CH_2},
16
      { TIM16,  TIMER_CH_1},
17
      { TIM17,  TIMER_CH_1},
18
  };
19
20
  pTim->CCR1 = 0b111UL;
21
22
  for ( uint8_t i = 0; i < ( sizeof(TIMER_PreloadCfg) / sizeof(TIMER_PreloadCfg[0] ) ); i++ )
23
  {
24
    if ( pTim == TIMER_PreloadCfg[i].pTim )
25
    {
26
      if ( eCHn <= TIMER_PreloadCfg[i].eCHn )
27
      {
28
        pTim->CCR1 += ( 0x04 * eCHn );
29
        pTim->CCR1 = uiPreloadValue;
30
        break;
31
      }
32
    }
33
  }
34
35
}

Datenblatt: https://www.mouser.de/datasheet/2/389/dm00088500-1797910.pdf

: Bearbeitet durch User
von temp (Gast)


Lesenswert?

vergessen im RCC den Timer mit Takt zu versorgen?

Beitrag #6939730 wurde vom Autor gelöscht.
von Jan H. (janiiix3)


Lesenswert?

temp schrieb:
> vergessen im RCC den Timer mit Takt zu versorgen?

Clock läuft.
1
int main(void)
2
{
3
  __disable_irq();
4
5
  SysTick_Config( SystemCoreClock / 1000 );
6
  SystemCoreClockUpdate();
7
8
  GPIOInitPort( GPIOA ); // Taster: PA0
9
  GPIOInitPort( GPIOC ); // LED: PC8
10
11
  GPIOSelectPinMode( GPIOA, PIN_0, INPUT );
12
  GPIOSelectPinMode( GPIOC, PIN_8, OUTPUT );
13
  GPIOSelectPinMode( GPIOC, PIN_9, OUTPUT );
14
15
  TIMERBusClkOn( TIM1 );
16
  TIMERSetPrescaler( TIM1, 1600 );
17
  TIMERSetAutoReloadValue( TIM3, 500 );
18
  TIMERStart( TIM1 );
19
  TIMEREnableInterrupt( TIM1, TIMER_UPDATE_IRQ );
20
21
  TIMERSetPreloadValue( TIM1, 3, 4);
22
23
  NVIC_EnableIRQ( TIM1_CC_IRQn );
24
25
  __enable_irq();
26
27
  while(1)
28
  {
29
30
31
  }
32
}

von A. B. (Gast)


Lesenswert?

Jan H. schrieb:
> ich bin gerade mal wieder am verzweifeln..
> Nach dem Reset ist das Capture / Compare Modul als Ausgang gesetzt.
> Das heißt man musste in dem o.g Register einen Wert laden können.
>
> Laut CubeIDE Debugger passiert das aber nicht. Was habe ich nicht
> bedacht?.

Da zeigt der Debugger vmtl. Murks an, auf einem F030:
> mdw 0x40012C00 16
0x40012c00: 00000000 00000000 00000000 00000000 00000000 00000000 
00000000 00000000
0x40012c20: 00000000 00000000 00000000 0000ffff 00000000 00000000 
00000000 00000000

Wie man sieht, ist der Timer inaktiv, lediglich der Takt war via 
RCC_APB2ENR_TIM1EN eingeschaltet. Nun etwas ins CCR1 geschrieben:
> mww 0x40012C34 0xAEF7B439

Und danach kontrolliert:
> mdw 0x40012C00 16
0x40012c00: 00000000 00000000 00000000 00000000 00000000 00000000 
00000000 00000000
0x40012c20: 00000000 00000000 00000000 0000ffff 00000000 0000b439 
00000000 00000000

Die unteren 16 Bit sind also da, wie erwartet.

Beitrag #6939888 wurde vom Autor gelöscht.
von Jan H. (janiiix3)


Lesenswert?

Scheint wohl ein Anzeigefehler zu sein...

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.