11-RNG-Library (STM32F4)

-mit dieser Library können Zufallszahlen erzeugt werden. Dazu wird das RNG-Modul der CPU benutzt.

-der Funktion zum erzeugen der Zufallszahl kann ein Wertebereich übergeben werden damit z.B. eine Zahl zwischen 50 und 100 ermittelt wird.

Beispielbild :

rng

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : RNG
Benutzte Librarys : keine

Funktionen :

1
2
void UB_Rng_Init(void);                                         // zum init des RNG-Moduls
uint32_t UB_Rng_makeZufall(uint32_t minwert, uint32_t maxwert); // zum erzeugen einer Zufallszahl zwischen min und max

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//--------------------------------------------------------------
// File     : main.c
// Datum    : 23.02.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der RNG-Library (Zufallszahlen)
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_led.h"
#include "stm32_ub_rng.h"
 
void Delay(volatile uint32_t nCount)
{
  while(nCount--)
  {
  }
}
 
int main(void)
{
  uint32_t zufall;
  uint32_t n;
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  UB_Rng_Init(); // Init der Zufallszahlen
  UB_Led_Init(); // Init der LEDs
 
  while(1)
  {
    // sucht eine Zufallszahl zwischen 3 und 8
    zufall=UB_Rng_makeZufall(3,8);
    // lässt die LED entsprechen oft blinken
    for(n=0;n<zufall;n++) {
      UB_Led_On(LED_GREEN);
      Delay(2500000);
      UB_Led_Off(LED_GREEN);
      Delay(5000000);
    }
    Delay(10000000);
  }
}

Hier die Library zum Download :

ub_stm32f4_rng_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_11_RNG

6 Antworten auf 11-RNG-Library (STM32F4)

  1. Chaoskind sagt:

    MoinMoin,

    ich versuche grad, deine RNG-lib zu benutzen, laufe dabei aber laufend in ein Problem rein. An und für sich läuft alles wie es soll, jedoch werden in gefühlten drei von fünf Fällen die Grenzen nicht beachtet, er gibt mir statt dessen 4.2949673E9 (maxwert für ein uint32???) aus.

    In meiner main führe ich UB_Rng_Init(); aus, um dann in meiner Funktion eine Variable mittels Wind = UB_Rng_makeZufall(0, 200) – 100; auf eine Zufallszahl zwischen -100…100 zu setzen. Meistens schafft er einen Durchlauf, manchmal auch zwei-drei während der er mir Werte innerhalb der Grenzen ausgibt. Danach gibt er dann den oben erwähnten Wert aus und bleibt hängen. Ab und an gibt er auch direkt als erstes den Wert aus und bleibt hängen. Ich hab jetzt schon ein paar mal versucht, alles einzeln durchzusteppen im Debugmodus, um einzugrenzen wo der Fehler auftritt, jedoch trat er so bisher nicht auf???

    Fällt dir dazu irgendein hilfreicher Tip ein?

    MfG Chaos

  2. Chaoskind sagt:

    Ich konnte den Fehler nun etwas eingrenzen. In der ub_rng läuft alles richtig, bis zum return(ret_wert); ist die Zahl innerhalb der Grenzen, aber nach dem Return steht meine Variable Wind dann auf den ominösen 4.2949673E9

  3. Chaoskind sagt:

    Fehler gefunden, es muss statt “Wind = UB_Rng_makeZufall(0, 200) – 100;” “Wind = UB_Rng_makeZufall(0, 200) – 100.0;” heißen.

  4. Cortex-Einsteiger sagt:

    Bist du dir sicher? Na Hauptsache es funktioniert.

    Du hast geschrieben, deine Variable “Wind” ist vom Typ uint32, also unsigned.
    Was passiert nun bei deinem Zufallsgenerator (0 bis 200) wenn eine Zahl kleiner 100 raus kommt und du dann noch -100 rechnest?
    Kommt mir komisch vor. Das würde dein extrem hohen Ausgabewert erkären, fast max. von 32 Bit.

  5. Chaoskind sagt:

    Nein nicht sicher :D , der Fhellertuefle (Fehlerteufel) hat sich eingeschlichen.
    Da fehlt noch der typecast, richtig muss es heißen:
    ““Wind = (float)UB_Rng_makeZufall(0, 200) – 100.0;”
    dann klappts auch mit zufälligem Wind ;-)

    MfG Chaos

    • admin_ub sagt:

      “float” ist an der Stelle aber etwas overkill ein cast auf “int16_t” würde es genauso tun.


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.