我使用bl-pac来进行开发,我参考c的例程后发现其初始化步骤为:

当我按照例程的方式,通过pac去编写rust程序时发现似乎无法通过pac来进行相关操作。例如在使能XTAL的时候,例程使用如下的方式开启:

BL_Err_Type ATTR_CLOCK_SECTION AON_Power_On_XTAL(void)
{
    uint32_t tmpVal = 0;
    uint32_t timeOut = 0;

    tmpVal = BL_RD_REG(AON_BASE, AON_RF_TOP_AON);
    tmpVal = BL_SET_REG_BIT(tmpVal, AON_PU_XTAL_AON);
    tmpVal = BL_SET_REG_BIT(tmpVal, AON_PU_XTAL_BUF_AON);
    BL_WR_REG(AON_BASE, AON_RF_TOP_AON, tmpVal);

    /* Polling for ready */
    do {
        arch_delay_us(10);
        timeOut++;
        tmpVal = BL_RD_REG(AON_BASE, AON_TSEN);
    } while (!BL_IS_REG_BIT_SET(tmpVal, AON_XTAL_RDY) && timeOut < 120);

    if (timeOut >= 120) {
        return TIMEOUT;
    }

    return SUCCESS;
}

但在pac中没有相关的aon模块,通过搜索xtal可以找到XTAL32K_SPEC in bl616_pac::hbn::xtal32k - Rust (docs.rs),但这个寄存器在芯片的参考手册中似乎没有相关描述。

如果我使用pac进行开发的话,我应该遵循怎样的初始化流程?

    我通过查阅bouffalolab/bouffalo_sdk (github.com)后,在bouffalo_sdk/drivers/soc/bl616/std/include/hardware/hbn_reg.h at master · bouffalolab/bouffalo_sdk (github.com)找到了该寄存器的定义:

        /* 0x204 : xtal32k */
        union {
            struct {
                uint32_t reserved_0_1         : 2; /* [ 1: 0],       rsvd,        0x0 */
                uint32_t xtal32k_ext_sel      : 1; /* [    2],        r/w,        0x0 */
                uint32_t xtal32k_amp_ctrl     : 2; /* [ 4: 3],        r/w,        0x1 */
                uint32_t xtal32k_reg          : 2; /* [ 6: 5],        r/w,        0x1 */
                uint32_t xtal32k_outbuf_stre  : 1; /* [    7],        r/w,        0x0 */
                uint32_t xtal32k_otf_short    : 1; /* [    8],        r/w,        0x0 */
                uint32_t xtal32k_inv_stre     : 2; /* [10: 9],        r/w,        0x1 */
                uint32_t xtal32k_capbank      : 6; /* [16:11],        r/w,       0x20 */
                uint32_t xtal32k_ac_cap_short : 1; /* [   17],        r/w,        0x0 */
                uint32_t pu_xtal32k_buf       : 1; /* [   18],        r/w,        0x1 */
                uint32_t pu_xtal32k           : 1; /* [   19],        r/w,        0x0 */
                uint32_t xtal32k_lowv_en      : 1; /* [   20],        r/w,        0x0 */
                uint32_t xtal32k_hiz_en       : 1; /* [   21],        r/w,        0x1 */
                uint32_t dten_xtal32k         : 1; /* [   22],        r/w,        0x0 */
                uint32_t ten_xtal32k          : 1; /* [   23],        r/w,        0x0 */
                uint32_t reserved_24_31       : 8; /* [31:24],       rsvd,        0x0 */
            } BF;
            uint32_t WORD;
        } xtal32k;

    根据该定义,我将pu_xtal32k置1后是否就代表着已经使能xtal?例如这样:

        // 获取外设
        let peripherals = get_peripherals();
    
        let hbn = peripherals.HBN;
    
        // 配置MCU时钟源
        // 使能xtal32k
        hbn.xtal32k
            .modify(|r, w| unsafe { w.bits(r.bits() | (1 << 19)) });
      Write a Reply...
      @ 2025 Bouffalo Lab (Nanjing) Co., Ltd. All rights reserved.