From e39352208de5fb3838f280ea7c24c910d320a833 Mon Sep 17 00:00:00 2001 From: Kizarm Date: Tue, 12 Mar 2024 13:24:01 +0100 Subject: [PATCH] midi melody start on button PD3/GND --- ch32v003/gpio.h | 9 +++++++++ midi/midiplayer.cpp | 10 ++++++---- midi/midiplayer.h | 2 +- midi/pwmconfig.h | 4 +++- stm32f051/gpio.h | 5 ++++- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/ch32v003/gpio.h b/ch32v003/gpio.h index d7c558c..548235b 100644 --- a/ch32v003/gpio.h +++ b/ch32v003/gpio.h @@ -14,6 +14,11 @@ enum GPIO_CNF : uint32_t { GPIO_UPDI_MPPO = 2u << 2, GPIO_none_MPDO = 3u << 2, }; +enum GPIOPuPd_TypeDef { + GPIO_PuPd_NOPULL = 0x00, + GPIO_PuPd_UP = 0x01, + GPIO_PuPd_DOWN = 0x02 +}; class GpioClass { GPIOA_Type & port; @@ -42,6 +47,10 @@ class GpioClass { operator bool () const { return port.INDR.R & (1u << pin); } + void setPuPd (GPIOPuPd_TypeDef p) { + if (p != GPIO_PuPd_UP) return; + port.OUTDR.R |= 1u << pin; + } }; #endif // _GPIO_CLASS_H_ diff --git a/midi/midiplayer.cpp b/midi/midiplayer.cpp index 6773fcc..01e7383 100644 --- a/midi/midiplayer.cpp +++ b/midi/midiplayer.cpp @@ -48,11 +48,12 @@ static unsigned pwm_sd (const int input) { /******************************************************************/ /// Konstruktor -MidiPlayer::MidiPlayer() noexcept : OneWay(), led (LED_CFG), passcnt (0u) { +MidiPlayer::MidiPlayer() noexcept : OneWay(), led (LED_CFG), but (BUT_CFG), passcnt (0u) { index = 0; pause = 0; melody = scores[index++]; - running = true; + running = false; + but.setPuPd (GPIO_PuPd_UP); } void MidiPlayer::pass() { const bool b = passcnt & 0x10000; @@ -61,7 +62,8 @@ void MidiPlayer::pass() { } unsigned MidiPlayer::Send (uint16_t * const ptr, const unsigned len) { -//if (!but.get()) running = true; // případně spouštět tlačítkem, není implementováno + const bool b = but; + if (!b and !running) running = true; if (!running) { for (unsigned n=0; n> 1; @@ -75,7 +77,7 @@ unsigned MidiPlayer::Send (uint16_t * const ptr, const unsigned len) { return len; } void MidiPlayer::stop (void) { -//running = false; // na konci každé melodie stop + running = false; // na konci každé melodie stop melody = scores[index++]; if (!melody) { index = 0; diff --git a/midi/midiplayer.h b/midi/midiplayer.h index 7774756..7ba1f49 100644 --- a/midi/midiplayer.h +++ b/midi/midiplayer.h @@ -19,7 +19,7 @@ class MidiPlayer : public OneWay { /// Obsluha vzorku short nextSample (void); private: - GpioClass led; + GpioClass led, but; unsigned passcnt; volatile bool running; unsigned char const * melody; diff --git a/midi/pwmconfig.h b/midi/pwmconfig.h index 0fac579..12a1726 100644 --- a/midi/pwmconfig.h +++ b/midi/pwmconfig.h @@ -4,10 +4,12 @@ static constexpr unsigned HALF_LEN = 0x80u; static constexpr unsigned MAXPWM = 2000u; -#ifdef __riscv +#if __riscv #define LED_CFG GPIOD,4 +#define BUT_CFG GPIOD,3,(GPIO_Speed_In | GPIO_UPDI_MPPO) #elif __arm__ #define LED_CFG GpioPortA,0 +#define BUT_CFG GpioPortA,3,GPIO_Mode_IN #else #error "bad target" #endif diff --git a/stm32f051/gpio.h b/stm32f051/gpio.h index 7960c6e..3f0e2ff 100644 --- a/stm32f051/gpio.h +++ b/stm32f051/gpio.h @@ -91,13 +91,16 @@ class GpioClass { /// Načti logickou hodnotu na pinu const bool get (void) const { if (io->IDR.R & pos) return true; - else return false; + else return false; }; /// A to samé jako operátor const GpioClass& operator>> (bool& b) const { b = get(); return *this; } + operator bool () const { + return get(); + } //![Gpio example] void setMode (GPIOMode_TypeDef p) { uint32_t dno = num * 2;