This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2340R5:如何在 CC2340R5上验证32K

Guru**** 2587565 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1228887/cc2340r5-how-can-i-verify-32k-on-cc2340r5

器件型号:CC2340R5

您好专家。

以前 CCXXX2 AGAMA 平台上的任何芯片、
我们都使用以下程序来进行32K 测试。

    //IOCPortConfigureSet(20, IOC_PORT_AON_CLK32K, IOC_STD_OUTPUT);
    //AONIOC32kHzOutputEnable();
    //while(1);

但在 CC2340 SDK 中、似乎没有 AONIOC32kHzOutputEnable 函数。
CC2340中的32K 测试方法是否有任何更改? 您能告诉我如何在 CC2340中测试32K 吗?

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    要验证 CC23XX 平台上的时钟、您需要按照其他方法操作。 您可以将时钟输出到 GPIO 上、并从外部测量 GPIO 以验证时钟信号的频率。

    以下函数应将低频时钟输出到 GPIO 上:

    uint8_t gLfTickToGpio_enabled = 0;
    static void LftickToGpio_dtb5_dio24_enable()
    {
        if (gLfTickToGpio_enabled)
            return;
        else
            gLfTickToGpio_enabled = 1;
    
        // DIO24 can be driven by DTB5
        const uint8_t dtb_bit = 5;
        const uint8_t dio = 24;
        const uint8_t dsel_lftick = 13; // LFTICK is bit 4
    
        // drive output low first
        GPIO_setConfig(IOC_O_IOC24, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
    
        // Configure the IOC.IOC24.PORTCFG MMR to select DTB
        HWREG(IOC_BASE + IOC_O_IOC24) &= ~IOC_IOC24_PORTCFG_M;
        HWREG(IOC_BASE + IOC_O_IOC24) |= IOC_IOC24_PORTCFG_DTB;
    
        // Select the DTB mux selects in IOC (and if required in source clock IP) in such a way that zero is driven on DTB0
        //         Example: Configure IOC.DTBCFG.ULLSELL = 1 to select CKM DTB0
        // ULLSEL mux select (select CKM)
        HWREG(IOC_BASE + IOC_O_DTBCFG) &= ~IOC_DTBCFG_ULLSEL_M;
        HWREG(IOC_BASE + IOC_O_DTBCFG) |= 0x1 << IOC_DTBCFG_ULLSEL_S; // 0x1 to route CKM (CKMDIG) to DTB0 (DTB bit 0)
    
        // Enable IOC.DTBOE.EN5
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN5_M;
        HWREG(IOC_BASE + IOC_O_DTBOE) |= IOC_DTBOE_EN5_EN;
    
        // Step 1: select 5-bit signal group to output on DTB[5:1]
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_DSEL0_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= dsel_lftick << CKMD_DTBCTL_DSEL0_S;
    
        // Step 2: Configure CKMD.DTBCTL.EN=1 for Enabling DTB output
        // enable DTB output
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_EN_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= CKMD_DTBCTL_EN;
    }
    
    static void LftickToGpio_dtb5_dio24_disable()
    {
        // Enable IOC.DTBOE.EN5
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN5_M;
        gLfTickToGpio_enabled = 0;
    }

    要启用此功能、可使用以下功能:

    uint8_t gXtalToGpio_isEnabled = 0;
    static void XtalToGpio_enable(Xtal_Select_e xtalType)
    {
        uint8_t clockSrc;
    
        if (xtalType == Xtal_Select_e_HFOSC || xtalType == Xtal_Select_e_HFXT)
        {
            clockSrc = 0xC;
        }
        else if (xtalType == Xtal_Select_e_LFOSC || xtalType == Xtal_Select_e_LFXT)
        {
            clockSrc = 0x7;
        }
        else
        {
            return; // invalid
        }
    
        if (gXtalToGpio_isEnabled)
        {
            return;
        }
        else
        {
            gXtalToGpio_isEnabled = 1;
        }
    
        // drive output low first
        GPIO_setConfig(DTB0_DIO_ID, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
    
        // Configure the IOC.IOC19.PORTCFG MMR to select DTB
        HWREG(IOC_BASE + IOC_O_IOC19) &= ~IOC_IOC19_PORTCFG_M;
        HWREG(IOC_BASE + IOC_O_IOC19) |= IOC_IOC19_PORTCFG_DTB;
    
        // Select the DTB mux selects in IOC (and if required in source clock IP) in such a way that zero is driven on DTB0
        //         Example: Configure IOC.DTBCFG.ULLSELL = 1 to select CKM DTB0
        // ULLSEL mux select (select CKM)
        HWREG(IOC_BASE + IOC_O_DTBCFG) &= ~IOC_DTBCFG_ULLSEL_M;
        HWREG(IOC_BASE + IOC_O_DTBCFG) |= 0x1 << IOC_DTBCFG_ULLSEL_S; // 0x1 to route CKM (CKMDIG) to DTB0 (DTB bit 0)
    
    
        // Enable IOC.DTBOE.EN0
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN0_M;
        HWREG(IOC_BASE + IOC_O_DTBOE) |= IOC_DTBOE_EN0_EN;
    
        // Select the DTB mux selects in IOC (and if required in source clock IP) in such a way that clock is driven on DTB0
        // Example: Step 1: Configure CKMD.DTBCTL.CLKSEL = 0xA for HFOSC
        // select which clock (CKMD) to output on DTB0 (DTB[0])
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_CLKSEL_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= (clockSrc) << CKMD_DTBCTL_CLKSEL_S;
        // Step 2: Configure CKMD.DTBCTL.EN=1 for Enabling DTB output
        // enable DTB output
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_EN_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= CKMD_DTBCTL_EN;
    }
    static void XtalToGpio_disable()
    {
        if (!gXtalToGpio_isEnabled)
        {
            return;
        }
    
        // Disable IOC.DTBOE.EN0
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN0_M;
    
        gXtalToGpio_isEnabled = 0;
    }

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Jan、

    感谢您的答复。

    我已经查看了 LftickToGpio_dtb5_dio24_enable 和 XtalToGpio_enable 函数、它们分别使用 dio24和 dio19。

    问题1:LftickToGpio_dtb5_dio24_enable 是否调用这个函数、然后调用 XtalToGpio_enable?

    问题2:在 XtalToGpio_enable 函数中 dio19的主要用途是什么?

    Q3:此 DIO19是否可以更改为另一个 DIO? 我们使用4x4封装、该芯片没有 DIO19。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    对于任何困惑、我深表歉意。

    问题1:LftickToGpio_dtb5_dio24_enable 是否调用这个函数、然后调用 XtalToGpio_enable?

    [/报价]

     XtalToGpio_enable ()用于启用向 GPIO 输出时钟(并指定启用哪个时钟)。  LftickToGpio_dtb5_dio24_enable ()用于将晶体输出驱动到 GPIO。

    Q2:dio19在 XtalToGpio_enable 函数中的主要用途是什么?

    我认为这与多路复用器设置有关、以便获得晶体的输出。

    Q3:此 DIO19是否可以更改为另一个 DIO? 我们使用4x4封装、该芯片没有 DIO19。

    [/报价]

    我需要深入了解这一点。 与此同时、您能说明一下您使用的是 LaunchPad 还是定制板吗?

    此致、

    1月

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Q3:此 DIO19是否可以更改为另一个 DIO? 我们使用4x4封装、该芯片没有 DIO19。

    我需要深入了解这一点。 与此同时、您能说明一下您使用的是 LaunchPad 还是定制板吗?

    >>>

    大家好、Jan、感谢您的答复。

    我们使用定制板、

    我们是 TI 第三方供应商。

    因此我们设计了一个4x4封装的小尺寸模块。

    您能帮我确认上述问题吗?

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    根据一些初始研究、我认为应该可以更改为 DIO16、DIO20、DIO21或 DIO24、而不是 DIO19。 我会尝试启动 DIO24。

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Jan、

    感谢您的帮助,我遇到了编译错误,我在世界各地搜索了 SDK ,但我找不到这些类型,您能给我更多的信息吗?

    我要测试32K、我可以直接将 clockSrc 分配给0x07吗?

    该苦恼。

    uint8_t gXtalToGpio_isEnabled = 0;
    static void XtalToGpio_enable(/*Xtal_Select_e xtalType*/)
    {
        uint8_t clockSrc;
    
        /*if (xtalType == Xtal_Select_e_HFOSC || xtalType == Xtal_Select_e_HFXT)
        {
            clockSrc = 0xC;
        }
        else if (xtalType == Xtal_Select_e_LFOSC || xtalType == Xtal_Select_e_LFXT)
        {
            clockSrc = 0x7;
        }
        else
        {
            return; // invalid
        }*/
        clockSrc = 0x7;//add by weli
    
        if (gXtalToGpio_isEnabled)
        {
            return;
        }
        else
        {
            gXtalToGpio_isEnabled = 1;
        }
    
        // drive output low first
        //GPIO_setConfig(DTB0_DIO_ID, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(24, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
    
        // Configure the IOC.IOC19.PORTCFG MMR to select DTB
        HWREG(IOC_BASE + IOC_O_IOC19) &= ~IOC_IOC19_PORTCFG_M;
        HWREG(IOC_BASE + IOC_O_IOC19) |= IOC_IOC19_PORTCFG_DTB;
    
        // Select the DTB mux selects in IOC (and if required in source clock IP) in such a way that zero is driven on DTB0
        //         Example: Configure IOC.DTBCFG.ULLSELL = 1 to select CKM DTB0
        // ULLSEL mux select (select CKM)
        HWREG(IOC_BASE + IOC_O_DTBCFG) &= ~IOC_DTBCFG_ULLSEL_M;
        HWREG(IOC_BASE + IOC_O_DTBCFG) |= 0x1 << IOC_DTBCFG_ULLSEL_S; // 0x1 to route CKM (CKMDIG) to DTB0 (DTB bit 0)
    
    
        // Enable IOC.DTBOE.EN0
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN0_M;
        HWREG(IOC_BASE + IOC_O_DTBOE) |= IOC_DTBOE_EN0_EN;
    
        // Select the DTB mux selects in IOC (and if required in source clock IP) in such a way that clock is driven on DTB0
        // Example: Step 1: Configure CKMD.DTBCTL.CLKSEL = 0xA for HFOSC
        // select which clock (CKMD) to output on DTB0 (DTB[0])
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_CLKSEL_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= (clockSrc) << CKMD_DTBCTL_CLKSEL_S;
        // Step 2: Configure CKMD.DTBCTL.EN=1 for Enabling DTB output
        // enable DTB output
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_EN_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= CKMD_DTBCTL_EN;
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Jan

    我编译了程序、但在 DIO20或 DIO24上看不到32K 方波。

    /*
     *  ======== main_freertos.c ========
     */
    #include <stdint.h>
    
    #ifdef __ICCARM__
        #include <DLib_Threads.h>
    #endif
    
    /* POSIX Header files */
    #include <pthread.h>
    
    /* RTOS header files */
    #include <FreeRTOS.h>
    #include <task.h>
    
    #include <ti/drivers/Board.h>
    
    #include <ti/devices/DeviceFamily.h>
    #include DeviceFamily_constructPath(driverlib/dbell_regs.h)
    
    #include DeviceFamily_constructPath(inc/hw_types.h)
    #include DeviceFamily_constructPath(inc/hw_memmap.h)
    #include DeviceFamily_constructPath(inc/hw_ioc.h)
    #include DeviceFamily_constructPath(inc/hw_ckmd.h)
    
    #include <ti/drivers/Power.h>
    #include <ti/drivers/power/PowerCC23X0.h>
    #include <ti/drivers/Temperature.h>
    #include <ti/drivers/GPIO.h>
    extern void *mainThread(void *arg0);
    
    /* Stack size in bytes */
    #define THREADSTACKSIZE   2048
    
    
    uint8_t gLfTickToGpio_enabled = 0;
    static void LftickToGpio_dtb5_dio24_enable()
    {
        if (gLfTickToGpio_enabled)
            return;
        else
            gLfTickToGpio_enabled = 1;
    
        // DIO24 can be driven by DTB5
        const uint8_t dtb_bit = 5;
        const uint8_t dio = 24;
        const uint8_t dsel_lftick = 13; // LFTICK is bit 4
    
        // drive output low first
        //GPIO_setConfig(IOC_O_IOC24, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(24, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
    
        // Configure the IOC.IOC24.PORTCFG MMR to select DTB
        HWREG(IOC_BASE + 24) &= ~IOC_IOC24_PORTCFG_M;
        HWREG(IOC_BASE + 24) |= IOC_IOC24_PORTCFG_DTB;
    
        // Select the DTB mux selects in IOC (and if required in source clock IP) in such a way that zero is driven on DTB0
        //         Example: Configure IOC.DTBCFG.ULLSELL = 1 to select CKM DTB0
        // ULLSEL mux select (select CKM)
        HWREG(IOC_BASE + IOC_O_DTBCFG) &= ~IOC_DTBCFG_ULLSEL_M;
        HWREG(IOC_BASE + IOC_O_DTBCFG) |= 0x1 << IOC_DTBCFG_ULLSEL_S; // 0x1 to route CKM (CKMDIG) to DTB0 (DTB bit 0)
    
        // Enable IOC.DTBOE.EN5
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN5_M;
        HWREG(IOC_BASE + IOC_O_DTBOE) |= IOC_DTBOE_EN5_EN;
    
        // Step 1: select 5-bit signal group to output on DTB[5:1]
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_DSEL0_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= dsel_lftick << CKMD_DTBCTL_DSEL0_S;
    
        // Step 2: Configure CKMD.DTBCTL.EN=1 for Enabling DTB output
        // enable DTB output
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_EN_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= CKMD_DTBCTL_EN;
    }
    
    static void LftickToGpio_dtb5_dio24_disable()
    {
        // Enable IOC.DTBOE.EN5
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN5_M;
        gLfTickToGpio_enabled = 0;
    }
    
    uint8_t gXtalToGpio_isEnabled = 0;
    static void XtalToGpio_enable(/*Xtal_Select_e xtalType*/)
    {
        uint8_t clockSrc;
    
        /*if (xtalType == Xtal_Select_e_HFOSC || xtalType == Xtal_Select_e_HFXT)
        {
            clockSrc = 0xC;
        }
        else if (xtalType == Xtal_Select_e_LFOSC || xtalType == Xtal_Select_e_LFXT)
        {
            clockSrc = 0x7;
        }
        else
        {
            return; // invalid
        }*/
        clockSrc = 0x7;//add by weli
    
        if (gXtalToGpio_isEnabled)
        {
            return;
        }
        else
        {
            gXtalToGpio_isEnabled = 1;
        }
    
        // drive output low first
        //GPIO_setConfig(DTB0_DIO_ID, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(20, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
    
        // Configure the IOC.IOC19.PORTCFG MMR to select DTB
        HWREG(IOC_BASE + IOC_O_IOC20) &= ~IOC_IOC20_PORTCFG_M;
        HWREG(IOC_BASE + IOC_O_IOC20) |= IOC_IOC20_PORTCFG_DTB;
    
        // Select the DTB mux selects in IOC (and if required in source clock IP) in such a way that zero is driven on DTB0
        //         Example: Configure IOC.DTBCFG.ULLSELL = 1 to select CKM DTB0
        // ULLSEL mux select (select CKM)
        HWREG(IOC_BASE + IOC_O_DTBCFG) &= ~IOC_DTBCFG_ULLSEL_M;
        HWREG(IOC_BASE + IOC_O_DTBCFG) |= 0x1 << IOC_DTBCFG_ULLSEL_S; // 0x1 to route CKM (CKMDIG) to DTB0 (DTB bit 0)
    
    
        // Enable IOC.DTBOE.EN0
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN0_M;
        HWREG(IOC_BASE + IOC_O_DTBOE) |= IOC_DTBOE_EN0_EN;
    
        // Select the DTB mux selects in IOC (and if required in source clock IP) in such a way that clock is driven on DTB0
        // Example: Step 1: Configure CKMD.DTBCTL.CLKSEL = 0xA for HFOSC
        // select which clock (CKMD) to output on DTB0 (DTB[0])
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_CLKSEL_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= (clockSrc) << CKMD_DTBCTL_CLKSEL_S;
        // Step 2: Configure CKMD.DTBCTL.EN=1 for Enabling DTB output
        // enable DTB output
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_EN_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= CKMD_DTBCTL_EN;
    }
    static void XtalToGpio_disable()
    {
        if (!gXtalToGpio_isEnabled)
        {
            return;
        }
    
        // Disable IOC.DTBOE.EN0
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN0_M;
    
        gXtalToGpio_isEnabled = 0;
    }
    
    /*
     *  ======== main ========
     */
    int main(void)
    {
        pthread_t           thread;
        pthread_attr_t      attrs;
        struct sched_param  priParam;
        int                 retc;
    
        /* initialize the system locks */
    #ifdef __ICCARM__
        __iar_Initlocks();
    #endif
        Board_init();
        Temperature_init();
    
        uint32_t hftrackctl =  HWREG( CKMD_BASE + CKMD_O_HFTRACKCTL );
    
        /* ==== /ti/drivers/Power initialization ==== */
        Power_setConstraint(PowerLPF3_DISALLOW_IDLE);
        Power_setConstraint(PowerLPF3_DISALLOW_STANDBY);
    
        /* High performance clock buffer enable */
        HWREG( CKMD_BASE + CKMD_O_HFXTCTL ) |= ( CKMD_HFXTCTL_HPBUFEN | CKMD_HFXTCTL_EN );
    
        /* Enable tracking loop */
        HWREG( CKMD_BASE + CKMD_O_HFTRACKCTL ) = hftrackctl | CKMD_HFTRACKCTL_EN;
    
        /* Initialize the attributes structure with default values */
        pthread_attr_init(&attrs);
    
        /* Set priority, detach state, and stack size attributes */
    
        LftickToGpio_dtb5_dio24_enable();
        XtalToGpio_enable();
        while(1);
    
        priParam.sched_priority = 1;
        retc = pthread_attr_setschedparam(&attrs, &priParam);
        retc |= pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
        retc |= pthread_attr_setstacksize(&attrs, THREADSTACKSIZE);
        if (retc != 0) {
            /* failed to set attributes */
            while (1) {}
        }
    
        retc = pthread_create(&thread, &attrs, mainThread, NULL);
        if (retc != 0) {
            /* pthread_create() failed */
            while (1) {}
        }
    
        /* Start the FreeRTOS scheduler */
        vTaskStartScheduler();
    
        retur

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很抱歉、我们测试时用到的代码就是这些代码。 我们在一个 nortos gpiostandby 项目中实现了它:

    /*
     * Copyright (c) 2022, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    /*
     *  ======== pinStandby.c ========
     */
    #include <unistd.h>
    
    /* Driver Header files */
    #include <ti/drivers/GPIO.h>
    
    /* Example/Board Header files */
    #include "ti_drivers_config.h"
    
    #include DeviceFamily_constructPath(inc/hw_types.h)
    #include DeviceFamily_constructPath(inc/hw_memmap.h)
    #include DeviceFamily_constructPath(inc/hw_ckmd.h)
    #include DeviceFamily_constructPath(inc/hw_ioc.h)
    #include DeviceFamily_constructPath(inc/hw_pmctl.h)
    
    
    #define DTB0_DIO_ID   19
    typedef enum
    {
        Xtal_Select_e_HFOSC,
        Xtal_Select_e_LFOSC,
        Xtal_Select_e_HFXT,
        Xtal_Select_e_LFXT,
    } Xtal_Select_e;
    
    static void XtalToGpio_enable(Xtal_Select_e xtalType);
    static void XtalToGpio_disable();
    
    static void LftickToGpio_dtb5_dio24_enable();
    static void LftickToGpio_dtb5_dio24_disable();
    
    /*
     *  ======== mainThread ========
     */
    void *mainThread(void *arg0)
    {
        uint32_t standbyDuration = 5;
    
        /* Configure LED pins */
        GPIO_setConfig(CONFIG_GPIO_0, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(CONFIG_GPIO_1, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_HIGH);
    
        XtalToGpio_enable(Xtal_Select_e_HFXT);
        LftickToGpio_dtb5_dio24_enable();
        while (1);
    
        while (1)
        {
            XtalToGpio_enable(Xtal_Select_e_LFOSC);
            LftickToGpio_dtb5_dio24_enable();
            sleep(1);
            XtalToGpio_disable();
            LftickToGpio_dtb5_dio24_disable();
            sleep(1);
        }
    
    }
    
    uint8_t gXtalToGpio_isEnabled = 0;
    static void XtalToGpio_enable(Xtal_Select_e xtalType)
    {
        uint8_t clockSrc;
    
        if (xtalType == Xtal_Select_e_HFOSC || xtalType == Xtal_Select_e_HFXT)
        {
            clockSrc = 0xC;
        }
        else if (xtalType == Xtal_Select_e_LFOSC || xtalType == Xtal_Select_e_LFXT)
        {
            clockSrc = 0x7;
        }
        else
        {
            return; 
        }
    
        if (gXtalToGpio_isEnabled)
        {
            return;
        }
        else
        {
            gXtalToGpio_isEnabled = 1;
        }
    
        // drive output low first
        GPIO_setConfig(DTB0_DIO_ID, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
    
        // Configure the IOC.IOC19.PORTCFG MMR to select DTB
        HWREG(IOC_BASE + IOC_O_IOC19) &= ~IOC_IOC19_PORTCFG_M;
        HWREG(IOC_BASE + IOC_O_IOC19) |= IOC_IOC19_PORTCFG_DTB;
    
        // Select the DTB mux selects in IOC (and if required in source clock IP) in such a way that zero is driven on DTB0
        //         Example: Configure IOC.DTBCFG.ULLSELL = 1 to select CKM DTB0
        // ULLSEL mux select (select CKM)
        HWREG(IOC_BASE + IOC_O_DTBCFG) &= ~IOC_DTBCFG_ULLSEL_M;
        HWREG(IOC_BASE + IOC_O_DTBCFG) |= 0x1 << IOC_DTBCFG_ULLSEL_S; // 0x1 to route CKM (CKMDIG) to DTB0 (DTB bit 0)
    
        // Enable IOC.DTBOE.EN0
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN0_M;
        HWREG(IOC_BASE + IOC_O_DTBOE) |= IOC_DTBOE_EN0_EN;
    
        // Select the DTB mux selects in IOC (and if required in source clock IP) in such a way that clock is driven on DTB0
        // Example: Step 1: Configure CKMD.DTBCTL.CLKSEL = 0xA for HFOSC
        // select which clock (CKMD) to output on DTB0 (DTB[0])
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_CLKSEL_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= (clockSrc) << CKMD_DTBCTL_CLKSEL_S;
        // Step 2: Configure CKMD.DTBCTL.EN=1 for Enabling DTB output
        // enable DTB output
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_EN_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= CKMD_DTBCTL_EN;
    }
    static void XtalToGpio_disable()
    {
        if (!gXtalToGpio_isEnabled)
        {
            return;
        }
    
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN0_M;
    
        gXtalToGpio_isEnabled = 0;
    }
    
    uint8_t gLfTickToGpio_enabled = 0;
    static void LftickToGpio_dtb5_dio24_enable()
    {
        if (gLfTickToGpio_enabled)
            return;
        else
            gLfTickToGpio_enabled = 1;
    
        // DIO24 can be driven by DTB5
        const uint8_t dtb_bit = 5;
        const uint8_t dio = 24;
        const uint8_t dsel_lftick = 13; // LFTICK is bit 4
    
        // drive output low first
        GPIO_setConfig(IOC_O_IOC24, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
    
        // Configure the IOC.IOC24.PORTCFG MMR to select DTB
        HWREG(IOC_BASE + IOC_O_IOC24) &= ~IOC_IOC24_PORTCFG_M;
        HWREG(IOC_BASE + IOC_O_IOC24) |= IOC_IOC24_PORTCFG_DTB;
    
        // Select the DTB mux selects in IOC (and if required in source clock IP) in such a way that zero is driven on DTB0
        //         Example: Configure IOC.DTBCFG.ULLSELL = 1 to select CKM DTB0
        // ULLSEL mux select (select CKM)
        HWREG(IOC_BASE + IOC_O_DTBCFG) &= ~IOC_DTBCFG_ULLSEL_M;
        HWREG(IOC_BASE + IOC_O_DTBCFG) |= 0x1 << IOC_DTBCFG_ULLSEL_S; // 0x1 to route CKM (CKMDIG) to DTB0 (DTB bit 0)
    
        // Enable IOC.DTBOE.EN5
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN5_M;
        HWREG(IOC_BASE + IOC_O_DTBOE) |= IOC_DTBOE_EN5_EN;
    
        // Step 1: select 5-bit signal group to output on DTB[5:1]
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_DSEL0_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= dsel_lftick << CKMD_DTBCTL_DSEL0_S;
    
        // Step 2: Configure CKMD.DTBCTL.EN=1 for Enabling DTB output
        // enable DTB output
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) &= ~CKMD_DTBCTL_EN_M;
        HWREG(CKMD_BASE + CKMD_O_DTBCTL) |= CKMD_DTBCTL_EN;
    }
    
    static void LftickToGpio_dtb5_dio24_disable()
    {
        // Enable IOC.DTBOE.EN5
        HWREG(IOC_BASE + IOC_O_DTBOE) &= ~IOC_DTBOE_EN5_M;
        gLfTickToGpio_enabled = 0;
    }
    

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Jan、

    感谢你的帮助。

    您解决了我的问题。

    谢谢。