Здравствуйте!
Не могу понять, почему не работают прерывания TIMER16, код прикрепляю снизу.
Инициализация тактирования шин, GPIO, таймера и включение прерываний по сути взяты из примеров.
Предполагаю, что ошибка где-то в инициализации таймера, но не могу понять где.
Использую отладочную плату с программатором (https://tellur-el.ru/catalog/razrabotka_i_konstruirovanie_1/otladochnye_platy_1/323392/), программирую в Visual Studio с использованием PlatformIO, код прошивается в RAM-память. Правильно ли я понимаю, что все прерывания обрабатываются в trap_handler и для вылавливания какого-то конкретного нужно прописать проверку флага? По моей логике, здесь я пытаюсь хотя бы войти в обработчик прерываний и подёргать светодиод на GPIO_PIN_9.
Кстати, подскажите, пожалуйста, за что отвечают значения Calibration value для HSI32M и LSI32K? Не увидел описания этого в документации.
Не могу понять, почему не работают прерывания TIMER16, код прикрепляю снизу.
Инициализация тактирования шин, GPIO, таймера и включение прерываний по сути взяты из примеров.
Предполагаю, что ошибка где-то в инициализации таймера, но не могу понять где.
Использую отладочную плату с программатором (https://tellur-el.ru/catalog/razrabotka_i_konstruirovanie_1/otladochnye_platy_1/323392/), программирую в Visual Studio с использованием PlatformIO, код прошивается в RAM-память. Правильно ли я понимаю, что все прерывания обрабатываются в trap_handler и для вылавливания какого-то конкретного нужно прописать проверку флага? По моей логике, здесь я пытаюсь хотя бы войти в обработчик прерываний и подёргать светодиод на GPIO_PIN_9.
Код:
[QUOTE]
#include "mik32_hal.h"
#include "mik32_hal_pcc.h"
#include "mik32_hal_timer16.h"
#include "mik32_hal_irq.h"
#include "mik32_hal_gpio.h"
void CLK_Init(void);
void TIMER16_Init(void);
void GPIO_Init(void);
Timer16_HandleTypeDef htimer16_1;
int main ()
{
HAL_Init();
CLK_Init();
GPIO_Init();
TIMER16_Init();
HAL_EPIC_MaskEdgeSet(HAL_EPIC_TIMER16_1_MASK);
HAL_IRQ_EnableInterrupts();
HAL_Timer16_Counter_Start_IT(&htimer16_1, (uint16_t)0x61A8);
while(1)
{
asm("nop");
}
}
void CLK_Init(void)
{
PCC_InitTypeDef PCC_ClkInit = {0};
PCC_ClkInit.OscillatorEnable = PCC_OSCILLATORTYPE_OSC32M;
PCC_ClkInit.FreqMon.OscillatorSystem = PCC_OSCILLATORTYPE_OSC32M;
PCC_ClkInit.FreqMon.ForceOscSys = PCC_FORCE_OSC_SYS_UNFIXED;
PCC_ClkInit.FreqMon.Force32KClk = PCC_FREQ_MONITOR_SOURCE_OSC32K;
PCC_ClkInit.AHBDivider = 0;
PCC_ClkInit.APBPDivider = 0;
PCC_ClkInit.APBMDivider = 0;
PCC_ClkInit.HSI32MCalibrationValue = 0;
PCC_ClkInit.LSI32KCalibrationValue = 0;
PCC_ClkInit.RTCClockSelection = PCC_RTC_CLOCK_SOURCE_AUTO;
PCC_ClkInit.RTCClockCPUSelection = PCC_CPU_RTC_CLOCK_SOURCE_OSC32K;
HAL_PCC_Config(&PCC_ClkInit);
}
void TIMER16_Init(void)
{
htimer16_1.Clock.Source = TIMER16_SOURCE_INTERNAL_AHB;
htimer16_1.CountMode = TIMER16_COUNTMODE_INTERNAL;
htimer16_1.Clock.Prescaler = TIMER16_PRESCALER_128;
htimer16_1.ActiveEdge = TIMER16_ACTIVEEDGE_RISING;
htimer16_1.Preload = TIMER16_PRELOAD_ENDPERIOD;
htimer16_1.Filter.ExternalClock = TIMER16_FILTER_NONE;
htimer16_1.Filter.Trigger = TIMER16_FILTER_NONE;
htimer16_1.EncoderMode = TIMER16_ENCODER_DISABLE;
htimer16_1.Instance->IER = TIMER16_IER_ARRMIE_M;
htimer16_1.Instance->CNT = 0;
HAL_Timer16_Init(&htimer16_1);
}
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_Init_Struct = {0};
__HAL_PCC_GPIO_0_CLK_ENABLE();
GPIO_Init_Struct.Pin = GPIO_PIN_9;
GPIO_Init_Struct.Mode = HAL_GPIO_MODE_GPIO_OUTPUT;
GPIO_Init_Struct.Pull = HAL_GPIO_PULL_DOWN;
HAL_GPIO_Init(GPIO_0, &GPIO_Init_Struct);
}
void trap_handler()
{
HAL_GPIO_TogglePin(GPIO_0, GPIO_PIN_9);
HAL_Timer16_ClearInterruptMask(&htimer16_1, 0xFFFFFFFF);
HAL_EPIC_Clear(0xFFFFFFFF);
}
[/QUOTE]
Кстати, подскажите, пожалуйста, за что отвечают значения Calibration value для HSI32M и LSI32K? Не увидел описания этого в документации.
Последнее редактирование: