LED toggeln und GPIO-Clock aktivieren/deaktivieren

In diesem Beispiel wird die blaue LED am Discovery Board mit dem XOR-Operator getoggelt. In den ersten Programmzeilen wird auch gezeigt, wie der Takt am GPIO port D aktiviert und deaktiviert wird.

/* This examble shows how to enable and disable peripheral clocks and toggle a LED with the XOR Operator ^
 * Over the last time, dramatically lowering current draw has been a goal for most microcontroller manufacturers.
 * One of the techniques used to achieve this is to switch off on-chip peripherals by removing access to their master clocks.
 * On the STM32 devices, these clocks are known as the hardware and peripheral clocks and are controlled by the RCC
 * (Reset and Clock Control) group of registers. Since there are more than 32 on chip peripherals, there are actually
 * two registers used to switch on a clock: RCC_AHB1ENR and RCC_AHB2ENR.
 * The clock is controlled by set/reset registers, so to turn a system on you set a bit in the ENR register, and to turn
 * that same peripheral off you set the bit in the corresponding RCC_AHBxRSTR register.
 * Go and have a read of the register descriptions now, they start on section 5.3 of the STM32F4 Reference Manual.
 * To switch the clock for GPIOD on and off, we do something like this:

#include <stm32f4xx.h>

int main(void)
	int i;

	RCC -> AHB1ENR |= RCC_AHB1ENR_GPIODEN;		// Enable CLK for PortD in peripheral clock register (RCC_AHB1ENR)
	RCC -> AHB1ENR |= RCC_AHB1RSTR_GPIODRST;	// Disable CLK for PortD in peripheral clock register (RCC_AHB1RSTR) to reduce power consumption

    GPIOD -> MODER |= (1<<30);  // Set pin 15 (blue LED)to be general purpose output in GPIO port mode register
    GPIOD -> ODR |= (1<<15);    // Turn GPIOD pin15 (blue LED) ON in GPIO port output data register

    	GPIOD -> ODR ^= (1<<15);		// Toggle the LED
    	for (i = 0; i < 1000000; ++i);	// delay

/* mit dem Dereferenzierungsoperator -> wird auf die Member der jeweiligen Struktur zugegriffen!
 * Hier ein Beispiel einer Struktur aus der Headerdatei stm32f4xx.h:
 * stm32f4xx.h:
 * .....
 * .....
 *	typedef struct
 * 	{
 *   __IO uint32_t MODER;    //!< GPIO port mode register,               Address offset: 0x00
 *   __IO uint32_t OTYPER;   //!< GPIO port output type register,        Address offset: 0x04
 *   __IO uint32_t OSPEEDR;  //!< GPIO port output speed register,       Address offset: 0x08
 *   __IO uint32_t PUPDR;    //!< GPIO port pull-up/pull-down register,  Address offset: 0x0C
 *   __IO uint32_t IDR;      //!< GPIO port input data register,         Address offset: 0x10
 *   __IO uint32_t ODR;      //!< GPIO port output data register,        Address offset: 0x14
 *   __IO uint16_t BSRRL;    //!< GPIO port bit set/reset low register,  Address offset: 0x18
 *   __IO uint16_t BSRRH;    //!< GPIO port bit set/reset high register, Address offset: 0x1A
 *   __IO uint32_t LCKR;     //!< GPIO port configuration lock register, Address offset: 0x1C
 *   __IO uint32_t AFR[2];   //!< GPIO alternate function registers,     Address offset: 0x20-0x24
 *	} GPIO_TypeDef;
 * .....
 * .....
 * #define GPIOD	((GPIO_TypeDef *) GPIOD_BASE)
 * Der Strukturzugriff erfolgt dann z.B. über GPIOD -> ODR