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

  1. timer modules
    1. Quadratur Encoder (Version 1.2 - C. Hoyer 12.8.2015)
  2. SPI modules
    1. AD5664 (Version 1.1 - C. Hoyer 23.7.2015)
  3. software modules
    1. Ringbuffer (Version 0.9 - C. Hoyer 18.8.2015)
    2. PID-Regler (Version 1.0 - C. Hoyer 17.9.2015)
Committer:
ChrisselH
Date:
Mon Nov 28 17:27:43 2016 +0000
Revision:
0:1acdcc576936
port from priv lib

Who changed what in which revision?

UserRevisionLine numberNew 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 }