/* Taktgenerator fuer RP2040 Pico Pi mit Ausgang an GPIO21. 2025-07-21 Michael Nowak www.mino-elektronik.de */ #include"rp2040_arduino.h" // Registerdefinitionen #define BIT(x) (1< VREG = 15<VREG & VREG_AND_CHIP_RESET_VREG_ROK_Msk)); kurz_warten(); // Vreg abwarten XOSC->CTRL = (XOSC_CTRL_FREQ_RANGE_1_15MHZ << XOSC_CTRL_FREQ_RANGE_Pos); XOSC->STARTUP = 100; // ca. 2 ms bei 12 MHz XOSC_SET->CTRL = (XOSC_CTRL_ENABLE_ENABLE << XOSC_CTRL_ENABLE_Pos); while (!(XOSC->STATUS & XOSC_STATUS_STABLE_Msk)); RESETS_CLR->RESET = RESETS_RESET_pll_sys_Msk; while (!(RESETS->RESET_DONE & RESETS_RESET_pll_sys_Msk)); PLL_SYS->PRIM = (PLL_DIV1 << PLL_SYS_PRIM_POSTDIV1_Pos) | // postdivider auf /6 einstellen (PLL_DIV2 << PLL_SYS_PRIM_POSTDIV2_Pos); PLL_SYS->CS = (REF_DIV << PLL_SYS_CS_REFDIV_Pos); // PLL-Aufloesung 6 MHz PLL_SYS->FBDIV_INT = (DEF_SYSCLOCK*PLL_DIV2*REF_DIV)/(MHZ_12/PLL_DIV1); // Sollfrequenz PLL_SYS_CLR->PWR = PLL_SYS_PWR_VCOPD_Msk | PLL_SYS_PWR_PD_Msk; while (!(PLL_SYS->CS & PLL_SYS_CS_LOCK_Msk)); PLL_SYS_CLR->PWR = PLL_SYS_PWR_POSTDIVPD_Msk; CLOCKS->CLK_REF_CTRL = (CLOCKS_CLK_REF_CTRL_SRC_xosc_clksrc << CLOCKS_CLK_REF_CTRL_SRC_Pos); CLOCKS->CLK_SYS_CTRL = (CLOCKS_CLK_SYS_CTRL_AUXSRC_clksrc_pll_sys << CLOCKS_CLK_SYS_CTRL_AUXSRC_Pos); CLOCKS_SET->CLK_SYS_CTRL = (CLOCKS_CLK_SYS_CTRL_SRC_clksrc_clk_sys_aux << CLOCKS_CLK_SYS_CTRL_SRC_Pos); CLOCKS->CLK_PERI_CTRL = CLOCKS_CLK_PERI_CTRL_ENABLE_Msk | (CLOCKS_CLK_PERI_CTRL_AUXSRC_clk_sys << CLOCKS_CLK_PERI_CTRL_AUXSRC_Pos); CLOCKS->CLK_ADC_CTRL = CLOCKS_CLK_ADC_CTRL_ENABLE_Msk | (CLOCKS_CLK_ADC_CTRL_AUXSRC_xosc_clksrc << CLOCKS_CLK_ADC_CTRL_AUXSRC_Pos); // enable GPIO RESETS_CLR->RESET = RESETS_RESET_io_bank0_Msk | RESETS_RESET_pads_bank0_Msk; while((RESETS->RESET_DONE & (RESETS_RESET_io_bank0_Msk | RESETS_RESET_pads_bank0_Msk)) != (RESETS_RESET_io_bank0_Msk | RESETS_RESET_pads_bank0_Msk)); CLOCKS->CLK_GPOUT0_CTRL = CLOCKS_CLK_GPOUT0_CTRL_ENABLE_Msk | // enable 6 << CLOCKS_CLK_GPOUT0_CTRL_AUXSRC_Pos; // pll_sys als Quelle IO_BANK0->GPIO21_CTRL = IO_BANK0_GPIO21_CTRL_FUNCSEL_clocks_gpout_0; // fester Ausgang PADS_BANK0->GPIO21 |= 3<GPIO_OE_SET = BIT(21); // Ausgang freigeben } void loop() { // put your main code here, to run repeatedly: }