github.com/tinygo-org/tinygo@v0.31.3-0.20240404173401-90b0bf646c27/src/runtime/runtime_atsamd21g18.go (about)

     1  //go:build sam && atsamd21 && atsamd21g18
     2  
     3  package runtime
     4  
     5  import (
     6  	"device/sam"
     7  )
     8  
     9  func initSERCOMClocks() {
    10  	// Turn on clock to SERCOM0 for UART0
    11  	sam.PM.APBCMASK.SetBits(sam.PM_APBCMASK_SERCOM0_)
    12  
    13  	// Use GCLK0 for SERCOM0 aka UART0
    14  	// GCLK_CLKCTRL_ID( clockId ) | // Generic Clock 0 (SERCOMx)
    15  	// GCLK_CLKCTRL_GEN_GCLK0 | // Generic Clock Generator 0 is source
    16  	// GCLK_CLKCTRL_CLKEN ;
    17  	sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_SERCOM0_CORE << sam.GCLK_CLKCTRL_ID_Pos) |
    18  		(sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) |
    19  		sam.GCLK_CLKCTRL_CLKEN)
    20  	waitForSync()
    21  
    22  	// Turn on clock to SERCOM1
    23  	sam.PM.APBCMASK.SetBits(sam.PM_APBCMASK_SERCOM1_)
    24  	sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_SERCOM1_CORE << sam.GCLK_CLKCTRL_ID_Pos) |
    25  		(sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) |
    26  		sam.GCLK_CLKCTRL_CLKEN)
    27  	waitForSync()
    28  
    29  	// Turn on clock to SERCOM2
    30  	sam.PM.APBCMASK.SetBits(sam.PM_APBCMASK_SERCOM2_)
    31  	sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_SERCOM2_CORE << sam.GCLK_CLKCTRL_ID_Pos) |
    32  		(sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) |
    33  		sam.GCLK_CLKCTRL_CLKEN)
    34  	waitForSync()
    35  
    36  	// Turn on clock to SERCOM3
    37  	sam.PM.APBCMASK.SetBits(sam.PM_APBCMASK_SERCOM3_)
    38  	sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_SERCOM3_CORE << sam.GCLK_CLKCTRL_ID_Pos) |
    39  		(sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) |
    40  		sam.GCLK_CLKCTRL_CLKEN)
    41  	waitForSync()
    42  
    43  	// Turn on clock to SERCOM4
    44  	sam.PM.APBCMASK.SetBits(sam.PM_APBCMASK_SERCOM4_)
    45  
    46  	// Use GCLK0 for SERCOM4
    47  	sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_SERCOM4_CORE << sam.GCLK_CLKCTRL_ID_Pos) |
    48  		(sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) |
    49  		sam.GCLK_CLKCTRL_CLKEN)
    50  	waitForSync()
    51  
    52  	// Turn on clock to SERCOM5
    53  	sam.PM.APBCMASK.SetBits(sam.PM_APBCMASK_SERCOM5_)
    54  
    55  	// Use GCLK0 for SERCOM5
    56  	sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_SERCOM5_CORE << sam.GCLK_CLKCTRL_ID_Pos) |
    57  		(sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) |
    58  		sam.GCLK_CLKCTRL_CLKEN)
    59  	waitForSync()
    60  }