Skip to main content
E. Ciurana
Associate
August 29, 2019
Question

STM32G0 conterpart for STM32F0's GPIO_SetBits ?

  • August 29, 2019
  • 3 replies
  • 1647 views

Hello there,

I am porting the implementation of a specific component that's currently working together with a STM32F0 to work with a STM32G0.

Most of the functions need to be changed from the old implementation to its STM32g0_ll_xyz.h counterpart, but I'm having difficulties with this one since I do not find any obvious homologous one.

So, assuming a have this line:

...
GPIO_SetBits(GPIOA, GPIO_Pin_15);
...

Any ideas?

This topic has been closed for replies.

3 replies

Mike_ST
ST Technical Moderator
August 29, 2019

It does not exist at LL layer.

With HAL you can do:

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);

Or just do that (faster):

write 1: GPIOA->BSRR = GPIO_PIN_15;

write 0: GPIOA->BRR = GPIO_PIN_15;

writing to ODR register can work too.

In order to give better visibility on the answered topics, please click on 'Best answer' on the reply which solved your issue or answered your question. 
E. Ciurana
Associate
August 29, 2019

Thank you very much, I'll take the faster approach and will answer here again once it is working :)

FredB
Associate
September 12, 2019

E. Ciurana,

Actually the LL equivalent you're looking for is this pair of functions:

LL_GPIO_SetOutputPin()

LL_GPIO_ResetOutputPin()

Just make sure to #include "stm32g0xx_ll_gpio.h" and you should be good to go. They're defined as __STATIC INLINE, so they should compile inline without any function call overhead, and be the exact equivalent of what Mike_ST suggested. For example, here's how the header defines LL_GPIO_SetOutputPin:

__STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)

{

 WRITE_REG(GPIOx->BSRR, PinMask);

}

I prefer the header version because in my opinion it's easier to read and intuitively understand...

LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_3)

...as opposed to reading...

GPIOA->BSRR = LL_GPIO_PIN_3

As I mentioned before, the nice thing is that the macro call (should) compile down to the exact same thing in your code. I say "should" because the "INLINE" keyword isn't a guarantee that code will actually be inlined. It's a suggestion to the compiler which it tries to honor, but there are times when it can't or won't.

FYI, the HAL library Mike_ST also suggested always compiles as a function call, and has an "if" conditional to determine if you want to set or clear a bit or bits. That is definitely more overhead for simple GPIO bit twiddling, without any advantage in readability of the LL version.