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