summaryrefslogtreecommitdiff
path: root/bsp/samd21/board/board.c
blob: 282a179281d6d9001b1332597882217519814252 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include "board.h"
#include <clock.h>
#include <gclk.h>
#include <system.h>
#include <rtthread.h>
/**
 * This is the timer interrupt service routine.
 *
 */
void SysTick_Handler(void)
{
    /* enter interrupt */
	rt_interrupt_enter();

	rt_tick_increase();

	/* leave interrupt */
	rt_interrupt_leave();
}

void configure_extosc32k(void);
void configure_dfll_open_loop(void);

//! [setup]
//! [config_extosc32k]
void configure_extosc32k(void)
{
//! [config_extosc32k_config]
	struct system_clock_source_xosc32k_config config_ext32k;
//! [config_extosc32k_config]
//! [config_extosc32k_get_defaults]
	system_clock_source_xosc32k_get_config_defaults(&config_ext32k);
//! [config_extosc32k_get_defaults]

//! [config_extosc32k_change_defaults]
	config_ext32k.startup_time = SYSTEM_XOSC32K_STARTUP_4096;
    config_ext32k.on_demand = false;
//! [config_extosc32k_change_defaults]

//! [config_extosc32k_set_config]
	system_clock_source_xosc32k_set_config(&config_ext32k);
//! [config_extosc32k_set_config]
	system_clock_source_enable(SYSTEM_CLOCK_SOURCE_XOSC32K);
	while(!system_clock_source_is_ready(SYSTEM_CLOCK_SOURCE_XOSC32K));
}
//! [config_extosc32k]

#if (!SAMC21)
//! [config_dfll]
void configure_dfll_open_loop(void)
{
//! [config_dfll_config]
	struct system_clock_source_dfll_config config_dfll;
//! [config_dfll_config]
//! [config_dfll_get_defaults]
	system_clock_source_dfll_get_config_defaults(&config_dfll);
//! [config_dfll_get_defaults]
	config_dfll.coarse_value    = (*((uint8_t*)(0x806020 + 7))) >> 2;// 0x1f / 4; /* Midpoint */
	config_dfll.fine_value      = (*((uint32_t*)(0x806020 + 8))) & 0x3FF;//0xff / 4; /* Midpoint */
//! [config_dfll_set_config]
	system_clock_source_dfll_set_config(&config_dfll);
//! [config_dfll_set_config]

//! [enable_dfll_main]
	system_clock_source_enable(SYSTEM_CLOCK_SOURCE_DFLL);
	// while(!system_clock_source_is_ready(SYSTEM_CLOCK_SOURCE_DFLL));

//! [enable_dfll_main]
	/* Configure flash wait states before switching to high frequency clock */
//! [set_sys_wait_states]
	system_flash_set_waitstates(2);
//! [set_sys_wait_states]

	/* Change system clock to DFLL */
//! [set_sys_clk_src]
	struct system_gclk_gen_config config_gclock_gen;
	system_gclk_gen_get_config_defaults(&config_gclock_gen);
	config_gclock_gen.source_clock    = SYSTEM_CLOCK_SOURCE_DFLL;
	config_gclock_gen.division_factor = 1;
	system_gclk_gen_set_config(GCLK_GENERATOR_0, &config_gclock_gen);
//! [set_sys_clk_src]
}
//! [config_dfll]
#endif

void rt_board_init(void)
{
    extern void uart_init(void);

    // configure_extosc32k();

    // configure_dfll_open_loop();
	system_init();

	/* initialize systick */
	SystemCoreClock = system_gclk_gen_get_hz(0);
	SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);

    uart_init();
    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
}