You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.5 KiB
C
134 lines
3.5 KiB
C
#ifndef PORTHARDWARE_H
|
|
#define PORTHARDWARE_H
|
|
|
|
#include "FreeRTOSConfig.h"
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
#define CLR_INT(FLAG_REG, FLAG_MASK) \
|
|
asm volatile( "push r16\n\t" \
|
|
"ldi r16, %1\n\t" \
|
|
"sts %0, r16\n\t" \
|
|
"pop r16\n\t" \
|
|
: \
|
|
: "i"(_SFR_MEM_ADDR(FLAG_REG)),"i"((uint8_t)(FLAG_MASK)) \
|
|
);
|
|
|
|
#if ( configUSE_TIMER_INSTANCE == 0 )
|
|
|
|
#define TICK_INT_vect TCB0_INT_vect
|
|
#define INT_FLAGS TCB0_INTFLAGS
|
|
#define INT_MASK TCB_CAPT_bm
|
|
|
|
#define TICK_init() { \
|
|
TCB0.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \
|
|
TCB0.INTCTRL = TCB_CAPT_bm; \
|
|
TCB0.CTRLA = TCB_ENABLE_bm; \
|
|
}
|
|
|
|
#define TICK_stop() { \
|
|
TCB0.INTCTRL &= ~TCB_CAPT_bm;\
|
|
TCB0.CTRLA &= ~TCB_ENABLE_bm; \
|
|
}
|
|
|
|
#elif ( configUSE_TIMER_INSTANCE == 1 )
|
|
|
|
#define TICK_INT_vect TCB1_INT_vect
|
|
#define INT_FLAGS TCB1_INTFLAGS
|
|
#define INT_MASK TCB_CAPT_bm
|
|
|
|
#define TICK_init() { \
|
|
TCB1.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \
|
|
TCB1.INTCTRL = TCB_CAPT_bm; \
|
|
TCB1.CTRLA = TCB_ENABLE_bm; \
|
|
}
|
|
|
|
#define TICK_stop() { \
|
|
TCB1.INTCTRL &= ~TCB_CAPT_bm; \
|
|
TCB1.CTRLA &= ~TCB_ENABLE_bm; \
|
|
}
|
|
|
|
#elif ( configUSE_TIMER_INSTANCE == 2 )
|
|
|
|
#define TICK_INT_vect TCB2_INT_vect
|
|
#define INT_FLAGS TCB2_INTFLAGS
|
|
#define INT_MASK TCB_CAPT_bm
|
|
|
|
#define TICK_init() { \
|
|
TCB2.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \
|
|
TCB2.INTCTRL = TCB_CAPT_bm; \
|
|
TCB2.CTRLA = TCB_ENABLE_bm; \
|
|
}
|
|
|
|
#define TICK_stop() { \
|
|
TCB2.INTCTRL &= ~TCB_CAPT_bm; \
|
|
TCB2.CTRLA &= ~TCB_ENABLE_bm; \
|
|
}
|
|
|
|
#elif ( configUSE_TIMER_INSTANCE == 3 )
|
|
|
|
#define TICK_INT_vect TCB3_INT_vect
|
|
#define INT_FLAGS TCB3_INTFLAGS
|
|
#define INT_MASK TCB_CAPT_bm
|
|
|
|
#define TICK_init() { \
|
|
TCB3.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \
|
|
TCB3.INTCTRL = TCB_CAPT_bm; \
|
|
TCB3.CTRLA = TCB_ENABLE_bm; \
|
|
}
|
|
|
|
#define TICK_stop() { \
|
|
TCB3.INTCTRL &= ~TCB_CAPT_bm; \
|
|
TCB3.CTRLA &= ~TCB_ENABLE_bm; \
|
|
}
|
|
|
|
#elif ( configUSE_TIMER_INSTANCE == 4 )
|
|
|
|
#define TICK_INT_vect TCB4_INT_vect
|
|
#define INT_FLAGS TCB4_INTFLAGS
|
|
#define INT_MASK TCB_CAPT_bm
|
|
|
|
#define TICK_init() { \
|
|
TCB4.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \
|
|
TCB4.INTCTRL = TCB_CAPT_bm; \
|
|
TCB4.CTRLA = TCB_ENABLE_bm; \
|
|
}
|
|
|
|
#define TICK_stop() { \
|
|
TCB4.INTCTRL &= ~TCB_CAPT_bm; \
|
|
TCB4.CTRLA &= ~TCB_ENABLE_bm; \
|
|
}
|
|
|
|
#elif ( configUSE_TIMER_INSTANCE == 5 )
|
|
|
|
/* Hertz to period for RTC setup */
|
|
#define RTC_PERIOD_HZ(x) (32768 * ((1.0 / x)))
|
|
|
|
#define TICK_INT_vect RTC_CNT_vect
|
|
#define INT_FLAGS RTC_INTFLAGS
|
|
#define INT_MASK RTC_OVF_bm
|
|
|
|
#define TICK_init() { \
|
|
while (RTC.STATUS > 0); \
|
|
RTC.CTRLA = RTC_PRESCALER_DIV1_gc | 1 << RTC_RTCEN_bp; \
|
|
RTC.PER = RTC_PERIOD_HZ(configTICK_RATE_HZ); \
|
|
RTC.INTCTRL |= 1 << RTC_OVF_bp; \
|
|
}
|
|
|
|
#define TICK_stop() { \
|
|
RTC.CTRLA &= ~(1 << RTC_RTCEN_bp); \
|
|
RTC.INTCTRL &= ~(1 << RTC_OVF_bp); \
|
|
}
|
|
|
|
#else
|
|
#undef TICK_INT_vect
|
|
#undef INT_FLAGS
|
|
#undef INT_MASK
|
|
#undef TICK_init()
|
|
#error Invalid timer setting.
|
|
#endif
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
#endif /* PORTHARDWARE_H */
|