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.

CC1310的 GPIOCC26XX_DIO_21配置成外部中断,中断响应很慢

Other Parts Discussed in Thread: CC1310

问题描述:

1.我现在需要配置GPIOCC26XX_DIO_21为上升沿触发的中断,来接外部传感器的引法,传感引脚会每8us为一方波信号周其输出,我需要读有多少个脉冲。中断配置OK,调试可以进中断

2.我用同样的逻辑代码在stm32下实现功能OK,读脉冲数正常,因传感有个转换时间为20ms,也就是每20ms传感器会以8us方波信号输出脉冲,输出正常是1200左右,stm32下面实现OK,同样的逻辑移植到cc1310上,通过GPIOCC26XX_DIO_21中断读出的脉冲数只有290多个相差太多。

3.注意:怀疑是不是cc1310中断响应不够快????4.在裸机下调试,工程是由gpiointtrupt改过来的,还是配置不正确????5.还是说有别的东西打拢了????现在很迷惑,请求大神,指点!!!!!

6.代码如下:

 

int main(void)
{
/* Call driver init functions */
Board_init();

/* Start NoRTOS */
NoRTOS_start();

/* Call mainThread function */
mainThread(NULL);

while (1) {}
}

GPIO_setConfig(Board_GPIO_NST1001_P, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
GPIO_setConfig(Board_GPIO_NST1001_DQ, GPIO_CFG_IN_NOPULL | GPIO_CFG_IN_INT_RISING);//DQ 上升沿中断
GPIO_write(Board_GPIO_NST1001_P, 1);//给NST001供电
/* install Button callback */
GPIO_setCallback(Board_GPIO_NST1001_DQ, NST1001_Int);

C_FLAG = 0; //
CPUdelay(1000); //
//usleep(1000);
/* Enable interrupts */
GPIO_enableInt(Board_GPIO_NST1001_DQ);

if(C_FLAG==1)
{
C_FLAG = 0;
//usleep(10000); //
CPUdelay(10000*48/4);//大约10000us
//Task_sleep(1000);//以10us为单位,延时

if(C_FLAG==0) //
{
GPIO_disableInt(Board_GPIO_NST1001_DQ); //

data_wendu[i] = (COUNT*0.0625f - 50.0625f); //
//printf("short = %2.1f---%d\n",data_wendu[i],COUNT);
data_wendu[i] = compensate_temp(data_wendu[i]);
sum_wd += data_wendu[i];
i++;

if(i>=10)
{
for(i=1,min=max=data_wendu[0];i<10;i++)
{
if(data_wendu[i]<min) min = data_wendu[i]; //
if(data_wendu[i]>max) max = data_wendu[i]; //
}
data_wendu_rul = (sum_wd-min-max)/(10-2); //
// printf("short = %2.1f---%d\n",data_wendu_rul,COUNT);
i = 0;
sum_wd = 0;
}

COUNT=0;
GPIO_enableInt(Board_GPIO_NST1001_DQ); //使能中断 CPUdelay

GPIO_toggle(Board_GPIO_LED0);
}
}

  • 可以先用示波器测下中断响应情况
  • 我在中断的回调函数中写了三句话
    void NST1001_Int(uint_least8_t index)
    {
    COUNT++;
    C_FLAG =1;
    //GPIO_toggle(Board_GPIO_LED0);
    }
    当GPIO_toggle(Board_GPIO_LED0);打开时,用示波器看LED灯的翻转周期差不多是100us,实际传感器输出的脉冲是,2us低电平6us高电平。
    ***不知道是配置有问题,还是说IO本身响应慢,还是说有别的代码影响慢了啊????
  • 中断响应时间一般是12个CPU周期,CC1310内核中断响应时间计算下来应该是0.5us

  • DIO_21中断响应怎么测试呢,我之前仿真是可以进中断的。在中断回调函数中让led翻转,用示波器打led翻转波的波形,显示一个周期大概100us。
  • 你的问题可能与GPIO21大约4 MHz的速率有关,看下e2e.ti.com/.../726170
  • 在裸机gpiointerrupt-nortos事例下测试,整个代码,配置了2个按键中断,一个IO21中断,按键不按下时,相当于整个裸机代码在跑io21中断,示波器显示还是70us一个方波周期(LED翻转测试),实际IO输入的中断信号是2us低电平,6us高电平。IO21是上升沿触发。

    我看看您发的贴子,试试有没有启发。
  • @@@@@
    这个贴子没太看明白,好像是用了传感器控制内核。我现在跑的是裸机程序gpiointerrupt-rtos例程。配置了GPIO21为中断输入,接传感器脉冲输出。在主循环中一直查询传感是否输出完毕。但数出来的脉冲数。和在stm32里面数出来的不一样相差太多。还是不能解决到底是哪出问题了。求指教啊!!!!!
  • 是的,用了 sensor controller,普通IO口速率最高大约4MHz,stm32可以配置IO速率,例如GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    你这个对IO速率要求比较高,使用4MHz的速率应该不能满足需求

  • cc1310IO速率4M,对于我现在的io中断输入是8us一个周期,应该是够的啊,频率是1/8Mhz,现在测试io中断是70多us.不应该这么慢啊。4M完全也够了。是不是还哪里没有配置好呢。还是说,我配置完io只要能响应中断的话,就应该代码没问题了???还是说m3核IO对于我这个8us一个周期的中断,响应不过来啊。确定是m3核的io反应不过来嘛????如果是这样,那我就得去啃sensor controller这个了。
  • 还有我测试了,IO输出5us翻转led灯,也是OK的啊。说明IO口输出速率还是很不错啊。至于中断输入io响应慢还有没有其它可能的问题?????
  • 将输入8us的脉冲波形和20ms等的波形和具体测试数据传上来,和同事讨论下,之后回复你
  • 好的,我用示波器抓一下。昨天用stm32  IO配置成2M也是可以的。cc1310 gpiointerrupt-nortos默认主频是24M,我用48M的也测试了效果一样。

    打开过0x2这个宏,测试效果一样

  • 1.下面是传感间隔40ms左右输出8us脉冲信号

    传感器输出的8us脉冲信号图片

     

    2.在IO21的中断回调中放led翻转指示用示波器测量如下视频和图片

  • sensor controller Studio 中能配置IO口为中断???如果可能的话,在sensor controller Studio中能写IO的中断函数嘛???如果可以写是怎么个流程啊????
  • 已将你前面的问题反映给相关专家,得到答复后会立即回复你

    sensor controller Studio 里面的中断和例程中有些区别,可以看下help中的说明

    fwGenAlertInterrupt 
    Prototype: fwGenAlertInterrupt() 
    Generates an ALERT interrupt to the System CPU application. 
    The interrupt occurs after the task code block has finished. If multiple tasks are scheduled to execute at the same time, the interrupt occurs after all the tasks have finished. 
    This procedure may only be called once per iteration of a task. 
    fwGenQuickAlertInterrupt 
    Prototype: fwGenQuickAlertInterrupt() 
    Generates an ALERT interrupt to the System CPU application. 
    The interrupt occurs immediately. 
    This procedure should be used by a task that runs for a longer period of time and needs to alert the System CPU repeatedly during this time. 
    This procedure does not set flags in the bit-vector returned by scifGetAlertEvents(). 
    

    sensor controller Studio可以看下

  • 谢谢了!就是不明白cc1310的io中断为什么响应一个10us的中断会这么困难。项目又卡住。另外sensor controller Studio好像也不能写IO中断处理函数,只能写简单的裸机。我看看您发的资料。
  • 您好:

        sensor controller Studio这个配置了IO中断触,放了一个LED翻转,比m3主核的中断还慢。led灯翻转是100多ms级的。cc1310的IO中断响应是有问题嘛???还是有什么限制啊。对于在m3主核下面,配置IO中 断有没有什么讲究啊?????我这传感器中断脉冲用m3核控制IO,和 sensor controller核控制IO都不能快速的响应输入脉冲啊?????

  • 在手册第4章中没有关于中断时间的说明:www.ti.com.cn/.../swcu117i.pdf
    不知IO21是否配置正确,将传感器的输入接到Button输入引脚看下情况
  • 好的,我一会在试试。
    能否帮我模似测试一下啊。就是让io22每10us翻转一下,然后io21配置成上升沿触发中断。我测试输出10us翻转是正确的。中断中放一个翻转的LED灯,LED灯低电平10us,高电平40us这样的周期,也就是中断响应按照这样的翻转周期。能否帮我测试一下啊。
  • 刚刚模似了一下,IO22输出10us方波,io21为中断口,中断函数中led灯周期是10us高电平,40us低电平。按理这样模似是不是应该也是10us翻转一次啊。

    while(1)
    {

    //GPIO_toggle(Board_GPIO_LED0);
    GPIO_toggle(Board_GPIO_NST1001_P);
    CPUdelay(10*48/4);//大约10000us


    void gpioButtonFxn0(uint_least8_t index)
    {
    /* Clear the GPIO interrupt and toggle an LED */
    GPIO_toggle(Board_GPIO_LED0);
    }
  • 我用波形发生器输出占出比50%的方波,周期10us,输入到按键中断引脚,IO13上。中断函数led翻转周期为125us,更慢了。

    麻烦您那边能否帮我测试一下啊???????
  • 我用波形发生器输出占出比50%的方波,周期10us,输入到按键中断引脚 IO13上。中断函数led翻转周期为125us,更慢了。

    麻烦您那边能否帮我测试验一下啊???????麻烦了,在线等。如果确认1310的Io中断无法对10us周期的方波响应,那我就得寻找别的方法了。
  • 我试了下和你的测试结果差不多

    fghj dfghjk 说:
    如果确认1310的Io中断无法对10us周期的方波响应

    这个还不确定,我已经反馈给相关专家了,目前还没有回复,我再问一下

  • 在这种情况下,需要考虑几件事,首先是设备必须处于完全活动模式才能正常工作,因为空闲->活动响应通常为14 us(待机- >有效时间更长),可以在下面帖子中说明具体信息
    e2e.ti.com/.../3516912
  • 好的非常感谢,帮我确认。我用波形发生器,在次确认。IO中断到10us周期时中断响就开始出现差差变慢了,到5us一个周期时中断相差非长大了。我得想想别的方法了。
  • 恩正常其情况,我们使用时会,让芯片运行态时,来启动采集。这个影响不大,可以避免应该。
  • 你可以在上面帖子中说明传感器的具体信息,看是否有其他解决方案