/** * Configure TC0 to generate an interrupt every 4ms */ static void ConfigureTc0(void) { uint32_t div, tcclks; /* Enable TC0 peripheral */ PMC_EnablePeripheral(ID_TC0); /* Configure TC0 for 250Hz frequency and trigger on RC compare */ TC_FindMckDivisor(250, BOARD_MCK, &div, &tcclks, BOARD_MCK); TC_Configure(TC0, 0, tcclks | TC_CMR_CPCTRG); TC0->TC_CHANNEL[0].TC_RC = (BOARD_MCK / div) / 250; /* Configure and enable interrupt on RC compare */ NVIC_EnableIRQ(TC0_IRQn); TC0->TC_CHANNEL[0].TC_IER = TC_IER_CPCS; /* Start TC as event timer */ TC_Start(TC0, 0); }
/** * Configure Timer Counter 0 to generate an interrupt every 250ms. */ static void _ConfigureTc(void) { uint32_t div; uint32_t tcclks; /** Enable peripheral clock. */ PMC_EnablePeripheral(ID_TC0); /** Configure TC for a 4Hz frequency and trigger on RC compare. */ TC_FindMckDivisor(4, BOARD_MCK, &div, &tcclks, BOARD_MCK); TC_Configure(TC0, 0, tcclks | TC_CMR_CPCTRG); TC0->TC_CHANNEL[0].TC_RC = (BOARD_MCK / div) / 4; /* Configure and enable interrupt on RC compare */ NVIC_ClearPendingIRQ(TC0_IRQn); NVIC_EnableIRQ(TC0_IRQn); TC0->TC_CHANNEL[0].TC_IER = TC_IER_CPCS; /** Start the counter */ TC_Start(TC0, 0); }
/** * Initialize for timing operation */ void sys_init_timing(void) { uint32_t div; uint32_t tcclks; /* Clear tick value */ dwClockTick = 0; /* Enable peripheral clock. */ PMC_EnablePeripheral( ID_TC0 ) ; /* Configure TC for a CLOCK_CONF_SECOND frequency. */ TC_FindMckDivisor( CLOCK_CONF_SECOND, BOARD_MCK, &div, &tcclks, BOARD_MCK ); TC_Configure( TC0, 0, tcclks | TC_CMR_CPCTRG ); TC0->TC_CHANNEL[0].TC_RC = BOARD_MCK / (CLOCK_CONF_SECOND * div); /* Configure and enable interrupt on RC compare */ NVIC_ClearPendingIRQ(TC0_IRQn); NVIC_EnableIRQ(TC0_IRQn); TC0->TC_CHANNEL[ 0 ].TC_IER = TC_IER_CPCS ; /* Start timer */ TC_Start( TC0, 0 ); }
// Set up all timer interrupts void HAL::setupTimer() { uint32_t tc_count, tc_clock; pmc_set_writeprotect(false); // set 3 bits for interrupt group priority, 1 bits for sub-priority //NVIC_SetPriorityGrouping(4); #if USE_ADVANCE // Timer for extruder control pmc_enable_periph_clk(EXTRUDER_TIMER_IRQ); // enable power to timer //NVIC_SetPriority((IRQn_Type)EXTRUDER_TIMER_IRQ, NVIC_EncodePriority(4, 4, 1)); NVIC_SetPriority((IRQn_Type)EXTRUDER_TIMER_IRQ, 6); // count up to value in RC register using given clock TC_Configure(EXTRUDER_TIMER, EXTRUDER_TIMER_CHANNEL, TC_CMR_WAVSEL_UP_RC | TC_CMR_WAVE | TC_CMR_TCCLKS_TIMER_CLOCK3); TC_SetRC(EXTRUDER_TIMER, EXTRUDER_TIMER_CHANNEL, (F_CPU_TRUE / 32) / EXTRUDER_CLOCK_FREQ); // set frequency 43 for 60000Hz TC_Start(EXTRUDER_TIMER, EXTRUDER_TIMER_CHANNEL); // start timer running // enable RC compare interrupt EXTRUDER_TIMER->TC_CHANNEL[EXTRUDER_TIMER_CHANNEL].TC_IER = TC_IER_CPCS; // clear the "disable RC compare" interrupt EXTRUDER_TIMER->TC_CHANNEL[EXTRUDER_TIMER_CHANNEL].TC_IDR = ~TC_IER_CPCS; // allow interrupts on timer NVIC_EnableIRQ((IRQn_Type)EXTRUDER_TIMER_IRQ); #endif // Regular interrupts for heater control etc pmc_enable_periph_clk(PWM_TIMER_IRQ); //NVIC_SetPriority((IRQn_Type)PWM_TIMER_IRQ, NVIC_EncodePriority(4, 6, 0)); NVIC_SetPriority((IRQn_Type)PWM_TIMER_IRQ, 15); TC_FindMckDivisor(PWM_CLOCK_FREQ, F_CPU_TRUE, &tc_count, &tc_clock, F_CPU_TRUE); TC_Configure(PWM_TIMER, PWM_TIMER_CHANNEL, TC_CMR_WAVSEL_UP_RC | TC_CMR_WAVE | tc_clock); TC_SetRC(PWM_TIMER, PWM_TIMER_CHANNEL, (F_CPU_TRUE / tc_count) / PWM_CLOCK_FREQ); TC_Start(PWM_TIMER, PWM_TIMER_CHANNEL); PWM_TIMER->TC_CHANNEL[PWM_TIMER_CHANNEL].TC_IER = TC_IER_CPCS; PWM_TIMER->TC_CHANNEL[PWM_TIMER_CHANNEL].TC_IDR = ~TC_IER_CPCS; NVIC_EnableIRQ((IRQn_Type)PWM_TIMER_IRQ); // Timer for stepper motor control pmc_enable_periph_clk(TIMER1_TIMER_IRQ ); //NVIC_SetPriority((IRQn_Type)TIMER1_TIMER_IRQ, NVIC_EncodePriority(4, 7, 1)); // highest priority - no surprises here wanted NVIC_SetPriority((IRQn_Type)TIMER1_TIMER_IRQ,2); // highest priority - no surprises here wanted TC_Configure(TIMER1_TIMER, TIMER1_TIMER_CHANNEL, TC_CMR_WAVSEL_UP_RC | TC_CMR_WAVE | TC_CMR_TCCLKS_TIMER_CLOCK1); TC_SetRC(TIMER1_TIMER, TIMER1_TIMER_CHANNEL, (F_CPU_TRUE / TIMER1_PRESCALE) / TIMER1_CLOCK_FREQ); TC_Start(TIMER1_TIMER, TIMER1_TIMER_CHANNEL); TIMER1_TIMER->TC_CHANNEL[TIMER1_TIMER_CHANNEL].TC_IER = TC_IER_CPCS; TIMER1_TIMER->TC_CHANNEL[TIMER1_TIMER_CHANNEL].TC_IDR = ~TC_IER_CPCS; NVIC_EnableIRQ((IRQn_Type)TIMER1_TIMER_IRQ); // Servo control #if FEATURE_SERVO #if SERVO0_PIN > -1 SET_OUTPUT(SERVO0_PIN); WRITE(SERVO0_PIN, LOW); #endif #if SERVO1_PIN > -1 SET_OUTPUT(SERVO1_PIN); WRITE(SERVO1_PIN, LOW); #endif #if SERVO2_PIN > -1 SET_OUTPUT(SERVO2_PIN); WRITE(SERVO2_PIN, LOW); #endif #if SERVO3_PIN > -1 SET_OUTPUT(SERVO3_PIN); WRITE(SERVO3_PIN, LOW); #endif pmc_enable_periph_clk(SERVO_TIMER_IRQ ); //NVIC_SetPriority((IRQn_Type)SERVO_TIMER_IRQ, NVIC_EncodePriority(4, 5, 0)); NVIC_SetPriority((IRQn_Type)SERVO_TIMER_IRQ,4); TC_Configure(SERVO_TIMER, SERVO_TIMER_CHANNEL, TC_CMR_WAVSEL_UP_RC | TC_CMR_WAVE | TC_CMR_TCCLKS_TIMER_CLOCK1); TC_SetRC(SERVO_TIMER, SERVO_TIMER_CHANNEL, (F_CPU_TRUE / SERVO_PRESCALE) / SERVO_CLOCK_FREQ); TC_Start(SERVO_TIMER, SERVO_TIMER_CHANNEL); SERVO_TIMER->TC_CHANNEL[SERVO_TIMER_CHANNEL].TC_IER = TC_IER_CPCS; SERVO_TIMER->TC_CHANNEL[SERVO_TIMER_CHANNEL].TC_IDR = ~TC_IER_CPCS; NVIC_EnableIRQ((IRQn_Type)SERVO_TIMER_IRQ); #endif }