source: rtos_arduino/trunk/arduino_lib/hardware/arduino/samd/cores/arduino/wiring.c@ 175

Last change on this file since 175 was 175, checked in by ertl-honda, 8 years ago

ライブラリを Arduino IDE 1.7.9 にupdate

File size: 3.8 KB
Line 
1/*
2 Copyright (c) 2011 Arduino. All right reserved.
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 See the GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17*/
18
19#include "variant.h"
20#include "wiring_digital.h"
21#include "wiring.h"
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
27/*
28 * System Core Clock is at 1MHz at Reset.
29 * It is switched to 48MHz in the Reset Handler (startup.c)
30 */
31uint32_t SystemCoreClock=1000000ul ;
32
33/*
34 * Arduino Zero board initialization
35 *
36 * Good to know:
37 * - At reset, ResetHandler did the system clock configuration. Core is running at 48MHz.
38 * - Watchdog is disabled by default, unless someone plays with NVM User page
39 * - During reset, all PORT lines are configured as inputs with input buffers, output buffers and pull disabled.
40 */
41void init( void )
42{
43 uint32_t ul ;
44
45 // Set Systick to 1ms interval, common to all Cortex-M variants
46 if ( SysTick_Config( SystemCoreClock / 1000 ) )
47 {
48 // Capture error
49 while ( 1 ) ;
50 }
51
52// Clock PORT for Digital I/O
53// PM->APBBMASK.reg |= PM_APBBMASK_PORT ;
54//
55// Clock EIC for I/O interrupts
56// PM->APBAMASK.reg |= PM_APBAMASK_EIC ;
57
58 // Clock SERCOM for Serial
59 PM->APBCMASK.reg |= PM_APBCMASK_SERCOM0 | PM_APBCMASK_SERCOM1 | PM_APBCMASK_SERCOM2 | PM_APBCMASK_SERCOM3 | PM_APBCMASK_SERCOM4 | PM_APBCMASK_SERCOM5 ;
60
61 // Clock TC/TCC for Pulse and Analog
62 PM->APBCMASK.reg |= PM_APBCMASK_TCC0 | PM_APBCMASK_TCC1 | PM_APBCMASK_TCC2 | PM_APBCMASK_TC3 | PM_APBCMASK_TC4 | PM_APBCMASK_TC5 | PM_APBCMASK_TC6 | PM_APBCMASK_TC7 ;
63
64 // Clock ADC/DAC for Analog
65 PM->APBCMASK.reg |= PM_APBCMASK_ADC | PM_APBCMASK_DAC ;
66
67 // Setup all pins (digital and analog) in INPUT mode (default is nothing)
68 for ( ul = 0 ; ul < NUM_DIGITAL_PINS ; ul++ )
69 {
70 pinMode( ul, INPUT ) ;
71 }
72
73 // Initialize Analog Controller
74 // Setting clock
75 GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID( GCM_ADC ) | // Generic Clock ADC
76 GCLK_CLKCTRL_GEN_GCLK0 | // Generic Clock Generator 0 is source
77 GCLK_CLKCTRL_CLKEN ;
78 // Setting CTRLB
79 ADC->CTRLB.reg = ADC_CTRLB_PRESCALER_DIV128 | // Divide Clock by 128.
80 ADC_CTRLB_RESSEL_10BIT; // Result on 10 bits
81 ADC->INPUTCTRL.reg = ADC_INPUTCTRL_MUXNEG_GND | // No Negative input (Internal Ground)
82 ADC_INPUTCTRL_GAIN_DIV2; // Gain setted to 1/2
83 // Averaging (see table 31-2 p.816 datasheet)
84 ADC->AVGCTRL.reg = ADC_AVGCTRL_SAMPLENUM_2 | // 2 samples
85 ADC_AVGCTRL_ADJRES(0x01ul); // Adjusting result by 1
86
87 ADC->SAMPCTRL.reg = 0x3f;
88 ADC->REFCTRL.reg = ADC_REFCTRL_REFSEL_INTVCC1; // Reference intvcc1 [default]
89
90 ADC->CTRLA.bit.ENABLE = 1; // Enable ADC
91 while( ADC->STATUS.bit.SYNCBUSY == 1 )
92 {
93 // Waiting for synchroinization
94 }
95
96 // Initialize DAC
97 // Setting clock
98 GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID( GCM_DAC ) | // Generic Clock ADC
99 GCLK_CLKCTRL_GEN_GCLK0 | // Generic Clock Generator 0 is source
100 GCLK_CLKCTRL_CLKEN ;
101
102
103 DAC->CTRLB.reg = DAC_CTRLB_REFSEL_AVCC | // Using the 3.3V reference
104 DAC_CTRLB_EOEN; // External Output Enable (Vout)
105 DAC->DATA.reg = 0x3FFul;
106}
107
108#ifdef __cplusplus
109}
110#endif
Note: See TracBrowser for help on using the repository browser.