Blame view

RIOT/boards/samd21-xpro/include/periph_conf.h 9.19 KB
a752c7ab   elopes   add first test an...
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
  /*
   * Copyright (C) 2017 Travis Griggs <travisgriggs@gmail.com>
   * Copyright (C) 2017 Dan Evans <photonthunder@gmail.com>
   *
   * This file is subject to the terms and conditions of the GNU Lesser
   * General Public License v2.1. See the file LICENSE in the top level
   * directory for more details.
   */
  
  /**
   * @ingroup     boards_samd21-xpro
   * @{
   *
   * @file
   * @brief       Configuration of CPU peripherals for the Atmel SAM D21 Xplained
   *              Pro board
   *
   * @author      Travis Griggs <travisgriggs@gmail.com>
   * @author      Dan Evans <photonthunder@gmail.com>
   */
  
  #ifndef PERIPH_CONF_H
  #define PERIPH_CONF_H
  
  #include <stdint.h>
  
  #include "cpu.h"
  #include "periph_cpu.h"
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  /**
   * @name   External oscillator and clock configuration
   *
   * There are three choices for selection of CORECLOCK:
   *
   * - usage of the 48 MHz DFLL fed by external oscillator running at 32 kHz
   * - usage of the PLL fed by the internal 8MHz oscillator divided by 8
   * - usage of the internal 8MHz oscillator directly, divided by N if needed
   *
   *
   * The PLL option allows for the usage of a wider frequency range and a more
   * stable clock with less jitter. This is why this option is default.
   *
   * The target frequency is computed from the PLL multiplier and the PLL divisor.
   * Use the following formula to compute your values:
   *
   * CORECLOCK = ((PLL_MUL + 1) * 1MHz) / PLL_DIV
   *
   * NOTE: The PLL circuit does not run with less than 32MHz while the maximum PLL
   *       frequency is 96MHz. So PLL_MULL must be between 31 and 95!
   *
   *
   * The internal Oscillator used directly can lead to a slightly better power
   * efficiency to the cost of a less stable clock. Use this option when you know
   * what you are doing! The actual core frequency is adjusted as follows:
   *
   * CORECLOCK = 8MHz / DIV
   *
   * NOTE: A core clock frequency below 1MHz is not recommended
   *
   * @{
   */
  #define CLOCK_USE_PLL       (1)
  
  #if CLOCK_USE_PLL
  /* edit these values to adjust the PLL output frequency */
  #define CLOCK_PLL_MUL       (47U)               /* must be >= 31 & <= 95 */
  #define CLOCK_PLL_DIV       (1U)                /* adjust to your needs */
  /* generate the actual used core clock frequency */
  #define CLOCK_CORECLOCK     (((CLOCK_PLL_MUL + 1) * 1000000U) / CLOCK_PLL_DIV)
  #elif CLOCK_USE_XOSC32_DFLL
  /* Settings for 32 kHz external oscillator and 48 MHz DFLL */
  #define CLOCK_CORECLOCK     (48000000U)
  #define CLOCK_XOSC32K       (32768UL)
  #define CLOCK_8MHZ          (1)
  #define GEN2_ULP32K         (1)
  #else
  /* edit this value to your needs */
  #define CLOCK_DIV           (1U)
  /* generate the actual core clock frequency */
  #define CLOCK_CORECLOCK     (8000000 / CLOCK_DIV)
  #endif
  /** @} */
  
  /**
   * @name Timer peripheral configuration
   * @{
   */
  #define TIMER_NUMOF         (2U)
  #define TIMER_0_EN          1
  #define TIMER_1_EN          1
  
  /* Timer 0 configuration */
  #define TIMER_0_DEV         TC3->COUNT16
  #define TIMER_0_CHANNELS    2
  #define TIMER_0_MAX_VALUE   (0xffff)
  #define TIMER_0_ISR         isr_tc3
  
  /* Timer 1 configuration */
  #define TIMER_1_DEV         TC4->COUNT32
  #define TIMER_1_CHANNELS    2
  #define TIMER_1_MAX_VALUE   (0xffffffff)
  #define TIMER_1_ISR         isr_tc4
  /** @} */
  
  /**
   * @name UART configuration
   * @{
   */
  static const uart_conf_t uart_config[] = {
      {    /* Virtual COM Port */
          .dev      = &SERCOM3->USART,
          .rx_pin   = GPIO_PIN(PA,23),
          .tx_pin   = GPIO_PIN(PA,22),
          .mux      = GPIO_MUX_C,
          .rx_pad   = UART_PAD_RX_1,
          .tx_pad   = UART_PAD_TX_0,
          .flags    = UART_FLAG_NONE,
          .gclk_src = GCLK_CLKCTRL_GEN_GCLK0
      },
      {    /* EXT1 */
          .dev    = &SERCOM4->USART,
          .rx_pin = GPIO_PIN(PB,9),
          .tx_pin = GPIO_PIN(PB,8),
          .mux    = GPIO_MUX_D,
          .rx_pad = UART_PAD_RX_1,
          .tx_pad = UART_PAD_TX_0,
          .flags  = UART_FLAG_NONE,
          .gclk_src = GCLK_CLKCTRL_GEN_GCLK0
      },
      {    /* EXT2/3 */
          .dev    = &SERCOM4->USART,
          .rx_pin = GPIO_PIN(PB,11),
          .tx_pin = GPIO_PIN(PB,10),
          .mux    = GPIO_MUX_D,
          .rx_pad = UART_PAD_RX_3,
          .tx_pad = UART_PAD_TX_2,
          .flags  = UART_FLAG_NONE,
          .gclk_src = GCLK_CLKCTRL_GEN_GCLK0
      }
  };
  
  /* interrupt function name mapping */
  #define UART_0_ISR          isr_sercom3
  #define UART_1_ISR          isr_sercom4
  #define UART_2_ISR          isr_sercom5
  
  #define UART_NUMOF          (sizeof(uart_config) / sizeof(uart_config[0]))
  /** @} */
  
  /**
   * @name PWM configuration
   * @{
   */
  #define PWM_0_EN            1
  #define PWM_1_EN            0
  #define PWM_2_EN            0
  #define PWM_MAX_CHANNELS    2
  /* for compatibility with test application */
  #define PWM_0_CHANNELS      PWM_MAX_CHANNELS
  #define PWM_1_CHANNELS      PWM_MAX_CHANNELS
  #define PWM_2_CHANNELS      PWM_MAX_CHANNELS
  
  /* PWM device configuration */
  static const pwm_conf_t pwm_config[] = {
  #if PWM_0_EN
      {TCC2, {
          /* GPIO pin, MUX value, TCC channel */
          { GPIO_PIN(PA, 12), GPIO_MUX_E, 0 },
          { GPIO_PIN(PA, 13), GPIO_MUX_E, 1 },
      }},
  #endif
  #if PWM_1_EN
      {TC4, {
          /* GPIO pin, MUX value, TCC channel */
          { GPIO_PIN(PB, 12), GPIO_MUX_E, 0 },
          { GPIO_PIN(PB, 13), GPIO_MUX_E, 1 },
      }}
  #endif
  #if PWM_2_EN
      {TC6, {
          /* GPIO pin, MUX value, TCC channel */
          { GPIO_PIN(PB, 02), GPIO_MUX_E, 0 },
          { GPIO_PIN(PB, 03), GPIO_MUX_E, 1 },
      }}
  #endif
  };
  
  /* number of devices that are actually defined */
  #define PWM_NUMOF           (3U)
  /** @} */
  
  /**
   * @name SPI configuration
   * @{
   */
  static const spi_conf_t spi_config[] = {
      {   /* EXT1 */
          .dev      = &SERCOM0->SPI,
          .miso_pin = GPIO_PIN(PA, 4),
          .mosi_pin = GPIO_PIN(PA, 6),
          .clk_pin  = GPIO_PIN(PA, 7),
          .miso_mux = GPIO_MUX_D,
          .mosi_mux = GPIO_MUX_D,
          .clk_mux  = GPIO_MUX_D,
          .miso_pad = SPI_PAD_MISO_0,
          .mosi_pad = SPI_PAD_MOSI_2_SCK_3
      },
      {   /* EXT2 */
          .dev      = &SERCOM1->SPI,
          .miso_pin = GPIO_PIN(PA, 16),
          .mosi_pin = GPIO_PIN(PA, 18),
          .clk_pin  = GPIO_PIN(PA, 19),
          .miso_mux = GPIO_MUX_C,
          .mosi_mux = GPIO_MUX_C,
          .clk_mux  = GPIO_MUX_C,
          .miso_pad = SPI_PAD_MISO_0,
          .mosi_pad = SPI_PAD_MOSI_2_SCK_3
      },
      {   /* EXT3 */
          .dev      = &SERCOM5->SPI,
          .miso_pin = GPIO_PIN(PB, 16),
          .mosi_pin = GPIO_PIN(PB, 22),
          .clk_pin  = GPIO_PIN(PB, 23),
          .miso_mux = GPIO_MUX_C,
          .mosi_mux = GPIO_MUX_D,
          .clk_mux  = GPIO_MUX_D,
          .miso_pad = SPI_PAD_MISO_0,
          .mosi_pad = SPI_PAD_MOSI_2_SCK_3
      }
  };
  
  #define SPI_NUMOF           (sizeof(spi_config) / sizeof(spi_config[0]))
  /** @} */
  
  /**
   * @name I2C configuration
   * @{
   */
  #define I2C_NUMOF          (1U)
  #define I2C_0_EN            1
  #define I2C_1_EN            0
  #define I2C_2_EN            0
  #define I2C_3_EN            0
  #define I2C_IRQ_PRIO        1
  
  #define I2C_0_DEV           SERCOM2->I2CM
  #define I2C_0_IRQ           SERCOM2_IRQn
  #define I2C_0_ISR           isr_sercom2
  /* I2C 0 GCLK */
  #define I2C_0_GCLK_ID       SERCOM2_GCLK_ID_CORE
  #define I2C_0_GCLK_ID_SLOW  SERCOM2_GCLK_ID_SLOW
  /* I2C 0 pin configuration */
  #define I2C_0_SDA           GPIO_PIN(PA, 8)
  #define I2C_0_SCL           GPIO_PIN(PA, 9)
  #define I2C_0_MUX           GPIO_MUX_D
  
  /**
   * @name RTC configuration
   * @{
   */
  #define RTC_NUMOF           (1U)
  #define RTC_DEV             RTC->MODE2
  /** @} */
  
  /**
   * @name RTT configuration
   * @{
   */
  #define RTT_NUMOF           (1U)
  #define RTT_DEV             RTC->MODE0
  #define RTT_IRQ             RTC_IRQn
  #define RTT_IRQ_PRIO        10
  #define RTT_ISR             isr_rtc
  #define RTT_MAX_VALUE       (0xffffffff)
  #define RTT_FREQUENCY       (32768U)    /* in Hz. For changes see `rtt.c` */
  #define RTT_RUNSTDBY        (1)         /* Keep RTT running in sleep states */
  /** @} */
  
  /**
   * @name ADC Configuration
   * @{
   */
  #define ADC_0_EN                           1
  #define ADC_MAX_CHANNELS                   14
  /* ADC 0 device configuration */
  #define ADC_0_DEV                          ADC
  #define ADC_0_IRQ                          ADC_IRQn
  
  /* ADC 0 Default values */
  #define ADC_0_CLK_SOURCE                   0 /* GCLK_GENERATOR_0 */
  #define ADC_0_PRESCALER                    ADC_CTRLB_PRESCALER_DIV512
  
  #define ADC_0_NEG_INPUT                    ADC_INPUTCTRL_MUXNEG_GND
  #define ADC_0_GAIN_FACTOR_DEFAULT          ADC_INPUTCTRL_GAIN_1X
  #define ADC_0_REF_DEFAULT                  ADC_REFCTRL_REFSEL_INT1V
  
  static const adc_conf_chan_t adc_channels[] = {
      /* port, pin, muxpos */
      {GPIO_PIN(PB, 0), ADC_INPUTCTRL_MUXPOS_PIN8},      /* EXT1, pin 3 */
      {GPIO_PIN(PB, 1), ADC_INPUTCTRL_MUXPOS_PIN9},      /* EXT1, pin 4 */
      {GPIO_PIN(PA, 10), ADC_INPUTCTRL_MUXPOS_PIN18},    /* EXT2, pin 3 */
      {GPIO_PIN(PA, 11), ADC_INPUTCTRL_MUXPOS_PIN19},    /* EXT2, pin 4 */
      {GPIO_PIN(PA, 2), ADC_INPUTCTRL_MUXPOS_PIN0},      /* EXT3, pin 3 */
      {GPIO_PIN(PA, 3), ADC_INPUTCTRL_MUXPOS_PIN1}       /* EXT3, pin 4. This is
                          disconnected by default. PA3 is connected to USB_ID.
                          Move PA03 SELECT jumper to EXT3 to connect. */
  };
  
  #define ADC_0_CHANNELS                     (6U)
  #define ADC_NUMOF                          ADC_0_CHANNELS
  /** @} */
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif /* PERIPH_CONF_H */
  /** @} */