In the very first blinky example from the nRF52_SDK_0.9.1:
#include "stdint.h"
#include "stdint.h"
#include "nrf_delay.h"
#include "nrf_gpio.h"
#include "boards.h"
#include "nrf.h"
const uint8_t leds_list[LEDS_NUMBER] = LEDS_LIST;
/**
* @brief Function for application main entry.
*/
int main(void)
{
// Configure LED-pins as outputs.
LEDS_CONFIGURE(LEDS_MASK);
// Toggle LEDs.
while (true)
{
for (int i = 0; i < LEDS_NUMBER; i++)
{
LEDS_INVERT(1 << leds_list[i]);
nrf_delay_ms(500);
}
}
}
For this one:
LEDS_INVERT(1 << leds_list[i]);
In the board.h you could find the #define here:
#define LEDS_INVERT(leds_mask) do { uint32_t gpio_state = NRF_GPIO->OUT; \
NRF_GPIO->OUTSET = ((leds_mask) & ~gpio_state); \
NRF_GPIO->OUTCLR = ((leds_mask) & gpio_state); } while (0)
The first line means that, give the value in the OUT register of the GPIO to the variable gpio_state.
You could find the related #define in the nrf52.h and nrf51_to_nrf5.h
And these are the result I print out about the gpio_state value:
gpio_state is: 20060
gpio_state is: 60060
gpio_state is: e0060
gpio_state is: 1e0060
gpio_state is: 1c0060
gpio_state is: 180060
gpio_state is: 100060
gpio_state is: 60
gpio_state is: 20060
gpio_state is: 60060
...
Here is my question: which part of this function changes the value in the OUT register of GPIO?
Why it would be change like this way?
Thank you all.