1 #include "board.h"
2 #include <clock.h>
3 #include <gclk.h>
4 #include <system.h>
5 #include <rtthread.h>
6 /**
7  * This is the timer interrupt service routine.
8  *
9  */
SysTick_Handler(void)10 void SysTick_Handler(void)
11 {
12     /* enter interrupt */
13 	rt_interrupt_enter();
14 
15 	rt_tick_increase();
16 
17 	/* leave interrupt */
18 	rt_interrupt_leave();
19 }
20 
21 void configure_extosc32k(void);
22 void configure_dfll_open_loop(void);
23 
24 //! [setup]
25 //! [config_extosc32k]
configure_extosc32k(void)26 void configure_extosc32k(void)
27 {
28 //! [config_extosc32k_config]
29 	struct system_clock_source_xosc32k_config config_ext32k;
30 //! [config_extosc32k_config]
31 //! [config_extosc32k_get_defaults]
32 	system_clock_source_xosc32k_get_config_defaults(&config_ext32k);
33 //! [config_extosc32k_get_defaults]
34 
35 //! [config_extosc32k_change_defaults]
36 	config_ext32k.startup_time = SYSTEM_XOSC32K_STARTUP_4096;
37     config_ext32k.on_demand = false;
38 //! [config_extosc32k_change_defaults]
39 
40 //! [config_extosc32k_set_config]
41 	system_clock_source_xosc32k_set_config(&config_ext32k);
42 //! [config_extosc32k_set_config]
43 	system_clock_source_enable(SYSTEM_CLOCK_SOURCE_XOSC32K);
44 	while(!system_clock_source_is_ready(SYSTEM_CLOCK_SOURCE_XOSC32K));
45 }
46 //! [config_extosc32k]
47 
48 #if (!SAMC21)
49 //! [config_dfll]
configure_dfll_open_loop(void)50 void configure_dfll_open_loop(void)
51 {
52 //! [config_dfll_config]
53 	struct system_clock_source_dfll_config config_dfll;
54 //! [config_dfll_config]
55 //! [config_dfll_get_defaults]
56 	system_clock_source_dfll_get_config_defaults(&config_dfll);
57 //! [config_dfll_get_defaults]
58 	config_dfll.coarse_value    = (*((uint8_t*)(0x806020 + 7))) >> 2;// 0x1f / 4; /* Midpoint */
59 	config_dfll.fine_value      = (*((uint32_t*)(0x806020 + 8))) & 0x3FF;//0xff / 4; /* Midpoint */
60 //! [config_dfll_set_config]
61 	system_clock_source_dfll_set_config(&config_dfll);
62 //! [config_dfll_set_config]
63 
64 //! [enable_dfll_main]
65 	system_clock_source_enable(SYSTEM_CLOCK_SOURCE_DFLL);
66 	// while(!system_clock_source_is_ready(SYSTEM_CLOCK_SOURCE_DFLL));
67 
68 //! [enable_dfll_main]
69 	/* Configure flash wait states before switching to high frequency clock */
70 //! [set_sys_wait_states]
71 	system_flash_set_waitstates(2);
72 //! [set_sys_wait_states]
73 
74 	/* Change system clock to DFLL */
75 //! [set_sys_clk_src]
76 	struct system_gclk_gen_config config_gclock_gen;
77 	system_gclk_gen_get_config_defaults(&config_gclock_gen);
78 	config_gclock_gen.source_clock    = SYSTEM_CLOCK_SOURCE_DFLL;
79 	config_gclock_gen.division_factor = 1;
80 	system_gclk_gen_set_config(GCLK_GENERATOR_0, &config_gclock_gen);
81 //! [set_sys_clk_src]
82 }
83 //! [config_dfll]
84 #endif
85 
rt_board_init(void)86 void rt_board_init(void)
87 {
88     extern void uart_init(void);
89 
90     // configure_extosc32k();
91 
92     // configure_dfll_open_loop();
93 	system_init();
94 
95 	/* initialize systick */
96 	SystemCoreClock = system_gclk_gen_get_hz(0);
97 	SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
98 
99     uart_init();
100     rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
101 }
102 
103