微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > CC3200 LPDS模式无法退出

CC3200 LPDS模式无法退出

时间:10-02 整理:3721RD 点击:

Hi all

我写了一个小应用程序, 使用到的资源大致如下

GPIO使用了pin64作为led, pin04作为按键, pin59作为AD引脚.

建立了4个线程, 栈都是1024. 使用了timer Framework 里面的高精度timer和RTC.

遇到的问题如下:

配置系统在vApplicationIdleHook调用cc_idle_task_pm(), 之前设置好了进入lp3p0_setup_power_policy(POWER_POLICY_STANDBY) 进入LPDS.

有关RTC唤醒的配置如下

static void TimerTask(void *pvParameters)
{
    int ret;
    unsigned char sig = 0;

    while (1) {
        osi_MsgQRead(&g_timer_signal_queue, &sig, OSI_WAIT_FOREVER);
        BatterySample();
        if (device_status_get(DEVICE_STATUS_NET_ONLINE) &&
            device_status_get(DEVICE_STATUS_NET_SOCK_OPEN)) {
            ret = net_send_heartbeat();
            if (ret < 0)
                ERR_PRINT(ret);
        }
    }
}

static void rtc_timer_cb(void *vParam)
{
    unsigned char timer_sig = 1;
    osi_MsgQWrite(&g_timer_signal_queue, &timer_sig, OSI_NO_WAIT);
}
static int rtc_timer_set(void)
{
    struct cc_timer_cfg sRealTimeTimer;
    struct u64_time sInitTime;
    int iRetVal;

    sInitTime.secs = 0;
    sInitTime.nsec = 0;
    cc_rtc_set(&sInitTime);

    sRealTimeTimer.source = HW_REALTIME_CLK;
    sRealTimeTimer.timeout_cb = rtc_timer_cb;
    sRealTimeTimer.cb_param = NULL;
    g_rtc_hndl = cc_timer_create(&sRealTimeTimer);

    iRetVal = osi_MsgQCreate(&g_timer_signal_queue, NULL, sizeof(unsigned char), TIMER_SIGNAL_QUEUE_LEN);
    if (iRetVal < 0) {
        UART_PRINT("unable to create timer signal queue\n\r");
        return iRetVal;
    }
    iRetVal = osi_TaskCreate(TimerTask,
                (const signed char *)"Timer Task",
                OSI_STACK_SIZE, NULL, 2, NULL );
    if (iRetVal < 0) {
        UART_PRINT("unable to create timer task\n\r");
        return iRetVal;
    }

    return 0;
}
static int rtc_timer_start(void)
{
    struct u64_time sIntervalTimer;

    sIntervalTimer.secs = NET_HEARTBEAT_INTERVAL_S;
    sIntervalTimer.nsec = 0;
    cc_timer_start(g_rtc_hndl, &sIntervalTimer, OPT_TIMER_PERIODIC);
    return 0;
}

大致是参照idle_profile例程做的. 这样子系统可以顺利从LPDS唤醒.

但是当我想加入按键作为LPDS作为唤醒中断, 配置如下

static void set_gpio_as_wakeup_pin()
{
    cc_hndl tGPIOHndl;

    tGPIOHndl = cc_gpio_open(BUT_GPIO, GPIO_DIR_INPUT);
    cc_gpio_enable_notification(tGPIOHndl, BUT_GPIO, (enum gpio_int_type)BUT_ACTIVE_EDGE,
                                (GPIO_TYPE_NORMAL | GPIO_TYPE_WAKE_SOURCE));
}

配置后, 系统就无法从LPDS唤醒了, RTC也唤醒不了了. 

请问这个可能的原因是什么? 是否有建议我从哪里排查问题呢?

最终找到了问题原因.

其实已经从lpds退出了, 但是由于没有恢复GPIO的配制, 所以后面代码执行出错了.

是的,你如果加了外设方面的控制的话,是需要加相应的配置的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top