forked from Elron_dev/elbear_arduino_bsp
Обновление до версии 0.3.0
- обновлен elbear_fw_bootloader - добавлена проверка контрольной суммы каждой строки hex файла. - в модуль работы с АЦП добавлена функция analogReadResolution(). Функция analogRead() теперь возвращает усредненное по 10 измерениям значение. - общая функция обработки прерываний перенесена в память RAM. Обработчики прерываний модулей External Interrupts и Advanced I/O (функция tone()) так же перенесены в память RAM для увеличения скорости выполнения кода. - в пакет добавлены библиотеки EEPROM, Servo, SoftSerial, NeoPixel, MFRC522 адаптированные для работы с платой Elbear Ace-Uno. - добавлено описание особенностей работы с пакетом
This commit is contained in:
1 parent
2044614aba
commit
7261b03ea1
114 files changed
+11064
-666
No files matched your search
+14
-11
@@ -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);
|
||||
timer_pin_port->CLEAR = timer_pin_mask;
|
||||
GPIO_CLEAR_PIN((GPIO_TypeDef *)timer_pin_port, timer_pin_mask);
|
||||
|
||||
HAL_Timer16_Counter_Start_IT(&htimer16_1, frequencyParams.period_ticks);
|
||||
timerIsOn = true;
|
||||
@@ -124,9 +125,10 @@ void noTone(uint8_t pin)
|
||||
{
|
||||
if (timerIsOn)
|
||||
{
|
||||
timer_pin_port->CLEAR = timer_pin_mask; // pin to 0
|
||||
htimer16_1.Instance->CR &= ~TIMER16_CR_ENABLE_M; // disable timer
|
||||
HAL_EPIC_MaskLevelClear(HAL_EPIC_TIMER16_1_MASK);
|
||||
// pin to 0
|
||||
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;
|
||||
@@ -134,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 ((htimer16_1.Instance->ISR & htimer16_1.Instance->IER) & TIMER16_ISR_ARR_MATCH_M)
|
||||
if (TIM16_GET_ARRM_INT_STATUS(htimer16_1))
|
||||
{
|
||||
// timer period has passed, change the pin state
|
||||
if (timer_toggle_count != 0)
|
||||
{
|
||||
timer_pin_port->OUTPUT_ ^= 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
|
||||
timer_pin_port->CLEAR = timer_pin_mask;
|
||||
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
|
||||
htimer16_1.Instance->ICR = 0xFFFFFFFF;
|
||||
TIM16_CLEAR_INT_MASK(htimer16_1, 0xFFFFFFFF);
|
||||
}
|
||||
Reference in new issue
Block a user