大家好、
我一直在尝试从 ADS1274EVM 接收 SPI 信号到 TM4C1294XL。 为此、我已将来自 ADC 的/DRDY 信号的下降沿配置为微控制器的中断(GPIO 端口 F)。 在执行此操作时、我发现延迟非常大、即6-7us、而它应该在1us 附近(120MHz 系统时钟的12个周期)。 我还将中断优先级设置为最高、尽管它不应产生影响、因为 GPIOF 中断是我定义的唯一 ISR。 我的代码如下所示、如果有人有任何建议、我将不胜感激。 下面给出了我的逻辑分析仪的一些代码片段和输出。
为中断设置 GPIOF:
// DRDY 反转的引脚 F4设置 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF); //启用端口 F GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_0);//初始化 PF0作为输入 //中断设置 GPIOIntDisable (GPIO_PORTF_BASE、GPIO_PIN_0); //为 PF0禁用中断(如果已启用) GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_0、GPIO_FALLING_EDGE); //为下降沿触发配置 PF0 GPIOIntClear (GPIO_PORTF_BASE、GPIO_PIN_0); //清除 PF0的挂起中断 GPIOIntRegister (GPIO_PORTF_BASE、GPIOPortFIntHandler); //为端口 F 注册 ISR IntPrioritySet (INT_GPIOF、0); //设置中断优先级 GPIOIntEnable (GPIO_PORTF_BASE、GPIO_PIN_0); //为 PF0启用中断
我的 GPIOF 中断服务例程
//中断服务例程(ISR)或中断处理 程序 void GPIOPortFIntHandler (void) { //清除 GPIO 中断 GPIOIntClear (GPIO_PORTF_BASE、GPIO_INT_PIN_0); //逐个填充缓冲区元素;收集64位 SSIDataPut (SSI1_base、DummyData); SSIDataGet (SSI1_base、&pui32DataRxBuffer[0]); //获取前16位[111:96] SSIDataPut (SSI1_base、DummyData); SSIDataGet (SSI1_base、&pui32DataRxBuffer[1]); //获取第二个16位[95:80] //为2个通道添加下面的块 SSIDataPut (SSI1_base、DummyData); SSIDataGet (SSI1_base、&pui32DataRxBuffer[2]); //get 第三个16位[79:64] SSIDataPut (SSI1_base、DummyData); SSIDataGet (SSI1_base、&pui32DataRxBuffer[3]); //获取第四个16位[63:48] //为3个通道添加下面的块 SSIDataPut (SSI1_base、DummyData); SSIDataGet (SSI1_base、&pui32DataRxBuffer[4]); //get 第五个16位[47:32] //为4个通道添加下面的块 SSIDataPut (SSI1_base、DummyData); SSIDataGet (SSI1_base、&pui32DataRxBuffer[5]); //获取第六个16位[31:16] SSIDataPut (SSI1_base、DummyData); SSIDataGet (SSI1_base、&pui32DataRxBuffer[6]); //get 第七个16位[15:0] //合并和连接元素以获取通道1和2 pui16DataRx0[计数器]=((uint16_t)(pui32DataRxBuffer[0])<< 1)|((uint16_t)(pui32DataRxBuffer[1])>> 15); //pui16DataRX1[计数器]=((uint16_t)(pui32DataRxBuffer[1])<< 9)|((uint16_t)(pui32DataRxBuffer[2])>> 7); //pui16DataRX2[计数器]=((uint16_t)(pui32DataRxBuffer[3])<< 1)|((uint16_t)(pui32DataRxBuffer[4])>> 15); //pui16DataRx3[计数器]=((uint16_t)(pui32DataRxBuffer[4])<< 9)|((uint16_t)(pui32DataRxBuffer[5])>> 7); //计数器更新 if (counter < input_vector_size - 1){counter++;} //递增计数器,只要它低于4999 否则{COUNTER = 0;} //如果计数器为4999、则将计数器重置为零 while (SSIBusy (SSI1_base)){} }
逻辑分析仪输出