TI中文支持网
TI专业的中文技术问题搜集分享网站

cc3200 LPDS被唤醒后 uart中断 无法被触发

TI的工程师,你们好!

cc3200 开发过程中遇到问题如下:

添加idle_profile lpds模式后,通过注册的GPIO深度唤醒源唤醒后,UART中断无法抢占。

问题描述如下:

2个线程:task1 优先级为1, task2 优先级为2.  task1 在深度唤醒源唤醒后,占用cpu 10s 并同时给task2 发信号。task2 为串口数据读,正常情况下阻塞,等到DMA中断到来,通知task2 读串口数据。

设置一个GPIO9为低电平,在uart中断中将其拉高。

在不进入LPDS模式下,当串口有数据接收时,串口中断 会将GPIO9拉高,并发信号给task2 触发其读串口数据。

问题是:在进入LPDS模式下后,按下GPIO 触发深度唤醒源中断唤醒CC3200后,task1 被唤醒,占用cpu,task1并没有设置GPIO9为高电平,而实测发现 GPIO9 此时为高电平。 同时 向串口写数据,串口中断没有被触发。 我的理解应该是 此时中断会抢占task1,从而通知task2 去收数据。

请问一下,在LPDS 模式下,寄存器的状态是否会被保存? 为何此时,串口中断没有被触发?

其中,task1 死循环代码如下:

while(FOREVER) {
  UART_PRINT("WakeupTask\n\r");
  osi_MsgQRead(&g_tWkupQueue, &ucQueueMsg, OSI_WAIT_FOREVER);
  switch(ucQueueMsg){
        case 1:
            UART_PRINT("timer\n\r");
            break;
        case 2:
            UART_PRINT("CPU running\n\r");
   while(i > 0) {
    osi_MsgQWrite(&g_tUartMonitorFlag, (void*)1, OSI_NO_WAIT);
    MAP_UtilsDelay(8000000); //delay 3s
    i–;
   }
   i = 12;
   osi_Sleep(1000);
            break;
        case 3:
            UART_PRINT("host irq\n\r");
            break;
        default:
            UART_PRINT("invalid msg\n\r");
            break;
        }
 }

sherlock ding:

回复 Viki Shi:

谢谢提供的文档,cc_back_up_soc_data 接口有保存CPU当前寄存器和NVIC的数据, cc_restore_soc_data 会恢复 cc_back_up_soc_data 保存的数据。 然后 在进入睡眠前 调用cc_back_up_soc_data接口, 在深度唤醒源中断中, 调用cc_restore_soc_data接口。 然后 uart1中断依然没办法被触发。请问 这样操作是否正确,或者还有其他需要考虑的因素?

赞(0)
未经允许不得转载:TI中文支持网 » cc3200 LPDS被唤醒后 uart中断 无法被触发
分享到: 更多 (0)