问题描述:
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);
}
}
Kevin Qiu1:
可以先用示波器测下中断响应情况
fghj dfghjk:
回复 Kevin Qiu1:
我在中断的回调函数中写了三句话
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本身响应慢,还是说有别的代码影响慢了啊????
Kevin Qiu1:
回复 fghj dfghjk:
中断响应时间一般是12个CPU周期,CC1310内核中断响应时间计算下来应该是0.5us
fghj dfghjk:
回复 Kevin Qiu1:
DIO_21中断响应怎么测试呢,我之前仿真是可以进中断的。在中断回调函数中让led翻转,用示波器打led翻转波的波形,显示一个周期大概100us。
Kevin Qiu1:
回复 fghj dfghjk:
你的问题可能与GPIO21大约4 MHz的速率有关,看下e2e.ti.com/…/726170
fghj dfghjk:
回复 Kevin Qiu1:
在裸机gpiointerrupt-nortos事例下测试,整个代码,配置了2个按键中断,一个IO21中断,按键不按下时,相当于整个裸机代码在跑io21中断,示波器显示还是70us一个方波周期(LED翻转测试),实际IO输入的中断信号是2us低电平,6us高电平。IO21是上升沿触发。
我看看您发的贴子,试试有没有启发。
fghj dfghjk:
回复 Kevin Qiu1:
@@@@@
这个贴子没太看明白,好像是用了传感器控制内核。我现在跑的是裸机程序gpiointerrupt-rtos例程。配置了GPIO21为中断输入,接传感器脉冲输出。在主循环中一直查询传感是否输出完毕。但数出来的脉冲数。和在stm32里面数出来的不一样相差太多。还是不能解决到底是哪出问题了。求指教啊!!!!!
Kevin Qiu1:
回复 fghj dfghjk:
是的,用了 sensor controller,普通IO口速率最高大约4MHz,stm32可以配置IO速率,例如GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 你这个对IO速率要求比较高,使用4MHz的速率应该不能满足需求
fghj dfghjk:
回复 Kevin Qiu1:
cc1310IO速率4M,对于我现在的io中断输入是8us一个周期,应该是够的啊,频率是1/8Mhz,现在测试io中断是70多us.不应该这么慢啊。4M完全也够了。是不是还哪里没有配置好呢。还是说,我配置完io只要能响应中断的话,就应该代码没问题了???还是说m3核IO对于我这个8us一个周期的中断,响应不过来啊。确定是m3核的io反应不过来嘛????如果是这样,那我就得去啃sensor controller这个了。
fghj dfghjk:
回复 Kevin Qiu1:
还有我测试了,IO输出5us翻转led灯,也是OK的啊。说明IO口输出速率还是很不错啊。至于中断输入io响应慢还有没有其它可能的问题?????