Hallo Robotianer,
ich sitze seid einigen Tagen an der Programmierung eines STM32F103ZET6. Gleich zu Anfang: Ich habe bisher lediglich mit den Atmel Mega Controllern gearbeitet. Ich versuche mich gerade etwas in diesen Controller einzuarbeiten. Aufgabe ist es einen .wav Player zu realisieren, welcher sich Daten von einer mikroSD Karte holt und diese per DMA an einen PWM Ausgang schiebt. Ich weiß leider nicht mal ob das möglich ist.
Kann das vielleicht jemand beantworten.
Grund: Der Kern sollte minimal belastet werden.
Aber fangen wir mal am Anfang an. Im Moment versuche ich ein PWM zu generieren, erhalte aber irgend welchen Mist auf dem Oszi.
Code:
//vardef
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInit;
NVIC_InitTypeDef NVIC_Init_T4;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
//init
//Ports:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//Timerbasis
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 0x003E8;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//Compareregister / PWM
TIM_OCInit.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInit.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInit.TIM_OutputNState = ENABLE;
TIM_OCInit.TIM_Pulse = 0x09C4;
TIM_OCInit.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInit.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInit.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInit.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OC1Init(TIM4, &TIM_OCInit);
//???
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM_BDTRInitStructure.TIM_DeadTime = 117;
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM4, &TIM_BDTRInitStructure);
TIM_Cmd(TIM4, ENABLE);
TIM_CtrlPWMOutputs(TIM4, ENABLE);
Ich nutze hierzu die Libs von ST. Leider ist die Beschreibung etwas spärlich oder hat jemand so etwas wie eine Dokumentation gefunden?
Außerdem fehlt mir noch ein Gesammtdatenblatt in dem alle Register des Controllers sowie der Controller ansich beschrieben wird. (Eben so wie bei Atmel) Leider habe ich bisher nur Teildatenblätter gefunden.
PS: kann mir jemand erklären was ich da oben eigentlich alles gemacht habe?
Ich hab das noch nicht so ganz raus.
Kennt jemand ein Turtorial über den STM32. Hier gab es ja echt ein klasse Atmel Turtorial. Über den STM32 habe ich leider relativ wenig gefunden.
Was ich noch nicht ganz verstehe. Wofür sind die channels? Kann man da mehrere Pins an den PWM hängen? Wenn ja wie?
Über links und Hilfen jeder Art freue ich mich sehr.
Ich muss die ersten Voruntersuchungen bis nächste Woche fertig haben...
Lesezeichen