]> code.bitgloo.com Git - clyne/stmdsp.git/commitdiff
set sampling rate
authorClyne Sullivan <clyne@bitgloo.com>
Thu, 22 Oct 2020 13:18:18 +0000 (09:18 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Thu, 22 Oct 2020 13:18:18 +0000 (09:18 -0400)
Makefile
cfg/mcuconf.h
gui/stmdsp.cpp
gui/stmdsp.hpp
gui/wxmain.cpp
gui/wxmain.hpp
source/adc.cpp
source/adc.hpp
source/main.cpp

index 3b0591781fc6c8674a37e7e3775068390a64cb0b..f35692adda42350ee58888ff858a6386d799715f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -100,10 +100,10 @@ include $(CHIBIOS)/os/license/license.mk
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32l4xx.mk\r
 # HAL-OSAL files (optional).\r
 include $(CHIBIOS)/os/hal/hal.mk\r
-include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform.mk\r
-include $(CHIBIOS)/os/hal/boards/ST_STM32L476_DISCOVERY/board.mk\r
-#include $(CHIBIOS)/os/hal/boards/ST_NUCLEO32_L432KC/board.mk\r
-#include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform_l432.mk\r
+#include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform.mk\r
+#include $(CHIBIOS)/os/hal/boards/ST_STM32L476_DISCOVERY/board.mk\r
+include $(CHIBIOS)/os/hal/boards/ST_NUCLEO32_L432KC/board.mk\r
+include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform_l432.mk\r
 include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk\r
 # RTOS files (optional).\r
 include $(CHIBIOS)/os/rt/rt.mk\r
@@ -116,8 +116,8 @@ include $(CHIBIOS)/tools/mk/autobuild.mk
 #include $(CHIBIOS)/test/oslib/oslib_test.mk\r
 \r
 # Define linker script file here.\r
-LDSCRIPT= $(STARTUPLD)/STM32L476xG.ld\r
-#LDSCRIPT= $(STARTUPLD)/STM32L432xC.ld\r
+#LDSCRIPT= $(STARTUPLD)/STM32L476xG.ld\r
+LDSCRIPT= $(STARTUPLD)/STM32L432xC.ld\r
 \r
 # C sources that can be compiled in ARM or THUMB mode depending on the global\r
 # setting.\r
index 929e04990be018aae86a5ab0931d4dc9060eebd1..3a246fa0085e1bdbb4b7a8206f5076b3a3eb5c45 100644 (file)
@@ -32,8 +32,9 @@
 #define MCUCONF_H\r
 \r
 #define STM32L4xx_MCUCONF\r
-#define STM32L476_MCUCONF\r
-//#define STM32L432_MCUCONF\r
+//#define STM32L476_MCUCONF\r
+#define STM32L432_MCUCONF\r
+//#define STM32L433_MCUCONF\r
 \r
 /*\r
  * HAL driver system settings.\r
index 633c61ac3845754d8835484582dfcb4155dbf50c..3de3324fc480d5b89bada3b458cd303faf5a15d7 100644 (file)
@@ -52,6 +52,16 @@ namespace stmdsp
         }
     }
 
+    void device::set_sample_rate(unsigned int id) {
+        if (connected()) {
+            uint8_t request[2] = {
+                'r',
+                static_cast<uint8_t>(id)
+            };
+            m_serial.write(request, 2);
+        }
+    }
+
     void device::continuous_start() {
         if (connected())
             m_serial.write("R");
index 46113bf900b1e61d4f3fc48c49f95682620aacf0..25c6a8c6562a0c801f2ee5133dbd2b5c8b357926 100644 (file)
@@ -44,6 +44,7 @@ namespace stmdsp
         //std::vector<adcsample_t> sample(unsigned long int count = 1);
 
         void continuous_set_buffer_size(unsigned int size);
+        void set_sample_rate(unsigned int id);
         void continuous_start();
         void continuous_start_measure();
         uint32_t continuous_start_get_measurement();
index c9e8b3d694d17bd2d82c223700e94fad8ee92e26..412f7755b5639a6d0294494a5f1e496bbc897dc5 100644 (file)
@@ -29,6 +29,7 @@ enum Id {
     MRunUpload,
     MRunUnload,
     MRunEditBSize,
+    MRunEditSRate,
     MRunGenUpload,
     MRunGenStart,
     MCodeCompile,
@@ -106,6 +107,8 @@ MainFrame::MainFrame() : wxFrame(nullptr, wxID_ANY, "stmdspgui", wxPoint(50, 50)
          menuRun->Append(MRunUnload, "U&nload code"));
     Bind(wxEVT_MENU, &MainFrame::onRunEditBSize, this, Id::MRunEditBSize, wxID_ANY,
          menuRun->Append(MRunEditBSize, "Set &buffer size..."));
+    Bind(wxEVT_MENU, &MainFrame::onRunEditSRate, this, Id::MRunEditSRate, wxID_ANY,
+         menuRun->Append(MRunEditSRate, "Set sample &rate..."));
 
     menuRun->AppendSeparator();
     Bind(wxEVT_MENU, &MainFrame::onRunGenUpload, this, Id::MRunGenUpload, wxID_ANY,
@@ -439,6 +442,33 @@ void MainFrame::onRunEditBSize([[maybe_unused]] wxCommandEvent&)
     }
 }
 
+void MainFrame::onRunEditSRate([[maybe_unused]] wxCommandEvent&)
+{
+    if (m_device != nullptr && m_device->connected()) {
+        wxTextEntryDialog dialog (this, "Enter new sample rate id:", "Set Sample Rate");
+        if (dialog.ShowModal() == wxID_OK) {
+            if (wxString value = dialog.GetValue(); !value.IsEmpty()) {
+                if (unsigned long n; value.ToULong(&n)) {
+                    if (n < 20) {
+                        m_device->set_sample_rate(n);
+                    } else {
+                        m_status_bar->SetStatusText("Error: Invalid sample rate.");
+                    }
+                } else {
+                    m_status_bar->SetStatusText("Error: Invalid sample rate.");
+                }
+            } else {
+                m_status_bar->SetStatusText("Ready.");
+            }
+        } else {
+            m_status_bar->SetStatusText("Ready.");
+        }
+    } else {
+        wxMessageBox("No device connected!", "Run", wxICON_WARNING);
+        m_status_bar->SetStatusText("Please connect.");
+    }
+}
+
 void MainFrame::onRunGenUpload([[maybe_unused]] wxCommandEvent&)
 {
     if (m_device != nullptr && m_device->connected()) {
index 60c3ee11a4ba1ab299c5c65c9037eb85a5eab79f..c46ed95a4800241076733b84e4738de4de6163ab 100644 (file)
@@ -37,6 +37,7 @@ public:
     void onRunUpload(wxCommandEvent&);
     void onRunUnload(wxCommandEvent&);
     void onRunEditBSize(wxCommandEvent&);
+    void onRunEditSRate(wxCommandEvent&);
     void onRunGenUpload(wxCommandEvent&);
     void onRunGenStart(wxCommandEvent&);
 
index 9fd3285227769eb4406c595601402377a03a744b..0318a6b0e056ef7f335129e0c51f6755ca7322dd 100644 (file)
@@ -44,6 +44,32 @@ constexpr static const GPTConfig gpt_config = {
     .dier = 0
 };
 
+static uint32_t adc_sample_rate_settings[] = {
+    10, ADC_SMPR_SMP_47P5, // 3125
+    11, ADC_SMPR_SMP_12P5, // 3750
+    9,  ADC_SMPR_SMP_47P5, // 6250
+    10, ADC_SMPR_SMP_12P5, // 7500
+    8,  ADC_SMPR_SMP_47P5, // 12K5
+    9,  ADC_SMPR_SMP_12P5, // 15K
+    7,  ADC_SMPR_SMP_47P5, // 25K
+    8,  ADC_SMPR_SMP_12P5, // 30K
+    5,  ADC_SMPR_SMP_47P5, // 40K
+    4,  ADC_SMPR_SMP_47P5, // 50K
+    7,  ADC_SMPR_SMP_12P5, // 60K
+    6,  ADC_SMPR_SMP_12P5, // 80K
+    5,  ADC_SMPR_SMP_12P5, // 96K
+    2,  ADC_SMPR_SMP_47P5, // 100K
+    4,  ADC_SMPR_SMP_12P5, // 120K
+    3,  ADC_SMPR_SMP_12P5, // 160K
+    1,  ADC_SMPR_SMP_47P5, // 200K
+    2,  ADC_SMPR_SMP_12P5, // 240K
+    0,  ADC_SMPR_SMP_47P5, // 400K
+    1,  ADC_SMPR_SMP_12P5, // 480K
+    1,  ADC_SMPR_SMP_2P5,  // 800K
+    0,  ADC_SMPR_SMP_12P5, // 960K
+    0,  ADC_SMPR_SMP_2P5   // 1M6
+};
+
 static bool adc_is_read_finished = false;
 static adcsample_t *adc_current_buffer = nullptr;
 static size_t adc_current_buffer_size = 0;
@@ -59,6 +85,19 @@ namespace adc
         adcStart(adcd, &adc_config);
         adcSTM32EnableVREF(adcd);
     }
+
+    void set_rate(rate new_rate)
+    {
+        auto presc = adc_sample_rate_settings[static_cast<unsigned int>(new_rate) * 2] << 18;
+        auto smp = adc_sample_rate_settings[static_cast<unsigned int>(new_rate) * 2 + 1];
+    
+        adcStop(adcd);
+        // Set ADC prescaler
+        adcd->adcc->CCR = (adcd->adcc->CCR & ~(0xF << 18)) | presc;
+        // Set sampling time
+        adc_group_config.smpr[0] = ADC_SMPR1_SMP_AN5(smp);
+        adcStart(adcd, &adc_config);
+    }
     
     adcsample_t *read(adcsample_t *buffer, size_t count)
     {
@@ -94,42 +133,8 @@ namespace adc
         adc_current_buffer_size = 0;
         adc_operation_func = nullptr;
     }
-    void set_rate(rate r)
-    {
-        uint32_t val = 0;
-    
-        switch (r) {
-        case rate::R2P5:
-            val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_2P5);
-            break;
-        case rate::R6P5:
-            val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_6P5);
-            break;
-        case rate::R12P5:
-            val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_12P5);
-            break;
-        case rate::R24P5:
-            val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_24P5);
-            break;
-        case rate::R47P5:
-            val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_47P5);
-            break;
-        case rate::R92P5:
-            val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_92P5);
-            break;
-        case rate::R247P5:
-            val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_247P5);
-            break;
-        case rate::R640P5:
-            val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_640P5);
-            break;
-        }
-    
-        adc_group_config.smpr[0] = val;
-    }
 }
-
 void adc_read_callback(ADCDriver *driver)
 {
     if (adc_group_config.circular) {
index d1cd292e0dc9338e3c26f9762260388de8df385b..d31d60af91f5d4495fe7c0bdf626f902e6d88339 100644 (file)
@@ -18,23 +18,38 @@ namespace adc
 {
     using operation_t = void (*)(adcsample_t *buffer, size_t count);
 
-    enum class rate {
-        R2P5,
-        R6P5,
-        R12P5,
-        R24P5,
-        R47P5,
-        R92P5,
-        R247P5,
-        R640P5
+    enum class rate : unsigned int {
+        R3125 = 0,
+        R3750,
+        R6250,
+        R7500,
+        R12K5,
+        R15K,
+        R25K,
+        R30K,
+        R40K,
+        R50K,
+        R60K,
+        R80K,
+        R96K,
+        R100K,
+        R120K,
+        R160K,
+        R200K,
+        R240K,
+        R400K,
+        R480K,
+        R800K,
+        R960K,
+        R1M6
     };
     
     void init();
+    void set_rate(rate new_rate);
     adcsample_t *read(adcsample_t *buffer, size_t count);
     void read_start(operation_t operation_func, adcsample_t *buffer, size_t count);
     void read_set_operation_func(operation_t operation_func);
     void read_stop();
-    void set_rate(rate r);
 }
 
 #endif // STMDSP_ADC_HPP_
index 7a55b6cb520e753d08ee679231f79fd05d3d55b1..67a39a3d72fb5a92f03aa3a91e41792ffbfed54d 100644 (file)
@@ -253,14 +253,15 @@ void main_loop()
                     }
                     break;
 
-                //case 'r':
-                //    if (usbserial::read(&cmd[1], 1) == 1) {
+                case 'r':
+                    if (usbserial::read(&cmd[1], 1) == 1) {
+                        adc::set_rate(static_cast<adc::rate>(cmd[1]));
                 //        adc_preloaded = cmd[1] & (1 << 0);
                 //        dac_preloaded = cmd[1] & (1 << 1);
-                //    } else {
-                //        error_queue_add(Error::BadParamSize);
-                //    }
-                //    break;
+                    } else {
+                        error_queue_add(Error::BadParamSize);
+                    }
+                    break;
 
                 // 'S' - Stops the continuous sampling/conversion.
                 case 'S':