2019-08-29 01:25 AM
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?
2019-08-29 02:15 AM
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.
2019-08-29 02:37 AM
Thank you very much, I'll take the faster approach and will answer here again once it is working :)
2019-09-11 10:05 PM
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.