From 85535d3e37f513d2f7819217095dd868dbff7d32 Mon Sep 17 00:00:00 2001 From: klassents Date: Sun, 13 Oct 2024 11:28:11 +0700 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=87=D0=B8=D0=BA=20=D0=BF=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B2=20ram.=20=D0=A4=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BC=D0=B0=D0=BA=D1=80=D0=BE=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cores/arduino/Tone.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/cores/arduino/Tone.cpp b/cores/arduino/Tone.cpp index 81899f3..8dba4e1 100644 --- a/cores/arduino/Tone.cpp +++ b/cores/arduino/Tone.cpp @@ -3,6 +3,7 @@ #include "mik32_hal_timer16.h" #include "mik32_hal_irq.h" +#include "wiring_LL.h" #define PRESCALERS_QTY 7 typedef struct @@ -100,7 +101,7 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration) HAL_EPIC_MaskLevelSet(HAL_EPIC_TIMER16_1_MASK); pinMode(pin, OUTPUT); - HAL_GPIO_WritePin((GPIO_TypeDef *)timer_pin_port, timer_pin_mask, GPIO_PIN_LOW); + GPIO_CLEAR_PIN((GPIO_TypeDef *)timer_pin_port, timer_pin_mask); HAL_Timer16_Counter_Start_IT(&htimer16_1, frequencyParams.period_ticks); timerIsOn = true; @@ -125,9 +126,9 @@ void noTone(uint8_t pin) if (timerIsOn) { // pin to 0 - HAL_GPIO_WritePin((GPIO_TypeDef *)timer_pin_port, timer_pin_mask, GPIO_PIN_LOW); - HAL_Timer16_Disable(&htimer16_1); // disable timer - HAL_EPIC_MaskLevelClear(HAL_EPIC_TIMER16_1_MASK); + GPIO_CLEAR_PIN((GPIO_TypeDef *)timer_pin_port, timer_pin_mask); + TIM16_DISABLE(htimer16_1); + EPIC_LEVEL_CLEAR_BY_MASK(HAL_EPIC_TIMER16_1_MASK); pinMode(pin, INPUT); // deinit pin timer_pin = -1; // reset to default timerIsOn = false; @@ -135,25 +136,26 @@ void noTone(uint8_t pin) } // irq handler -extern "C" void tone_interrupt_handler(void) +extern "C" void __attribute__((noinline, section(".ram_text"), optimize("O3"))) tone_interrupt_handler(void) { - if(HAL_Timer16_GetInterruptStatus_ARRM(&htimer16_1)) + if (TIM16_GET_ARRM_INT_STATUS(htimer16_1)) { // timer period has passed, change the pin state if (timer_toggle_count != 0) { - HAL_GPIO_TogglePin((GPIO_TypeDef*)timer_pin_port, timer_pin_mask); - + GPIO_TOGGLE_PIN((GPIO_TypeDef*)timer_pin_port, timer_pin_mask); if (timer_toggle_count > 0) timer_toggle_count--; } else { // turn off if the specified duration has passed - HAL_GPIO_WritePin((GPIO_TypeDef *)timer_pin_port, timer_pin_mask, GPIO_PIN_LOW); - noTone(timer_pin); + GPIO_CLEAR_PIN((GPIO_TypeDef *)timer_pin_port, timer_pin_mask); + TIM16_DISABLE(htimer16_1); + EPIC_LEVEL_CLEAR_BY_MASK(HAL_EPIC_TIMER16_1_MASK); + timerIsOn = false; } } // reset timer interrupt flags - HAL_Timer16_ClearInterruptMask(&htimer16_1, 0xFFFFFFFF); + TIM16_CLEAR_INT_MASK(htimer16_1, 0xFFFFFFFF); } \ No newline at end of file