Home > database >  STM32f401xB/C - no PWM signal on PA15
STM32f401xB/C - no PWM signal on PA15

Time:01-21

I have a STM32F401xB/C board.

I am trying to create a PWM signal for my DC motors. I have followed this tutorial and seem to understand the code.

https://ruturajn.hashnode.dev/generating-pwm-pulses-on-the-stm32f407-for-servo-motor-control-using-bare-metal-programming

But after I change the pin I want the PWM output from I get no signal. The tutorial refrences the PA5 pin, which works, but PA15 does not work even though it is connected to the same timer TIM2 and channel.

Any idea?

This is my code:

//initialises the GPIO pins
void GPIO_Init(){
  //give and clock to the GPIOB and GPIOA device
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;

  //THESE PINS ARE THE PWM DRIVERS
  //PA15
  //set alternative mode
  GPIOA->MODER &= ~(GPIO_MODER_MODER15_1);  
  GPIOA->MODER |=   GPIO_MODER_MODER15_1;   

  //low part of the alternate function register
  GPIOA->AFR[1] |= GPIO_AFRH_AFSEL15_0;
}


//initialise the TIM2 timer device
void TIM2_Init(){
  //give pwr and clk to TIM2 device
  RCC->AHB1ENR |= RCC_APB1ENR_TIM2EN;
  
  //set prescaler to 1Mhz = 1 microSeconds
  TIM2->PSC = 16-1;

  //total period of the timer = 20ms
  TIM2->ARR = 20000;

  //set counter to 0
  TIM2->CNT = 0;

  //set capture/compare mode register 1 to PWM Mode 1
  TIM2->CCMR1 = 0x0060;

  //set capture/compare enable register to output on chanel 1
  TIM2->CCER |= 1;

  //set >50% power
  TIM2->CCR1 = 10000;
}




void setup(){
  //set the timer to 16 mhz
  RCC->CFGR |= 0 << 10;

  GPIO_Init();
  TIM2_Init();

  //start TIM2 timer
  TIM2->CR1 |= 1;
}

CodePudding user response:

This only clears a single bit

  //set alternative mode
  GPIOA->MODER &= ~(GPIO_MODER_MODER15_1);  
  ...

Should be

  GPIOA->MODER &= ~(GPIO_MODER_MODE15_Msk);  
  ...

PA15 is shared with JTDI and could have external interference.

By default it has pull-up enabled, that should be cleared if this pin is used as an output.

CodePudding user response:

The problem was that I was not setting the clock and power properly for the clock. The register I should have checked is RCC->APB1ENR instead of RCC->AHB1ENR. The fact that I got power through PA5 was a coincidence.

  • Related