From ddd0312b1060114e47575f9e773d1162966fb239 Mon Sep 17 00:00:00 2001 From: Piotr Esden-Tempski Date: Wed, 14 Jan 2015 18:44:04 -0800 Subject: [PATCH] [stm32f429i-discovery] Added random blinking example. --- .../f4/stm32f429i-discovery/random/Makefile | 25 +++++ .../f4/stm32f429i-discovery/random/README | 12 +++ .../f4/stm32f429i-discovery/random/random.c | 96 +++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 examples/stm32/f4/stm32f429i-discovery/random/Makefile create mode 100644 examples/stm32/f4/stm32f429i-discovery/random/README create mode 100644 examples/stm32/f4/stm32f429i-discovery/random/random.c diff --git a/examples/stm32/f4/stm32f429i-discovery/random/Makefile b/examples/stm32/f4/stm32f429i-discovery/random/Makefile new file mode 100644 index 0000000..63583ce --- /dev/null +++ b/examples/stm32/f4/stm32f429i-discovery/random/Makefile @@ -0,0 +1,25 @@ +## +## This file is part of the libopencm3 project. +## +## Copyright (C) 2009 Uwe Hermann +## +## This library is free software: you can redistribute it and/or modify +## it under the terms of the GNU Lesser General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public License +## along with this library. If not, see . +## + +BINARY = random + +LDSCRIPT = ../stm32f429i-discovery.ld + +include ../../Makefile.include + diff --git a/examples/stm32/f4/stm32f429i-discovery/random/README b/examples/stm32/f4/stm32f429i-discovery/random/README new file mode 100644 index 0000000..472e6b5 --- /dev/null +++ b/examples/stm32/f4/stm32f429i-discovery/random/README @@ -0,0 +1,12 @@ +------------------------------------------------------------------------------ +README +------------------------------------------------------------------------------ + +This example randomly blinks the GREEN LED on the ST STM32F429IDISCOVERY eval +board. + +Board connections: +------------------ + + + diff --git a/examples/stm32/f4/stm32f429i-discovery/random/random.c b/examples/stm32/f4/stm32f429i-discovery/random/random.c new file mode 100644 index 0000000..8c0b2c7 --- /dev/null +++ b/examples/stm32/f4/stm32f429i-discovery/random/random.c @@ -0,0 +1,96 @@ +/* + * This file is part of the libopencm3 project. + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +#include +#include +#include +#include + +static void rcc_setup(void) +{ + rcc_clock_setup_hse_3v3(&hse_8mhz_3v3[CLOCK_3V3_120MHZ]); + + /* Enable GPIOG clock for onboard leds. */ + rcc_periph_clock_enable(RCC_GPIOG); + + /* Enable rng clock */ + rcc_periph_clock_enable(RCC_RNG); +} + +static void rng_setup(void) +{ + /* Enable interupt */ + /* Set the IE bit in the RNG_CR register. */ + RNG_CR |= RNG_CR_IE; + /* Enable the random number generation by setting the RNGEN bit in + the RNG_CR register. This activates the analog part, the RNG_LFSR + and the error detector. + */ + RNG_CR |= RNG_CR_RNGEN; +} + +static void gpio_setup(void) +{ + /* Setup onboard led */ + gpio_mode_setup(GPIOG, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, + GPIO13 | GPIO14); +} + +/* Tried to folow the guidelines in the stm32f4 user manual.*/ +static uint32_t random_int(void) +{ + static uint32_t last_value; + static uint32_t new_value; + + uint32_t error_bits = 0; + error_bits = RNG_SR_SEIS | RNG_SR_CEIS; + while (new_value == last_value) { + /* Check for error flags and if data is ready. */ + if (((RNG_SR & error_bits) == 0) && + ((RNG_SR & RNG_SR_DRDY) == 1)) { + new_value = RNG_DR; + } + } + last_value = new_value; + return new_value; +} + + +int main(void) +{ + int i, j; + rcc_setup(); + gpio_setup(); + rng_setup(); + + while (1) { + uint32_t rnd; + rnd = random_int(); + + for (i = 0; i != 32; i++) { + if ((rnd & (1 << i)) != 0) { + gpio_set(GPIOG, GPIO13); + } else { + gpio_clear(GPIOG, GPIO13); + } + /* Delay */ + for (j = 0; j != 5000000; j++) { + __asm__("nop"); + } + } + } +}