本人用STM32F103V8做的一个项目,做RF模块无线通讯,方法是RF模块接收到一帧数据后产生一个中断信号通知STM32把数据抄出来。现在问题是,我直接在中断里用IO口模拟SPI通讯(非标),读完后才退出中断,会造成系统复位,而置个标记在主循环里读数据(软中断)却不会造成复位(读取不实时,项目中不能用此方案)。造成复位的原因是RF模块的那个中断脚来了无数中断信号。而这个现象(RF模块的那个中断脚来了无数中断信号)的原因是同一个电源插头上有继电器控制的负载在频繁启动(我这里用的继电器控制60W白炽灯)。 以上是遇到的情况,个人有些不解的地方,望指点: 同样的程序和环境,在主循环里操作没问题,在中断里会出错。 干扰源插在同一个插座上有问题,插在别的插座上没问题。(系统用的开关电源模块) 用定时器定时读数据也没问题,在中断里读不行。 |
RE:在线急等,中断里操作IO口跟主循环里操作差异
回复:在线急等,中断里操作IO口跟主循环里操作差异
发生这样的问题可能是由于中断标志位未及时清楚,而导致循环进入中断。建议进入中断以后,先清除标志位。还是建议使用SPI模块来接收数据。SPI也有中断接收功能。
void EXTI0_IRQHandler(void)
{
//__DINT();
if(EXTI_GetITStatus(EXTI_Line0) == SET)
{ //RF接收外部中断
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断
//RFFull=1;
Rx_cc1100(); //读RF数据
}
//__EINT();
}
中断进来后就清除了,板子是通过RF数据来控制几个继电器,继电器(无源)不带负载启控不会复位,带负载时就复位,继电器吸合时用示波器看RF中断脚来了一长串方波。正常是收到一帧产生一个、我个人感觉是在中断里操作IO口跟主循环里操作有差异。还有可能就是模拟SPI时序在两个地方不同。
RE:在线急等,中断里操作IO口跟主循环里操作差异
回复:在线急等,中断里操作IO口跟主循环里操作差异
不是被狗复位的,是在中断里操作RF无线模块芯片时,RF模块产生了很多中断信号弄的系统不能正常退出中断而死机的。此主板有几个继电器无源常开的控制负载。就在启动负载时,RF模块产生了很多中断信号,同样的情况下,在主循环里用示波器查看没有。而且同样在中断里操作,继电器不带负载时吸合,从未复位。如果是硬件上的问题,在主循环里读RF数据应该也会死机才对。
RE:在线急等,中断里操作IO口跟主循环里操作差异
回复:在线急等,中断里操作IO口跟主循环里操作差异
中断的机制是进入一个中断以后,不论后面产生的中断是否高于本中断的优先级,都会在执行完本次中断才会进入下一个最高优先级的中断。可能不可能是由于未正确读取到RF数据,而导致的RF输出引脚一直拉低?
谢各位老大的关心,问题解决了,放弃中断,用定时器3MS查询一次。
但用外部中断复位的原因没确认。情况是系统在用继电器启控负载时RF模块出现异常造成的复位。RF模块的SPI通讯是用12CM长的26芯排线和两个牛角插头连接的。应该是EFT过不了的问题。在没办法改动SPI连接线的情况下,还是用定时器安全。改版会在通讯连接线上做EMC处理。