Skocz do zawartości

Pomocna odpowiedź

Napisano

Witam,
zacząłem zabawę z STM32 i napotkałem problem przy generacji PWM. Siedzę nad tym już kilka dni i nie mogę znaleźć błędu w moim kodzie. Jeśli ktoś mógłby rzucić okiem i wskazać mi błąd będę bardzo wdzięczny 😃 Chciałem skorzystać z Timera 15 w trybie PWM1. Na płytce (zgodnie z linkiem - https://developer.mbed.org/platforms/ST-Nucleo-F303K8/) jest on wyposażony w jedną linię sprzętową znajdującą się w porcie A i numerze pinu 2. Dodam, iż płytka nie jest posiada zewnętrznego kwarcu więc pracuje z częstotliwością 8MHz.

#include "stm32f30x.h"
#include "stm32f30x_gpio.h"
#include "stm32f30x_tim.h"
#include "stm32f30x_rcc.h"

#include <stdio.h>
#include <stdint.h>


void InitTimer(int period){

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM15, ENABLE);

TIM_TimeBaseInitTypeDef timBase;
TIM_TimeBaseStructInit(&timBase);
timBase.TIM_Prescaler = 1024;
timBase.TIM_CounterMode = TIM_CounterMode_Up;
timBase.TIM_Period = period;
timBase.TIM_ClockDivision = TIM_CKD_DIV1;
//timBase.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM15, &timBase);

}

void InitPWM(int pulse)
{
   TIM_OCInitTypeDef pwm;
   TIM_OCStructInit(&pwm);
   pwm.TIM_OCMode = TIM_OCMode_PWM1;
   pwm.TIM_Pulse = pulse;
   pwm.TIM_OutputState = TIM_OutputState_Enable;
   pwm.TIM_OCPolarity = TIM_OCPolarity_High;

   TIM_OC1Init(TIM15, &pwm);
   TIM_OC1PreloadConfig(TIM15, TIM_OCPreload_Enable);

   GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_2);
}

void InitGpio()
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);
gpio.GPIO_Pin = GPIO_Pin_2;
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &gpio);
}


int main(void){

InitGpio();
InitTimer(1000);
InitPWM(800);
TIM_Cmd(TIM15, ENABLE);

   while(1){

   }
}

__________

Komentarz dodany przez: Treker

Sprawdź czy masz możliwość odblokowania zegara dla GPIOAF (tzn. coś w stylu RCC_*Periph_GPIOAF, nie pamiętam dokładnej nazwy), w zależności od rodziny to trzeba lub nie trzeba robić.

Dzięki za odpowiedź. Niestety nie znalazłem takiego metody czy odpowiedniego parametru. Dodam, że korzystałem już z AF w przypadku obsługi zewnętrznych przerwań. Program działał przy analogicznej konfiguracji GPIO

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...