STM32f05 100kHz TIM_16 nur mit hardware ?

OP #3014518
Lesenswert?

Ich versuche ein 100kHz Signal mit dem Timer 16 des STM32f05
nur mit der Hardware zu erzeugen.

Soweit ich das verstanden habe soll das mit dem Output compare und der
Toggle option gehen.

Die Timebase und die OCStructur gelingt mir so zu konfigurieren das der 
Timer mit 100kHz laeuft. Das zu pruefen nehme ich die ISR her und wackle 
an den Pins.

Nur gelingt es mir nicht das der Timer selbst den Pin toggled ohne ISR.

Die Werte fuer die Frequenzen im aktuellen code haben nichts mit den 
100kHz zu tun das ist nur zum probieren.
1
static void setup_Timer16(void) {
2
  TIM_OCInitTypeDef  TIM_OCInitStructure;
3
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
4
  GPIO_InitTypeDef GPIO_InitStructure;
5

6
  // clock on Timer 16 enable
7
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16, ENABLE);
8

9
  // GPIOB clocks enable
10
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
11

12
  // GPIOB Configuration: Pin PB8 AF2 connecting to TIM16 Ch1
13
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
14
  GPIO_InitStructure.GPIO_Mode = /*GPIO_Mode_OUT*/GPIO_Mode_AF;
15
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
16
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
17
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
18
  GPIO_Init(GPIOB, &GPIO_InitStructure);
19

20
  // Connect TIM16 pins to AF2
21
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_2);
22

23
  TIM_DeInit(TIM16 );
24
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
25

26
  /* Time base configuration */
27
  TIM_TimeBaseStructure.TIM_Period = (SystemCoreClock / 50000/*lcd_Contrast*/) - 1;
28
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
29
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
30
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
31

32
  TIM_TimeBaseInit(TIM16, &TIM_TimeBaseStructure);
33

34
  // Timer output compare configuration
35
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
36
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
37
  TIM_OCInitStructure.TIM_OCMode = /*TIM_OCMode_Timing*/TIM_OCMode_Toggle;
38
  TIM_OCInitStructure.TIM_Pulse = 500;
39
  TIM_OC1Init(TIM16, &TIM_OCInitStructure);
40

41
/*
42
  NVIC_InitTypeDef nvic;
43
  nvic.NVIC_IRQChannel = TIM16_IRQn;
44
  nvic.NVIC_IRQChannelCmd = ENABLE;
45
  nvic.NVIC_IRQChannelPriority = 3;
46
  NVIC_Init(&nvic);
47

48

49
  TIM_ITConfig(TIM16, TIM_IT_CC1 | TIM_IT_Update, ENABLE);
50
*/
51

52
  /* TIM16 enable counter */
53
  TIM_Cmd(TIM16, ENABLE);
54

55
}

kann mir jemand sagen was da noch fehlt.

Ju
Gast #3014561
Lesenswert?

> (SystemCoreClock / 50000/*lcd_Contrast*/) - 1;

Dieser Ausdruck darf nicht kleiner sein als 500 (weil dein Zähler ja 
sonst gar nicht bis zum Vergleichswert zählt). Dies ist der Fall wenn 
dein Proz. zb. nur mit 24MHz läuft. Wie hoch ist denn dein Clock?
OP #3014581
Lesenswert?

Wie ich schon geschrieben habe, die Werte fuer die Frequenzen sind nicht 
mein Problem.
Das habe ich schon alles verstanden. Auch das mit dem Autoreload Preload 
etc. habe ich verstanden.

Im Programm selbst kann ich ARR und CCR1 per UART aendern, dazu muss 
aber der Autoreload und preload abgeschaltet sein.

Die Frequenz von 100kHz (mit dem ARR) und unterschiedliche Duty cycles 
(mit dem CCR1) bekomme ich ohne weiteres hin.

Mein Problem ist, wie bekomme ich das auf den PB8 Pin ohne eine ISR zu 
verwenden.

Ju

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