Example #1
0
// [main_tc_configure]
static void configure_tc(void)
{
	uint32_t ul_div;
	uint32_t ul_tcclks;
	uint32_t ul_sysclk = sysclk_get_cpu_hz();

	/* Configure PMC */
	pmc_enable_periph_clk(ID_TC0);
#if SAMG55
	/* Enable PCK output */
	pmc_disable_pck(PMC_PCK_3);
	pmc_switch_pck_to_sclk(PMC_PCK_3, PMC_PCK_PRES_CLK_1);
	pmc_enable_pck(PMC_PCK_3);
#endif

	/** Configure TC for a 4Hz frequency and trigger on RC compare. */
	tc_find_mck_divisor(4, ul_sysclk, &ul_div, &ul_tcclks, ul_sysclk);
	tc_init(TC0, 0, ul_tcclks | TC_CMR_CPCTRG);
	tc_write_rc(TC0, 0, (ul_sysclk / ul_div) / 4);

	/* Configure and enable interrupt on RC compare */
	NVIC_EnableIRQ((IRQn_Type) ID_TC0);
	tc_enable_interrupt(TC0, 0, TC_IER_CPCS);

#ifdef LED1_GPIO
	/** Start the counter if LED1 is enabled. */
	if (g_b_led1_active) {
		tc_start(TC0, 0);
	}
#else
	tc_start(TC0, 0);
#endif
}
/**
 * \brief Configure UART with the given master clock, and Configure PCK with
 *  the given divider source of master clock and prescaler.
 *
 * \param ul_clock_source  The master clock divider source.
 * \param ul_prescaler Master Clock prescaler.
 * \param ul_master_clock Frequency of the master clock (in Hz).
 */
static void config_uart_and_pck(uint32_t ul_clock_source,
		uint32_t ul_prescaler, uint32_t ul_master_clock)
{
	if (ul_master_clock > BOARD_FREQ_SLCK_XTAL) {
		const sam_uart_opt_t uart_console_settings = {
			ul_master_clock, PMC_CLOCK_SWITCHING_EXAMPLE_BAUDRATE,
			UART_MR_PAR_NO
		};

		/* Configure PMC */
		pmc_enable_periph_clk(CONSOLE_UART_ID);

		/* Configure UART */
		uart_init(CONSOLE_UART, &uart_console_settings);
	}

	/* Programmable clock output disabled */
	pmc_disable_pck(GCLK_ID);

	/* Configure PMC Programmable Clock */
	switch (ul_clock_source) {
	case PMC_PCK_CSS_MAIN_CLK:
		pmc_switch_pck_to_mainck(GCLK_ID, ul_prescaler);
		break;

	case PMC_PCK_CSS_SLOW_CLK:
		pmc_switch_pck_to_sclk(GCLK_ID, ul_prescaler);
		break;

	case PMC_PCK_CSS_PLLA_CLK:
		pmc_switch_pck_to_pllack(GCLK_ID, ul_prescaler);
		break;

#if (SAM3S || SAM4S || SAM4C)
	case PMC_PCK_CSS_PLLB_CLK:
		pmc_switch_pck_to_pllbck(GCLK_ID, ul_prescaler);
		break;
#endif

	default:
		pmc_switch_pck_to_mainck(GCLK_ID, ul_prescaler);
	}

	/* Enable the PCK again */
	pmc_enable_pck(GCLK_ID);
}