обработчик прерываний перенесен в ram. Функции заменены на макросы

This commit is contained in:
klassents committed 2024-10-13 11:28:11 +07:00
1 parent fa26d442e5
commit 85535d3e37
1 file changed
+13 -11
+13 -11
View File
@@ -3,6 +3,7 @@
#include "mik32_hal_timer16.h" #include "mik32_hal_timer16.h"
#include "mik32_hal_irq.h" #include "mik32_hal_irq.h"
#include "wiring_LL.h"
#define PRESCALERS_QTY 7 #define PRESCALERS_QTY 7
typedef struct 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); HAL_EPIC_MaskLevelSet(HAL_EPIC_TIMER16_1_MASK);
pinMode(pin, OUTPUT); 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); HAL_Timer16_Counter_Start_IT(&htimer16_1, frequencyParams.period_ticks);
timerIsOn = true; timerIsOn = true;
@@ -125,9 +126,9 @@ void noTone(uint8_t pin)
if (timerIsOn) if (timerIsOn)
{ {
// pin to 0 // pin to 0
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_Disable(&htimer16_1); // disable timer TIM16_DISABLE(htimer16_1);
HAL_EPIC_MaskLevelClear(HAL_EPIC_TIMER16_1_MASK); EPIC_LEVEL_CLEAR_BY_MASK(HAL_EPIC_TIMER16_1_MASK);
pinMode(pin, INPUT); // deinit pin pinMode(pin, INPUT); // deinit pin
timer_pin = -1; // reset to default timer_pin = -1; // reset to default
timerIsOn = false; timerIsOn = false;
@@ -135,25 +136,26 @@ void noTone(uint8_t pin)
} }
// irq handler // 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 // timer period has passed, change the pin state
if (timer_toggle_count != 0) 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) if (timer_toggle_count > 0)
timer_toggle_count--; timer_toggle_count--;
} }
else else
{ {
// turn off if the specified duration has passed // turn off if the specified duration has passed
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);
noTone(timer_pin); TIM16_DISABLE(htimer16_1);
EPIC_LEVEL_CLEAR_BY_MASK(HAL_EPIC_TIMER16_1_MASK);
timerIsOn = false;
} }
} }
// reset timer interrupt flags // reset timer interrupt flags
HAL_Timer16_ClearInterruptMask(&htimer16_1, 0xFFFFFFFF); TIM16_CLEAR_INT_MASK(htimer16_1, 0xFFFFFFFF);
} }