periph_cpu.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 Otto-von-Guericke-Universität Magdeburg
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v2.1. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
20 #ifndef PERIPH_CPU_H
21 #define PERIPH_CPU_H
22 
23 #include "cpu.h"
24 #include "vendor/RP2040.h"
25 #include "io_reg.h"
26 #include "macros/units.h"
27 #include "periph/pio.h" /* pio_t */
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 #if !defined(PLL_SYS_REF_DIV) || defined(DOXYGEN)
39 #define PLL_SYS_REF_DIV 1
40 #endif
41 
42 #if !defined(PLL_USB_REF_DIV) || defined(DOXYGEN)
46 #define PLL_USB_REF_DIV 1
47 #endif
48 
49 #if !defined(PLL_SYS_VCO_FEEDBACK_SCALE) || defined(DOXYGEN)
56 #define PLL_SYS_VCO_FEEDBACK_SCALE 125
57 #endif
58 
59 #if !defined(PLL_SYS_POSTDIV1) || defined(DOXYGEN)
65 #define PLL_SYS_POSTDIV1 6
66 #endif
67 
68 #if !defined(PLL_SYS_POSTDIV2) || defined(DOXYGEN)
74 #define PLL_SYS_POSTDIV2 2
75 #endif
76 
77 #if !defined(PLL_USB_VCO_FEEDBACK_SCALE) || defined(DOXYGEN)
84 #define PLL_USB_VCO_FEEDBACK_SCALE 40
85 #endif
86 
87 #if !defined(PLL_USB_POSTDIV1) || defined(DOXYGEN)
93 #define PLL_USB_POSTDIV1 5
94 #endif
95 
96 #if !defined(PLL_USB_POSTDIV2) || defined(DOXYGEN)
102 #define PLL_USB_POSTDIV2 2
103 #endif
104 
105 #if !defined(CLOCK_XOSC) || defined(DOXYGEN)
110 #define CLOCK_XOSC MHZ(12)
111 #endif
112 
116 #define PLL_CLOCK(vco_feedback, postdiv1, postdiv2) \
117  (CLOCK_XOSC * (vco_feedback) / (postdiv1) / (postdiv2))
118 
122 #define CLOCK_CORECLOCK \
123  PLL_CLOCK(PLL_SYS_VCO_FEEDBACK_SCALE, PLL_SYS_POSTDIV1, PLL_SYS_POSTDIV2)
124 
128 #define CLOCK_USB \
129  PLL_CLOCK(PLL_USB_VCO_FEEDBACK_SCALE, PLL_USB_POSTDIV1, PLL_USB_POSTDIV2)
130 
135 #define CLOCK_XOSC_MAX MHZ(15)
136 #define CLOCK_XOSC_MIN MHZ(5)
137 #define PLL_POSTDIV_MIN (1U)
138 #define PLL_POSTDIV_MAX (7U)
139 #define PLL_VCO_FEEDBACK_SCALE_MIN (16U)
140 #define PLL_VCO_FEEDBACK_SCALE_MAX (320U)
141 #define PLL_REF_DIV_MIN (1U)
143 #define PLL_REF_DIV_MAX (1U)
147 #if CLOCK_USB != MHZ(48)
148 #error "USB clock != 48 MHz, check PLL_USB_VCO_FEEDBACK_SCALE, PLL_USB_POSTDIV1, PLL_SYS_POSTDIV2"
149 #endif
150 
151 #if (CLOCK_XOSC > CLOCK_XOSC_MAX) || (CLOCK_XOSC < CLOCK_XOSC_MIN)
152 #error "Value for CLOCK_XOSC out of range, check config"
153 #endif
154 
155 #if (PLL_SYS_REF_DIV < PLL_REF_DIV_MIN) || (PLL_SYS_REF_DIV > PLL_REF_DIV_MAX)
156 #error "Value for PLL_SYS_REF_DIV out of range, check config"
157 #endif
158 
159 #if (PLL_USB_REF_DIV < PLL_REF_DIV_MIN) || (PLL_USB_REF_DIV > PLL_REF_DIV_MAX)
160 #error "Value for PLL_USB_REF_DIV out of range, check config"
161 #endif
162 
163 #if (PLL_SYS_VCO_FEEDBACK_SCALE < PLL_VCO_FEEDBACK_SCALE_MIN) \
164  || (PLL_SYS_VCO_FEEDBACK_SCALE > PLL_VCO_FEEDBACK_SCALE_MAX)
165 #error "Value for PLL_SYS_VCO_FEEDBACK_SCALE out of range, check config"
166 #endif
167 
168 #if (PLL_USB_VCO_FEEDBACK_SCALE < PLL_VCO_FEEDBACK_SCALE_MIN) \
169  || (PLL_USB_VCO_FEEDBACK_SCALE > PLL_VCO_FEEDBACK_SCALE_MAX)
170 #error "Value for PLL_USB_VCO_FEEDBACK_SCALE out of range, check config"
171 #endif
172 
173 #if (PLL_SYS_POSTDIV1 < PLL_POSTDIV_MIN) || (PLL_SYS_POSTDIV1 > PLL_POSTDIV_MAX)
174 #error "Value for PLL_SYS_POSTDIV1 out of range, check config"
175 #endif
176 
177 #if (PLL_SYS_POSTDIV2 < PLL_POSTDIV_MIN) || (PLL_SYS_POSTDIV2 > PLL_POSTDIV_MAX)
178 #error "Value for PLL_SYS_POSTDIV2 out of range, check config"
179 #endif
180 
181 #if (PLL_USB_POSTDIV1 < PLL_POSTDIV_MIN) || (PLL_USB_POSTDIV1 > PLL_POSTDIV_MAX)
182 #error "Value for PLL_USB_POSTDIV1 out of range, check config"
183 #endif
184 
185 #if (PLL_USB_POSTDIV2 < PLL_POSTDIV_MIN) || (PLL_USB_POSTDIV2 > PLL_POSTDIV_MAX)
186 #error "Value for PLL_USB_POSTDIV2 out of range, check config"
187 #endif
188 
189 #if !defined(CLOCK_PERIPH_SOURCE) || defined(DOXYGEN)
193 #define CLOCK_PERIPH_SOURCE CLOCKS_CLK_PERI_CTRL_AUXSRC_clk_sys
194 #endif
195 
196 #if !defined(CLOCK_PERIPH) || defined(DOXYGEN)
200 #define CLOCK_PERIPH CLOCK_CORECLOCK
201 #endif
202 
206 #define RESETS_RESET_MASK \
207  (RESETS_RESET_usbctrl_Msk | \
208  RESETS_RESET_uart1_Msk | \
209  RESETS_RESET_uart0_Msk | \
210  RESETS_RESET_timer_Msk | \
211  RESETS_RESET_tbman_Msk | \
212  RESETS_RESET_sysinfo_Msk | \
213  RESETS_RESET_syscfg_Msk | \
214  RESETS_RESET_spi1_Msk | \
215  RESETS_RESET_spi0_Msk | \
216  RESETS_RESET_rtc_Msk | \
217  RESETS_RESET_pwm_Msk | \
218  RESETS_RESET_pll_usb_Msk | \
219  RESETS_RESET_pll_sys_Msk | \
220  RESETS_RESET_pio1_Msk | \
221  RESETS_RESET_pio0_Msk | \
222  RESETS_RESET_pads_qspi_Msk | \
223  RESETS_RESET_pads_bank0_Msk | \
224  RESETS_RESET_jtag_Msk | \
225  RESETS_RESET_io_qspi_Msk | \
226  RESETS_RESET_io_bank0_Msk | \
227  RESETS_RESET_i2c1_Msk | \
228  RESETS_RESET_i2c0_Msk | \
229  RESETS_RESET_dma_Msk | \
230  RESETS_RESET_busctrl_Msk | \
231  RESETS_RESET_adc_Msk)
232 
239 #define GPIO_PIN(port, pin) ((((port) & 0)) | (pin))
240 
245 #define HAVE_GPIO_T
246 typedef uint32_t gpio_t;
252 #define GPIO_UNDEF UINT32_MAX
253 
258 #define HAVE_GPIO_FLANK_T
259 typedef enum {
262  GPIO_FALLING = 0x4,
263  GPIO_RISING = 0x8,
264  GPIO_BOTH = 0xc
275 #define GPIO_PAD_REGISTER_RESET_VALUE (0x00000056)
279 enum {
285 };
286 
290 typedef struct {
291  uint32_t slew_rate_fast : 1;
292  uint32_t schmitt_trig_enable : 1;
293  uint32_t pull_down_enable : 1;
294  uint32_t pull_up_enable : 1;
295  uint32_t drive_strength : 2;
296  uint32_t input_enable : 1;
297  uint32_t output_disable : 1;
299  uint32_t : 24;
310 #define GPIO_IO_REGISTER_RESET_VALUE (0x0000001f)
314 typedef enum {
315  FUNCTION_SELECT_SPI = 1,
319  FUNCTION_SELECT_I2C = 3,
321  FUNCTION_SELECT_PWM = 4,
328  FUNCTION_SELECT_USB = 9,
332 
336 enum {
342 };
343 
347 enum {
353 };
354 
358 enum {
364 };
365 
369 enum {
375 };
376 
380 typedef struct {
381  uint32_t function_select : 5;
382  uint32_t : 3;
383  uint32_t output_override : 2;
384  uint32_t : 2;
385  uint32_t output_enable_override : 2;
386  uint32_t : 2;
387  uint32_t input_override : 2;
388  uint32_t : 10;
389  uint32_t irq_override : 2;
390  uint32_t : 2;
397 typedef struct {
398  gpio_t pin;
399  uint8_t chan;
400 } adc_conf_t;
401 
405 #define PWM_SLICE_NUMOF (8)
406 
410 #define PWM_CHANNEL_NUMOF (2)
411 
415 typedef struct {
416  gpio_t pin;
417  uint8_t cc_chan;
418 } pwm_chan_t;
419 
423 typedef struct {
424  uint8_t pwm_slice;
428 } pwm_conf_t;
429 
433 typedef struct {
434  UART0_Type *dev;
435  gpio_t rx_pin;
436  gpio_t tx_pin;
437  IRQn_Type irqn;
438 } uart_conf_t;
439 
443 #define PERIPH_TIMER_PROVIDES_SET
444 
448 typedef struct {
451 
457 typedef struct {
458  TIMER_Type *dev;
460  uint8_t ch_numof;
461 } timer_conf_t;
462 
466 typedef struct {
467  PIO0_Type *dev;
470 } pio_conf_t;
471 
475 typedef struct {
477  gpio_t sda;
478  gpio_t scl;
479  unsigned irq;
481 
487 static inline volatile uint32_t * gpio_pad_register(uint8_t pin)
488 {
489  return (uint32_t *)(PADS_BANK0_BASE + 4 + (pin << 2));
490 }
491 
496 static inline void gpio_set_pad_config(uint8_t pin, gpio_pad_ctrl_t config)
497 {
498  uint32_t *c = (uint32_t *)&config;
499  *gpio_pad_register(pin) = *c;
500 }
501 
505 static inline volatile uint32_t * gpio_io_register(uint8_t pin)
506 {
507  return (uint32_t *)(IO_BANK0_BASE + 4 + (pin << 3));
508 }
509 
514 static inline void gpio_set_io_config(uint8_t pin, gpio_io_ctrl_t config)
515 {
516  uint32_t *c = (uint32_t *)&config;
517  *gpio_io_register(pin) = *c;
518 }
519 
523 static inline void gpio_set_function_select(uint8_t pin, gpio_function_select_t funcsel)
524 {
525  io_reg_write_dont_corrupt(gpio_io_register(pin), funcsel << IO_BANK0_GPIO0_CTRL_FUNCSEL_Pos,
526  IO_BANK0_GPIO0_CTRL_FUNCSEL_Msk);
527 }
528 
532 static inline void gpio_reset_all_config(uint8_t pin)
533 {
536 }
537 
544 static inline void periph_reset(uint32_t components)
545 {
546  io_reg_atomic_set(&RESETS->RESET, components);
547 }
548 
555 static inline void periph_reset_done(uint32_t components)
556 {
557  io_reg_atomic_clear(&RESETS->RESET, components);
558  while ((~RESETS->RESET_DONE) & components) { }
559 }
560 
574 void clock_sys_configure_source(uint32_t f_in, uint32_t f_out,
575  CLOCKS_CLK_SYS_CTRL_SRC_Enum source);
576 
587 void clock_sys_configure_aux_source(uint32_t f_in, uint32_t f_out,
588  CLOCKS_CLK_SYS_CTRL_AUXSRC_Enum aux);
589 
600 void clock_ref_configure_source(uint32_t f_in, uint32_t f_out,
601  CLOCKS_CLK_REF_CTRL_SRC_Enum source);
602 
613 void clock_ref_configure_aux_source(uint32_t f_in, uint32_t f_out,
614  CLOCKS_CLK_REF_CTRL_AUXSRC_Enum aux);
615 
622 void clock_periph_configure(CLOCKS_CLK_PERI_CTRL_AUXSRC_Enum aux);
623 
634 void clock_gpout0_configure(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_GPOUT0_CTRL_AUXSRC_Enum aux);
635 
646 void clock_gpout1_configure(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_GPOUT1_CTRL_AUXSRC_Enum aux);
647 
658 void clock_gpout2_configure(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_GPOUT2_CTRL_AUXSRC_Enum aux);
659 
670 void clock_gpout3_configure(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_GPOUT3_CTRL_AUXSRC_Enum aux);
671 
678 void clock_adc_configure(CLOCKS_CLK_ADC_CTRL_AUXSRC_Enum aux);
697 void pll_start_sys(uint8_t ref_div,
698  uint16_t vco_feedback_scale,
699  uint8_t post_div_1, uint8_t post_div_2);
700 
712 void pll_start_usb(uint8_t ref_div,
713  uint16_t vco_feedback_scale,
714  uint8_t post_div_1, uint8_t post_div_2);
715 
719 void pll_stop_sys(void);
720 
724 void pll_stop_usb(void);
725 
729 void pll_reset_sys(void);
730 
734 void pll_reset_usb(void);
735 
751 void xosc_start(uint32_t f_ref);
752 
756 void xosc_stop(void);
757 
771 void rosc_start(void);
772 
778 void rosc_stop(void);
779 
786 #define HAVE_SPI_CLK_T
787 enum {
793 };
794 
798 typedef uint32_t spi_clk_t;
804 typedef struct {
805  SPI0_Type *dev;
806  gpio_t miso_pin;
807  gpio_t mosi_pin;
808  gpio_t clk_pin;
809 } spi_conf_t;
810 
811 #define PERIPH_SPI_NEEDS_TRANSFER_REG
812 #define PERIPH_SPI_NEEDS_TRANSFER_REGS
813 #define PERIPH_SPI_NEEDS_TRANSFER_BYTE
814 
815 #ifdef __cplusplus
816 }
817 #endif
818 
819 #endif /* PERIPH_CPU_H */
gpio_flank_t
Definition: periph_cpu.h:180
spi_clk_t
Definition: periph_cpu.h:352
gpio_t adc_conf_t
ADC configuration wrapper.
Definition: periph_cpu.h:337
High-level PIO peripheral driver interface.
enum IRQn IRQn_Type
Interrupt Number Definition.
unsigned int gpio_t
GPIO type identifier.
Definition: gpio.h:92
@ GPIO_LEVEL_LOW
emit interrupt level-triggered on low input
Definition: periph_cpu.h:260
@ GPIO_FALLING
emit interrupt on falling flank
Definition: periph_cpu.h:109
@ GPIO_LEVEL_HIGH
emit interrupt level-triggered on low input
Definition: periph_cpu.h:261
@ GPIO_RISING
emit interrupt on rising flank
Definition: periph_cpu.h:110
@ GPIO_BOTH
emit interrupt on both flanks
Definition: periph_cpu.h:111
unsigned pio_t
PIO index type.
Definition: pio.h:71
@ SPI_CLK_10MHZ
drive the SPI bus with 10MHz
Definition: periph_cpu.h:357
@ SPI_CLK_5MHZ
drive the SPI bus with 5MHz
Definition: periph_cpu.h:356
@ SPI_CLK_400KHZ
drive the SPI bus with 400KHz
Definition: periph_cpu.h:354
@ SPI_CLK_1MHZ
drive the SPI bus with 1MHz
Definition: periph_cpu.h:355
@ SPI_CLK_100KHZ
drive the SPI bus with 100KHz
Definition: periph_cpu.h:353
RP2040 atomic register access macros.
static void io_reg_atomic_clear(volatile uint32_t *reg, uint32_t mask)
Clear the bits in the register at address reg as given by the set bits in operand op.
Definition: io_reg.h:100
static void io_reg_write_dont_corrupt(volatile uint32_t *reg, uint32_t value, uint32_t mask)
Updates part of an I/O register without corrupting its contents.
Definition: io_reg.h:128
static void io_reg_atomic_set(volatile uint32_t *reg, uint32_t mask)
Set the bits in the register at address reg as given by the set bits in operand op.
Definition: io_reg.h:88
void rosc_start(void)
Start the ring oscillator in default mode.
void clock_gpout2_configure(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_GPOUT2_CTRL_AUXSRC_Enum aux)
Configure gpio24 as clock output pin.
static volatile uint32_t * gpio_io_register(uint8_t pin)
Get the IO control register for the given GPIO pin as word.
Definition: periph_cpu.h:505
void clock_gpout3_configure(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_GPOUT3_CTRL_AUXSRC_Enum aux)
Configure gpio25 as clock output pin.
static void gpio_set_pad_config(uint8_t pin, gpio_pad_ctrl_t config)
Convenience function to set the pad configuration of the given pin using the bit-field convenience ty...
Definition: periph_cpu.h:496
gpio_function_select_t
Possible function values for gpio_io_ctrl_t::function_select.
Definition: periph_cpu.h:314
@ FUNCTION_SELECT_PIO0
connect pin to the first PIO peripheral
Definition: periph_cpu.h:324
@ FUNCTION_SELECT_CLOCK
connect pin to the timer (depending on pin: external clock, clock output, or not supported)
Definition: periph_cpu.h:326
@ FUNCTION_SELECT_PIO1
connect pin to the second PIO peripheral
Definition: periph_cpu.h:325
@ FUNCTION_SELECT_I2C
connect pin to the I2C peripheral (SCL/SDA depends on pin)
Definition: periph_cpu.h:319
@ FUNCTION_SELECT_PWM
connect pin to the timer for PWM (channel depends on pin)
Definition: periph_cpu.h:321
@ FUNCTION_SELECT_UART
connect pin to the UART peripheral (TXD/RXD depends on pin)
Definition: periph_cpu.h:317
@ FUNCTION_SELECT_USB
connect pin to the USB peripheral (function depends on pin)
Definition: periph_cpu.h:328
@ FUNCTION_SELECT_SIO
use pin as vanilla GPIO
Definition: periph_cpu.h:323
@ FUNCTION_SELECT_SPI
connect pin to the SPI peripheral (MISO/MOSI/SCK depends on pin)
Definition: periph_cpu.h:315
@ FUNCTION_SELECT_NONE
Reset value, pin unconnected.
Definition: periph_cpu.h:330
@ INPUT_OVERRIDE_LOW
signal low to connected peripheral
Definition: periph_cpu.h:361
@ INPUT_OVERRIDE_INVERT
invert signal to connected peripheral
Definition: periph_cpu.h:360
@ INPUT_OVERRIDE_NUMOF
number of possible input override settings
Definition: periph_cpu.h:363
@ INPUT_OVERRIDE_NOMARL
don't mess with peripheral input signal
Definition: periph_cpu.h:359
@ INPUT_OVERRIDE_HIGH
signal high to connected peripheral
Definition: periph_cpu.h:362
@ OUTPUT_OVERRIDE_HIGH
drive pin high, overriding peripheral signal
Definition: periph_cpu.h:340
@ OUTPUT_OVERRIDE_NORMAL
drive pin from connected peripheral
Definition: periph_cpu.h:337
@ OUTPUT_OVERRIDE_LOW
drive pin low, overriding peripheral signal
Definition: periph_cpu.h:339
@ OUTPUT_OVERRIDE_NUMOF
number of possible output override settings
Definition: periph_cpu.h:341
@ OUTPUT_OVERRIDE_INVERT
drive pin from connected peripheral, but invert output
Definition: periph_cpu.h:338
void xosc_start(uint32_t f_ref)
Configures the Crystal to run.
static void gpio_reset_all_config(uint8_t pin)
Restore the default I/O and PAD configuration of the given GPIO pin.
Definition: periph_cpu.h:532
void pll_start_usb(uint8_t ref_div, uint16_t vco_feedback_scale, uint8_t post_div_1, uint8_t post_div_2)
Start the PLL for the USB clock output[MHz] = f_ref / ref_div * vco_feedback_scale / post_div_1 / pos...
void pll_stop_sys(void)
Stop the PLL of the system clock.
void clock_adc_configure(CLOCKS_CLK_ADC_CTRL_AUXSRC_Enum aux)
Configure the ADC clock to run from a dedicated auxiliary clock source.
static volatile uint32_t * gpio_pad_register(uint8_t pin)
Get the PAD control register for the given GPIO pin as word.
Definition: periph_cpu.h:487
static void gpio_set_function_select(uint8_t pin, gpio_function_select_t funcsel)
Set the function select subregister for the given pin to the given value.
Definition: periph_cpu.h:523
void xosc_stop(void)
Stop the crystal.
#define GPIO_PAD_REGISTER_RESET_VALUE
Reset value of the GPIO pad configuration register.
Definition: periph_cpu.h:275
void clock_ref_configure_aux_source(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_REF_CTRL_AUXSRC_Enum aux)
Configure the reference clock to run from an auxiliary clock source, like PLL.
#define PWM_CHANNEL_NUMOF
Number of channels available per slice.
Definition: periph_cpu.h:410
static void gpio_set_io_config(uint8_t pin, gpio_io_ctrl_t config)
Convenience function to set the I/O configuration of the given pin using the bit-field convenience ty...
Definition: periph_cpu.h:514
@ OUTPUT_ENABLE_OVERRIDE_NUMOF
number of possible output enable override settings
Definition: periph_cpu.h:352
@ OUTPUT_ENABLE_OVERRIDE_DISABLE
disable output, overriding peripheral signal
Definition: periph_cpu.h:350
@ OUTPUT_ENABLE_OVERRIDE_NOMARL
enable output as specified by connected peripheral
Definition: periph_cpu.h:348
@ OUTPUT_ENABLE_OVERRIDE_ENABLE
enable output, overriding peripheral signal
Definition: periph_cpu.h:351
@ OUTPUT_ENABLE_OVERRIDE_INVERT
invert output enable setting of peripheral
Definition: periph_cpu.h:349
void clock_ref_configure_source(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_REF_CTRL_SRC_Enum source)
Configure the reference clock to run from a clock source, which is either the ROSC or the XOSC.
void pll_stop_usb(void)
Stop the PLL of the USB clock.
@ DRIVE_STRENGTH_NUMOF
number of different drive strength options
Definition: periph_cpu.h:284
@ DRIVE_STRENGTH_4MA
set driver strength to 4 mA
Definition: periph_cpu.h:281
@ DRIVE_STRENGTH_8MA
set driver strength to 8 mA
Definition: periph_cpu.h:282
@ DRIVE_STRENGTH_12MA
set driver strength to 12 mA
Definition: periph_cpu.h:283
@ DRIVE_STRENGTH_2MA
set driver strength to 2 mA
Definition: periph_cpu.h:280
@ IRQ_OVERRIDE_INVERT
invert IRQ signal
Definition: periph_cpu.h:371
@ IRQ_OVERRIDE_LOW
set IRQ signal to low
Definition: periph_cpu.h:372
@ IRQ_OVERRIDE_NORMAL
don't mess with IRQ signal
Definition: periph_cpu.h:370
@ IRQ_OVERRIDE_HIGH
set IRQ signal to high
Definition: periph_cpu.h:373
@ IRQ_OVERRIDE_NUMOF
number of possible IRQ override settings
Definition: periph_cpu.h:374
void clock_sys_configure_aux_source(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_SYS_CTRL_AUXSRC_Enum aux)
Configure the system clock to run from an auxiliary clock source, like PLL.
void pll_reset_sys(void)
Reset the PLL of the system clock.
void pll_reset_usb(void)
Reset the PLL of the USB clock.
void clock_sys_configure_source(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_SYS_CTRL_SRC_Enum source)
Configure the system clock to run from the reference clock, which is the default on boot.
void clock_gpout1_configure(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_GPOUT1_CTRL_AUXSRC_Enum aux)
Configure gpio23 as clock output pin.
void clock_gpout0_configure(uint32_t f_in, uint32_t f_out, CLOCKS_CLK_GPOUT0_CTRL_AUXSRC_Enum aux)
Configure gpio21 as clock output pin.
void pll_start_sys(uint8_t ref_div, uint16_t vco_feedback_scale, uint8_t post_div_1, uint8_t post_div_2)
Start the PLL for the system clock output[MHz] = f_ref / ref_div * vco_feedback_scale / post_div_1 / ...
static void periph_reset_done(uint32_t components)
Waits until hardware components have been reset.
Definition: periph_cpu.h:555
void clock_periph_configure(CLOCKS_CLK_PERI_CTRL_AUXSRC_Enum aux)
Configure the peripheral clock to run from a dedicated auxiliary clock source.
#define GPIO_IO_REGISTER_RESET_VALUE
Reset value of the GPIO I/O configuration register.
Definition: periph_cpu.h:310
void rosc_stop(void)
Turn off the ROSC to save power.
static void periph_reset(uint32_t components)
Reset hardware components.
Definition: periph_cpu.h:544
Memory layout of GPIO control register in IO bank 0.
Definition: periph_cpu.h:380
uint32_t output_enable_override
output enable override
Definition: periph_cpu.h:385
uint32_t input_override
input value override
Definition: periph_cpu.h:387
uint32_t irq_override
interrupt inversion override
Definition: periph_cpu.h:389
uint32_t output_override
output value override
Definition: periph_cpu.h:383
uint32_t function_select
select GPIO function
Definition: periph_cpu.h:381
Memory layout of GPIO control register in pads bank 0.
Definition: periph_cpu.h:290
uint32_t pull_up_enable
enable pull up resistor
Definition: periph_cpu.h:294
uint32_t schmitt_trig_enable
enable Schmitt trigger
Definition: periph_cpu.h:292
uint32_t input_enable
enable as input
Definition: periph_cpu.h:296
uint32_t slew_rate_fast
set slew rate control to fast
Definition: periph_cpu.h:291
uint32_t output_disable
disable output, overwrite output enable from peripherals
Definition: periph_cpu.h:297
uint32_t drive_strength
GPIO driver strength.
Definition: periph_cpu.h:295
uint32_t pull_down_enable
enable pull down resistor
Definition: periph_cpu.h:293
PIO configuration type.
Definition: periph_cpu.h:466
IRQn_Type irqn0
PIO IRQ0 interrupt number.
Definition: periph_cpu.h:468
IRQn_Type irqn1
PIO IRQ1 interrupt number.
Definition: periph_cpu.h:469
PIO0_Type * dev
PIO device.
Definition: periph_cpu.h:467
PIO I2C configuration type.
Definition: periph_cpu.h:475
gpio_t sda
Pin to use as SDA pin.
Definition: periph_cpu.h:477
pio_t pio
PIO number of the PIO to run this configuration.
Definition: periph_cpu.h:476
unsigned irq
PIO IRQ line to use.
Definition: periph_cpu.h:479
gpio_t scl
Pin to use as SCL pin.
Definition: periph_cpu.h:478
PWM channel.
Definition: periph_cpu.h:469
PWM device configuration.
uint8_t pwm_slice
PWM slice instance, must be < to PWM_SLICE_NUMOF.
Definition: periph_cpu.h:424
SPI device configuration.
Definition: periph_cpu.h:337
SPI0_Type * dev
Base address of the I/O registers of the device.
Definition: periph_cpu.h:805
gpio_t clk_pin
GPIO pin to use for CLK.
Definition: periph_cpu.h:808
Configuration type of a timer channel.
Definition: periph_cpu.h:448
IRQn_Type irqn
timer channel interrupt number
Definition: periph_cpu.h:449
Timer device configuration.
Definition: periph_cpu.h:264
const timer_channel_conf_t * ch
pointer to timer channel configuration
Definition: periph_cpu.h:459
uint8_t ch_numof
number of timer channels
Definition: periph_cpu.h:460
UART device configuration.
Definition: periph_cpu.h:218
UART0_Type * dev
Base address of the I/O registers of the device.
Definition: periph_cpu.h:434
Unit helper macros.
#define MHZ(x)
A macro to return the Hz in x MHz.
Definition: units.h:49
#define KHZ(x)
A macro to return the Hz in x kHz.
Definition: units.h:44