ATSAMD GCLK[x] 用于更多外设

ATSAMD GCLK[x] for more Peripherals

是否可以将一个GCLK用于更多外设?

ATSAMD09C13 有六个 GCLK 发生器,但这还不够。

这个例子有效:

GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(SERCOM0_GCLK_ID_CORE) |
  GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN(0);

这个有两个 ID 的例子是行不通的:

GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(SERCOM0_GCLK_ID_CORE) | GCLK_CLKCTRL_ID(GCLK_CLKCTRL_ID_WDT) | 
  GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN(0);

是否有解决这个问题的方法?

在寄存器 GCLK_CLKCTRL 中,字段 ID 不是位掩码,而是包含您要配置的外围设备的编号。 您不能通过 ORing 多个 ID 来组合它们。

改为单独配置每个设备:

这是 Harmony3 生成的一些代码,用于向多个设备提供 GCLK0 / GCLK1


    /* Selection of the Generator and write Lock for WDT */
    GCLK_REGS->GCLK_CLKCTRL = GCLK_CLKCTRL_ID(3) | GCLK_CLKCTRL_GEN(0x0)  | GCLK_CLKCTRL_CLKEN_Msk;

    /* Selection of the Generator and write Lock for EIC */
    GCLK_REGS->GCLK_CLKCTRL = GCLK_CLKCTRL_ID(5) | GCLK_CLKCTRL_GEN(0x1)  | GCLK_CLKCTRL_CLKEN_Msk;

    /* Selection of the Generator and write Lock for SERCOM0_CORE */
    GCLK_REGS->GCLK_CLKCTRL = GCLK_CLKCTRL_ID(14) | GCLK_CLKCTRL_GEN(0x1)  | GCLK_CLKCTRL_CLKEN_Msk;

    /* Selection of the Generator and write Lock for TC1 TC2 */
    GCLK_REGS->GCLK_CLKCTRL = GCLK_CLKCTRL_ID(18) | GCLK_CLKCTRL_GEN(0x1)  | GCLK_CLKCTRL_CLKEN_Msk;

    /* Selection of the Generator and write Lock for ADC */
    GCLK_REGS->GCLK_CLKCTRL = GCLK_CLKCTRL_ID(19) | GCLK_CLKCTRL_GEN(0x0)  | GCLK_CLKCTRL_CLKEN_Msk;