#include "ClearCore.h"
void ConfigurePeriodicInterrupt(uint32_t frequencyHz);
extern "C" void TCC2_0_Handler(void) __attribute__((
alias("PeriodicInterrupt")));
#define PERIODIC_INTERRUPT_PRIORITY 4
#define ACK_PERIODIC_INTERRUPT TCC2->INTFLAG.reg = TCC_INTFLAG_MASK
bool ledState = false;
uint32_t interruptFreqHz = 4;
extern "C" void PeriodicInterrupt(void) {
ledState = !ledState;
ACK_PERIODIC_INTERRUPT;
}
int main() {
ConfigurePeriodicInterrupt(interruptFreqHz);
}
void ConfigurePeriodicInterrupt(uint32_t frequencyHz) {
TCC2->CTRLA.bit.ENABLE = 0;
TCC2->CTRLA.bit.SWRST = 1;
while (TCC2->CTRLA.bit.SWRST) {
continue;
}
if (!frequencyHz) {
NVIC_DisableIRQ(TCC2_0_IRQn);
return;
}
uint32_t period = (
CPU_CLK + frequencyHz / 2) / frequencyHz;
uint8_t prescale;
period =
max(period, 1U);
for (prescale = TCC_CTRLA_PRESCALER_DIV1_Val;
prescale < TCC_CTRLA_PRESCALER_DIV16_Val && (period - 1) > UINT16_MAX;
prescale++) {
period = period >> 1;
}
for (; prescale < TCC_CTRLA_PRESCALER_DIV1024_Val && (period - 1) > UINT16_MAX;
prescale++) {
period = period >> 2;
}
if (period > UINT16_MAX) {
TCC2->PER.reg = UINT16_MAX;
}
else {
TCC2->PER.reg = period - 1;
}
TCC2->CTRLA.bit.PRESCALER = prescale;
TCC2->INTENSET.bit.OVF = 1;
TCC2->CTRLA.bit.ENABLE = 1;
NVIC_SetPriority(TCC2_0_IRQn, PERIODIC_INTERRUPT_PRIORITY);
NVIC_EnableIRQ(TCC2_0_IRQn);
}