"Bare metal" code for ESP32

Embedding the .cpp scripts on ESP32 requires


This page contains follwing two examples

Example 1. : ISR functions


            
            /*
            //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| CASE 1 

            loop()
                _______________________________________
            ____|                                       |______ 
                0                                    1000msec

            ticker()
                  ____     ____     ____    ____     ___ 
            _____|    |___|    |___|    |__|    |___|   |_____
                    1000 msec

            Rezultat:

            etsWatchdog counter: 0
            Watchdog counter: 1
            Watchdog counter: 2
            Watchdog counter: 3
            Watchdog counter: 4
            Watchdog counter: 5
            Watchdog counter: 6
            Watchdog counter: 7
            Watchdog counter: 8
            Watchdog counter: 9
            |...............................  cycle of 10 done ...... |
            Watchdog counter: 10
            Watchdog counter: 11
            ...

            //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| CASE 2
            case2: zovi funkciju, svakih 100 msec, tj. u sekundi 10x i na kraju 5 sec
            izbaci counter ...  
                ___________________________________________________________
            ____|                                                           |______ 
                0                                                            5000 msec
                                                                            (counter c+=50)
                svakih 100 msec izvrsi funckiju 
                svakih 10 izvrsavanja obavjesti da je ciklus od 10 zavrsen

            _____||||||||||__|||||||||||_|||||||||||_|||||||||||_|||||||||||_
                          (msg)        (msg)     (msg)      (msg)         (msg)


            Rezultat:

            etWatchdog counter: 0
            |...............................  cycle of 10 done ...... |
            |...............................  cycle of 10 done ...... |
            |...............................  cycle of 10 done ...... |
            |...............................  cycle of 10 done ...... |
            |...............................  cycle of 10 done ...... |
            Watchdog counter: 50

            */

          

main.cpp

          #include "Arduino.h"
          #include < Ticker.h >

          //|**********************************************************************************|
          //| Globals 

          int watchDogCount = 0; 
          double dt = 0.01; 
          Ticker secondTick; 

          // ova funkcija se poziva svakih sekundu 
          void ISRwatchDog()
          {
            watchDogCount++; 
            if(watchDogCount %10 == 0)
            {
                Serial.println("|...............................  cycle of 10 done ...... |");         
            }
          }

          void setup() {
            Serial.begin(115200);
            double CALL_TIME = 1; 
            secondTick.attach(CALL_TIME,ISRwatchDog); // ovaj ticker ju poziva svakih sekundu ... 
          }

          void loop() {
              double T_SKETCH = 1000;                                     //| sketch ticks in 5 sec    
              Serial.printf("Watchdog counter: %d\n", watchDogCount);     //|   
            delay(T_SKETCH);
          }

        

Example 2: Creating embedded signal generator

function generator output

main.cpp


            #include "Arduino.h"
            #include "signalgen.h"
            #include < Ticker.h >


            // GLOBALS 
            int Callcounter = 0;                        //| conter is set o zero 
            int LoopCounter = 0;
            double mytime = 0;                          //| starting time 
            Ticker secondTick;                          //| ticker object 


            double newTime;

            //| ::signalgen 
            signalgen sineWave(1e3,50);                 //| generate sinewave object
            signalgen RandSignal;                       //| random signal 
            double dt = 1/sineWave.getFS();             //| take generator sampling fequency 


            //[ISR_2]
            void ISRsineWave()
            { 
              Callcounter++;
              double t = dt*Callcounter;                   // time dt       ... 
              double r = RandSignal.rand_normal(0.0,1);  // random signal ...
              double s = 2*sineWave.sinus_const(t);          // sinus content ... 
              newTime = micros();
              Serial.printf("%.3f*", r);

              // Serial.printf("%.4f, %.4f*", t, s);
              // Serial.println(s);

            }


            //|||||||||||||||||||||||||||||| SETUP and LOOP
            void setup()
            {
              Serial.begin(115200);
              
              //| 1/512  = 0.001953125
              //| 1/500  = 0.002
              //| 1/1000  = 0.001
              //| 1/2000  = 0.000005
              //| 1/1024 = 0,0009765625
              //| 1/800  = 0.00125 x nece puni 1000
                
                double CALL_TIME = 0.001;   
                secondTick.attach(CALL_TIME, ISRsineWave);

            }


            void loop()
            {

            //double mytime= 0;
            //==================================================================
            // This is the sketch time 
              
              //double T_SKTECH = 1000;     
              //delay(T_SKTECH); 
              //Callcounter = 0; 
              Serial.flush();


            }
          

signalgen.h

          #pragma once
          #include < cmath >
          #include < Arduino.h >
          #include < random >
          #include < chrono >
          #include < cstdlib >

          using namespace std; 

          //|***************************************************************************************
          //|  Signal generator class for ESP32
          //|  fs is at its maximum at 18740 Hz ! // see appendix for measurement reference 
          //|  Appendix/ C++ /ESP32 sampling rate CLICK HERE
          //|***************************************************************************************

          class signalgen
          {
              private:
                  double fs, dt, freq;     
                  double PI_ = 3.14159265358979323846;

              public:
                  signalgen();
                  signalgen(double, double);
                  ~signalgen();

              double sinus_const(double);
              double cos_const(double);
              double rand_normal(double, double);

              double getFS();
          };

          signalgen::signalgen()
          {

          }

          signalgen::signalgen(double f_s, double f )
          {
                  if(fs < 18740.0 )
                  {
                      this->fs = f_s;
                      this->dt = 1/fs;
                      this->freq = f;
                  }
                  else if( fs > 18740 )
                  {
                      Serial.println("Maximal sampling frequency allowed ist 18.740 kHz");
                      this->fs = 18740.0;
                      this->dt = 1/fs;
                      this->freq = f;
                  }
          }

          signalgen::~signalgen()
          {
          }

          // returns from private sampling frequency 
          double signalgen::getFS()
          {
          return this->fs;
          }


          // |||||||||||||||||||||||||||||||||||||||||||| :: generate sine
          double signalgen::sinus_const(double dt)
          {
              double f = this->freq;
              return sin(2*PI_*f*dt);
          }



          // |||||||||||||||||||||||||||||||||||||||||||| :: generate cosine
          double signalgen::cos_const(double t)
          {
              double f = this->freq; 
              return cos((2*PI_*f*t)/fs);
          }


          // |||||||||||||||||||||||||||||||||||||||||| :: generate normal distributed value ...
          double signalgen::rand_normal(double mu, double stddev)
          {
              // start from some number genreated by the clock ... 
              unsigned seed =  std::chrono::steady_clock::now().time_since_epoch().count();
              std::default_random_engine gen(seed);                       // generator 
              std::normal_distribution distribution(mu,stddev);   // distribution     
              double number = distribution(gen);                          // random number... 

          return number; 
          }


        

Serial port should stream now

function generator output
ESP32 features overview :