STM32F030xx > TIMx->CCRx Register

OP #6939674
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
Beitrag #6939730 wurde von einem Moderator gelöscht.
OP #6939734
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
}
Gast #6939874
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 von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren