обработчик прерываний перенесен в ram. Функции заменены на макросы
This commit is contained in:
1 parent
fa26d442e5
commit
85535d3e37
1 file changed
+13
-11
+13
-11
@@ -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);
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user