工具/软件:
我的电路包含一个 H 桥电机驱动器和2个接近传感器、目的是使电机沿一个方向移动、直到一个传感器被触发、然后停止电机、然后沿另一个方向移动、直到另一个传感器永久被触发。 传感器处于低电平有效状态。 电机驱动器位于引脚2和3上、接近传感器位于引脚4和5上、所有位于 Porta 上。
接近传感器引脚配置为低电平中断。 中断处理程序函数如下所示:
void pos_sensor_int_handler (){
GPIOIntClear (GPIO_Porta_BASE、GPIO_INT_PIN_4 | GPIO_INT_PIN_5); //清除接近传感器中断
静态 uint32_t 状态;
状态= GPIOIntStatus (GPIO_PORTA_BASE、TRUE); //获得屏蔽中断状态
xQueueSendFromISR (pos_sensor_int_queue、&state、NULL); //将其发送到实际处理事件的任务
}
我按如下方式设置 GPIO:
int main(){
ROM_FPULazyStackingEnable ();
ROM_SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
ROM_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOA);
while (!SysCtlPeripheralReady (SYSCTL_PERIPH_GPIOA)){}
GPIOIntRegister (GPIO_Porta_base、pos_sensor_int_handler);
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTA_BASE、MOTOR_CONTROL_PIN_R | MOTOR_CONTROL_PIN_L); //GPIO 引脚2和3用于控制电机
ROM_GPIOPinTypeGPIOInput (GPIO_PORTA_BASE、POS_SENSOR_PIN_L | POS_SENSOR_PIN_R); //GPIO 引脚4和5是接近传感器
GPIOIntTypeSet (GPIO_Porta_base、pos_sensor_pin_L | pos_sensor_pin_R、GPIO_LOW_LEVEL);
GPIOIntEnable (GPIO_Porta_BASE、GPIO_INT_PIN_4 | GPIO_INT_PIN_5);
}
(省略我认为不相关的代码)
引脚4和5的中断确实符合预期、但问题是我也收到了虚假中断。 使用调试器,我可以看到处理程序函数 pos_sensor_int_handler () 是随机的(而且通常很频繁)被进入,即使这些引脚上没有电平变化。
使用"Register"视图、我可以看到端口 A GPIO 中断屏蔽寄存器(GPIO_IM)正确设置为0x00000030、这是16 (引脚5)和32 (引脚4)的 OR 结果。 当错误中断发生时、GPIO 原始中断状态寄存器(GPIO_RIS)读为0x00000080、表示引脚7上有一个中断、我从未启用过! 因此、我尝试显式禁用引脚的中断:
GPIOIntDisable (GPIO_PORTA_BASE、GPIO_INT_PIN_7);
现在、当发生这 种情况时、GPIO_RIS 只读取全0。 这怎么可能? 端口 A 上的所有中断是否都应该反映在 GPIO_RIS 中? 如何通过 在已启用的引脚上设置低电平以外的任何其他方式进入该中断处理程序?
谢谢你