Forum: Mikrocontroller und Digitale Elektronik STM32F3 Timer PWM


von Sebastian T. (sebastian_tsch)


Lesenswert?

Hi,

Ich versuche gerade auf einem STM32F303VCT6 den Timer2 in den PWM Mode 
zu bringen. Leider gibt mir PA1 kein Signal aus. Habe ich da was 
übersehen, ich habe mich an das Datenblatt (S. 627, 21.3.9) gehalten:

http://www.st.com/content/ccc/resource/technical/document/reference_manual/4a/19/6e/18/9d/92/43/32/DM00043574.pdf/files/DM00043574.pdf/jcr:content/translations/en.DM00043574.pdf

Mein Code:
1
#define osObjectsPublic                     // define objects in main module
2
#include "osObjects.h"                      // RTOS object definitions
3
#include "stm32f3xx.h"                  // Device header
4
5
6
long f_s = 8000000L;
7
volatile int b =0;
8
9
void initGPIO() {
10
    RCC->AHBENR = RCC_AHBENR_GPIOAEN;        //enable PORTA clock
11
    GPIOA->MODER = GPIO_MODER_MODER1_0;      //Timer2 Output
12
}
13
  
14
 void initTimers() {
15
   RCC->APB1ENR = RCC_APB1ENR_TIM2EN;                                  // Timer 2 clock Enable
16
   GPIOA->AFR[1] = 0;
17
   GPIOA->AFR[0] = (1<<4);                                            //AF1
18
   TIM2->ARR = 20;                                                     // Auto reload value -> reset Timer if Counter Register TIM2->CNT reaches TIM2_ARR
19
   TIM2->CCR1 = 40;                                                    //Duty Cycle for PWM -> 2*ARR -> active till ARR, LOW till CCR1
20
   TIM2->PSC = f_s/100000 - 1;                                         // f_counterClock = f_sys / (PSC + 1) -> choose f_counter = 100khz -> 0.01ms per count
21
   TIM2->CCMR1 = (1<<11)|(1<<12)|(1<<13)|(1<<14);                      //OC2PE -> enable preload register,PWM Mode 2 for channel 2 of Timer 2
22
   TIM2->EGR = (1<<TIM_EGR_UG);                                        //Update generation
23
   TIM2->CCER = (1<<TIM_CCER_CC2E);                                    //enable channel 2 output of timer 2
24
   TIM2->CR1 = 0;
25
   TIM2->CR2 = 0;
26
   TIM2->CR1 |= TIM_CR1_CEN;                                           // Enables Counter 
27
 }
28
 
29
//MAIN
30
 
31
int main (void) {
32
  osKernelInitialize ();                    // initialize CMSIS-RTOS
33
34
  // init
35
  initGPIO();
36
  initTimers();
37
  
38
  // threads
39
40
  osKernelStart ();                         // start thread execution 
41
}

Grüsse Sebastian

: Bearbeitet durch User
von Christopher J. (christopher_j23)


Lesenswert?

Sebastian T. schrieb:
> TIM2->CCER = (1<<TIM_CCER_CC2E);

Du schiebst hier zu weit ;)

Im Header sieht das so aus:
1
#define TIM_CCER_CC2E_Pos         (4U)                                         
2
#define TIM_CCER_CC2E_Msk         (0x1U << TIM_CCER_CC2E_Pos)
3
#define TIM_CCER_CC2E             TIM_CCER_CC2E_Msk

Also kannst du entweder

TIM2->CCER = 1 << TIM_CCER_CC2E_Pos

oder

TIM2->CCER = TIM_CCER_CC2E

machen. Das gleiche gilt für

> TIM2->EGR = (1<<TIM_EGR_UG);

wobei du das sowieso weglassen kannst, so lange du ARR und PSC nicht 
pufferst (Auto-reload preload).


Sebastian T. schrieb:
> GPIOA->MODER = GPIO_MODER_MODER1_0;      //Timer2 Output

Das muss du zu

GPIOA->MODER = GPIO_MODER_MODER1_1;

machen, weil du ja den GPIO auf "alternate function mode" konfigurieren 
willst, damit er auch mit dem Timer funzt. Im MODERy ist 0b01 GPIO 
output und 0b10 ist AF.

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.