自定义P0口中断与协议栈按键中断冲突
我用P0.0口接收传感器A的中断信号,自定义了一个中断服务程序HAL_ISR_FUNCTION(P0_ISR,P0INT_VECTOR)。
然后把hal_key.c里的HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )注释掉;hal_board_cfg.h里#define HAL_KEY TRUE改成FALSE
结果是传感器中断能正常工作,可是按键全部无效了。。
其实很不解,因为按键我又没开中断,默认用的轮询,为什么只注释掉按键的中断程序不行还要改宏定义?
另外,P1口我拿来接受另一个传感器B的中断信号,而且0.1s就来一次,会严重干扰传感器A的工作,所以只好用P0口。怎样才能用P0接收A的中断同时保证按键有效呢?
再加一点,因为上面的宏定义禁用了按键,所以我全局搜索了HAL_KEY == TRUE,把条件判断的都改成HAL_KEY == FALSE。果然按键又能用了。我本认为这样按键和传感器就能同时工作了,但是但是P0.0中断还是不行,求解答,谢谢!
我觉得尽量少去改协议栈里的东西,有什么东西要用的,,直接加宏开关,就好了。。协议栈的代码关联很多,不建意去修改。。使用时尽量用协议栈没有用到的外设,IO 。后面调试,直接关点协议栈的开关就可以了。这是我的使用经验
谢谢!目前问题已经解决。其实我的IO和协议栈是没有冲突的,还是一些小细节没有注意。做法是:
1.注释掉hal_key.c里的HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
2.在router.c里写自己的中断服务程序,但是名称必须和1中一样,我师兄说可能中断向量表都已经定死了,不一样就进不去,这个倒不是很清楚
3.必须在Onboard.c里修改InitBoard()函数,使能按键中断。起初以为,因为协议栈默认的是按键轮询,不会用到中断。一直调不出来,最后试了步骤2和3,竟然就好了。