#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 */