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
#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
#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
}
}
+ 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");
//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();
MRunUpload,
MRunUnload,
MRunEditBSize,
+ MRunEditSRate,
MRunGenUpload,
MRunGenStart,
MCodeCompile,
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,
}
}
+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()) {
void onRunUpload(wxCommandEvent&);
void onRunUnload(wxCommandEvent&);
void onRunEditBSize(wxCommandEvent&);
+ void onRunEditSRate(wxCommandEvent&);
void onRunGenUpload(wxCommandEvent&);
void onRunGenStart(wxCommandEvent&);
.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;
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)
{
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) {
{
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_
}
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':