Libs for using Nucleo STM32F411 periphery
Introduction
Descruption: This lib uses the hardware peripherie from STM32F411 under serveral conditions. So you can use an quadraturencoder with different timers.
Requirement: Only tested with the nucleo F411. Include the mbed lib! Interfacing details are explained in the documentary of each class.
Overview
- timer modules
- Quadratur Encoder (Version 1.2 - C. Hoyer 12.8.2015)
- SPI modules
- AD5664 (Version 1.1 - C. Hoyer 23.7.2015)
- software modules
- Ringbuffer (Version 0.9 - C. Hoyer 18.8.2015)
- PID-Regler (Version 1.0 - C. Hoyer 17.9.2015)
SWModule/RingBuffer.cpp@0:1acdcc576936, 2016-11-28 (annotated)
- Committer:
- ChrisselH
- Date:
- Mon Nov 28 17:27:43 2016 +0000
- Revision:
- 0:1acdcc576936
port from priv lib
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ChrisselH | 0:1acdcc576936 | 1 | #include "mbed.h" |
ChrisselH | 0:1acdcc576936 | 2 | #include "RingBuffer.h" |
ChrisselH | 0:1acdcc576936 | 3 | |
ChrisselH | 0:1acdcc576936 | 4 | //==================================================================================================================================== |
ChrisselH | 0:1acdcc576936 | 5 | // Konstruktor und Schreib/Lese Funktionen |
ChrisselH | 0:1acdcc576936 | 6 | //==================================================================================================================================== |
ChrisselH | 0:1acdcc576936 | 7 | |
ChrisselH | 0:1acdcc576936 | 8 | RingBuffer::RingBuffer(const int size){ |
ChrisselH | 0:1acdcc576936 | 9 | |
ChrisselH | 0:1acdcc576936 | 10 | buffer_size = size; // Ringbuffergröße festlegen |
ChrisselH | 0:1acdcc576936 | 11 | buffer.data = new uint32_t [size]; // Setzt die Dimension des Daten Arrays |
ChrisselH | 0:1acdcc576936 | 12 | buffer.status = new uint8_t [size]; // Setzt die Dimension des Status Arrays |
ChrisselH | 0:1acdcc576936 | 13 | buffer.status[0] = 0x00; // Kein Status vorhanden bei Beginn |
ChrisselH | 0:1acdcc576936 | 14 | |
ChrisselH | 0:1acdcc576936 | 15 | extfct = false; // Externe Funktion bei fast vollem Buffer |
ChrisselH | 0:1acdcc576936 | 16 | bufferfull = false; // Buffer ist voll, kein Schreiben möglich |
ChrisselH | 0:1acdcc576936 | 17 | bufferempty = true; // Buffer ist leer, kein Lesen möglich |
ChrisselH | 0:1acdcc576936 | 18 | read_pointer = 0; // Lesezeiger auf Null setzen |
ChrisselH | 0:1acdcc576936 | 19 | write_pointer = 0; // Schreibezeiger auf Null setzen |
ChrisselH | 0:1acdcc576936 | 20 | |
ChrisselH | 0:1acdcc576936 | 21 | } |
ChrisselH | 0:1acdcc576936 | 22 | |
ChrisselH | 0:1acdcc576936 | 23 | bool RingBuffer::writeBuffer(uint32_t inputdata){ // Funktion zum beschreiben des Buffers |
ChrisselH | 0:1acdcc576936 | 24 | |
ChrisselH | 0:1acdcc576936 | 25 | if(!bufferfull){ // Prüfen ob der Buffer voll ist |
ChrisselH | 0:1acdcc576936 | 26 | |
ChrisselH | 0:1acdcc576936 | 27 | buffer.data[write_pointer] = inputdata; // Schreibt Daten in die aktuelle Zelle |
ChrisselH | 0:1acdcc576936 | 28 | write_pointer++; // Zählt den Schreibezeiger um eins Hoch |
ChrisselH | 0:1acdcc576936 | 29 | buffer.status[write_pointer] = buffer.status[write_pointer - 1]; // Übernehme den vorherigen Statuswert |
ChrisselH | 0:1acdcc576936 | 30 | |
ChrisselH | 0:1acdcc576936 | 31 | if(write_pointer == buffer_size){ // Zeiger am Ende des Buffers |
ChrisselH | 0:1acdcc576936 | 32 | write_pointer = 0; // Schreibezeiger auf Null setzen |
ChrisselH | 0:1acdcc576936 | 33 | } |
ChrisselH | 0:1acdcc576936 | 34 | |
ChrisselH | 0:1acdcc576936 | 35 | if(extfct && (read_pointer + buffer_size - write_pointer) < 10){ // Externe Methode bei einem Abstand im Fifo von kleiner 10 |
ChrisselH | 0:1acdcc576936 | 36 | (*BUFFER_HANDLER)(); // Aufruf der Externen Funktion |
ChrisselH | 0:1acdcc576936 | 37 | } |
ChrisselH | 0:1acdcc576936 | 38 | |
ChrisselH | 0:1acdcc576936 | 39 | if(write_pointer == read_pointer){ // Schreibzeiger steht auf Lesezeiger |
ChrisselH | 0:1acdcc576936 | 40 | bufferfull = true; // Buffer voll, kann nicht mehr Beschrieben werden |
ChrisselH | 0:1acdcc576936 | 41 | |
ChrisselH | 0:1acdcc576936 | 42 | } |
ChrisselH | 0:1acdcc576936 | 43 | else{ |
ChrisselH | 0:1acdcc576936 | 44 | bufferempty = false; // Buffer ist nicht leer, kann gelesen werden |
ChrisselH | 0:1acdcc576936 | 45 | |
ChrisselH | 0:1acdcc576936 | 46 | } |
ChrisselH | 0:1acdcc576936 | 47 | return true; // Rückgabe das der Wert beschrieben worden ist |
ChrisselH | 0:1acdcc576936 | 48 | } |
ChrisselH | 0:1acdcc576936 | 49 | return false; // Rückgabe das der Wert nicht beschrieben worden ist |
ChrisselH | 0:1acdcc576936 | 50 | } |
ChrisselH | 0:1acdcc576936 | 51 | |
ChrisselH | 0:1acdcc576936 | 52 | uint32_t RingBuffer::readBuffer(){ // Funktion zum beschreiben des Buffers |
ChrisselH | 0:1acdcc576936 | 53 | |
ChrisselH | 0:1acdcc576936 | 54 | uint32_t outputdata; // Variable zur Übergabe der Daten |
ChrisselH | 0:1acdcc576936 | 55 | |
ChrisselH | 0:1acdcc576936 | 56 | if(!bufferempty){ // Prüfen ob der Buffer leer ist |
ChrisselH | 0:1acdcc576936 | 57 | |
ChrisselH | 0:1acdcc576936 | 58 | outputdata = buffer.data[read_pointer]; // Auslesen des Wertes an der aktuellen Stelle |
ChrisselH | 0:1acdcc576936 | 59 | read_pointer++; // Zählt den Lesezeiger um eins Hoch |
ChrisselH | 0:1acdcc576936 | 60 | |
ChrisselH | 0:1acdcc576936 | 61 | if(read_pointer == buffer_size){ // Zeiger am Ende des Buffers |
ChrisselH | 0:1acdcc576936 | 62 | read_pointer = 0; // lesezeiger auf Null setzen |
ChrisselH | 0:1acdcc576936 | 63 | } |
ChrisselH | 0:1acdcc576936 | 64 | |
ChrisselH | 0:1acdcc576936 | 65 | if(read_pointer== write_pointer){ // Lesezeiger steht auf Schreibzeiger |
ChrisselH | 0:1acdcc576936 | 66 | bufferempty = true; // Buffer leer, kann nicht mehr gelesen werden |
ChrisselH | 0:1acdcc576936 | 67 | } |
ChrisselH | 0:1acdcc576936 | 68 | else{ |
ChrisselH | 0:1acdcc576936 | 69 | bufferfull = false; // Buffer ist nicht voll, kann geschrieben werden |
ChrisselH | 0:1acdcc576936 | 70 | } |
ChrisselH | 0:1acdcc576936 | 71 | |
ChrisselH | 0:1acdcc576936 | 72 | } |
ChrisselH | 0:1acdcc576936 | 73 | else{ // Buffer leer |
ChrisselH | 0:1acdcc576936 | 74 | outputdata = 0x00; // Rückgabe = 0 |
ChrisselH | 0:1acdcc576936 | 75 | } |
ChrisselH | 0:1acdcc576936 | 76 | |
ChrisselH | 0:1acdcc576936 | 77 | return outputdata; // Ausgabe des Werts |
ChrisselH | 0:1acdcc576936 | 78 | } |
ChrisselH | 0:1acdcc576936 | 79 | |
ChrisselH | 0:1acdcc576936 | 80 | //==================================================================================================================================== |
ChrisselH | 0:1acdcc576936 | 81 | // Setter und Getter Funktionen |
ChrisselH | 0:1acdcc576936 | 82 | //==================================================================================================================================== |
ChrisselH | 0:1acdcc576936 | 83 | |
ChrisselH | 0:1acdcc576936 | 84 | uint8_t RingBuffer::getBufferStatus(){ |
ChrisselH | 0:1acdcc576936 | 85 | return buffer.status[read_pointer]; // Rückgabe des aktuellen Statuswerts |
ChrisselH | 0:1acdcc576936 | 86 | } |
ChrisselH | 0:1acdcc576936 | 87 | |
ChrisselH | 0:1acdcc576936 | 88 | bool RingBuffer::setBufferStatus(int bit){ |
ChrisselH | 0:1acdcc576936 | 89 | |
ChrisselH | 0:1acdcc576936 | 90 | if(bit < 8){ |
ChrisselH | 0:1acdcc576936 | 91 | buffer.status[write_pointer] |= (1 << bit); // Setzt das vorher ausgewählte Bit |
ChrisselH | 0:1acdcc576936 | 92 | return true; // Setzen erfolgreich. |
ChrisselH | 0:1acdcc576936 | 93 | } |
ChrisselH | 0:1acdcc576936 | 94 | |
ChrisselH | 0:1acdcc576936 | 95 | return false; // Setzen nicht erfolgreich. |
ChrisselH | 0:1acdcc576936 | 96 | } |
ChrisselH | 0:1acdcc576936 | 97 | |
ChrisselH | 0:1acdcc576936 | 98 | bool RingBuffer::resetBufferStatus(int bit){ |
ChrisselH | 0:1acdcc576936 | 99 | |
ChrisselH | 0:1acdcc576936 | 100 | if(bit < 8){ |
ChrisselH | 0:1acdcc576936 | 101 | buffer.status[write_pointer] ^= (1 << bit); // Resetzt das vorher ausgewählte Bit |
ChrisselH | 0:1acdcc576936 | 102 | return true; // Restzen erfolgreich. |
ChrisselH | 0:1acdcc576936 | 103 | } |
ChrisselH | 0:1acdcc576936 | 104 | |
ChrisselH | 0:1acdcc576936 | 105 | return false; // Resetzen nicht erfolgreich. |
ChrisselH | 0:1acdcc576936 | 106 | } |
ChrisselH | 0:1acdcc576936 | 107 | |
ChrisselH | 0:1acdcc576936 | 108 | |
ChrisselH | 0:1acdcc576936 | 109 | void RingBuffer::setBF_METHODE(void (*EXTERN_BUFFER_HANDLER)(void)){ // Adresse zur externen Funktion übergeben und Freigabe setzen |
ChrisselH | 0:1acdcc576936 | 110 | extfct = true; // Externe Funktion vorhanden. Freigabe setzen. |
ChrisselH | 0:1acdcc576936 | 111 | BUFFER_HANDLER = EXTERN_BUFFER_HANDLER; // Funktionspointer der Funktion übernehmen |
ChrisselH | 0:1acdcc576936 | 112 | } |