用DC直流源给io{输入模式,下拉}一个3.3v的上升沿,进入外部中断后翻转另外一个IO口。
离谱的是:我关掉DC源也就是下降沿也能进入中断。运行过程中没有看到PD寄存器那里清除。为啥啊,求求大佬们教教我解决方法。
在嵌入式驱动开发中会存在以下场景:
多个任务都有使用串口发送数据的需求,或者多个任务都有EEPROM数据存取的需求。下面以串口数据发送为例来展开论述。
串口发送一般有三种方案:
DMA方案:使用DMA发送,每次发送前都必须检查DMA是否空闲;然而有的任务是有严格的执行周期的,不能随便阻塞下来等DMA空闲。
中断方案:使用发送中断,在每个串口发送中断中检查发送缓冲区中是否存在未发送数据,如果存在,就在中断中继续发送;该方案需要建立一个发送缓冲区,和一套发送缓冲区管理机制;该方案的缺点就是中断太多,效率比DMA低很多;优点就是:只要缓冲区有空间,都可以直接启动发送,而不用理会当前串口是否空闲;
阻塞方案:将数据一个个发送,每发送一个字节前都必须检查串口发送是否空闲;该方案应用场景很少,主要是因为效率太低了。
示波器看看是不是关的时候有毛刺
建议你先用按键模拟一下上升沿触发中断,看下代码能不能正常运行。如果可以的话再考虑是不是DC电源的问题,有可能是电源不稳定有毛刺触发了。
这个一般是硬件问题,示波器看下断电时候的波形
看看代码片段,是不是不能这么玩呢
单片机反复进入上升下降沿中断 原因以及解决方法
可以参考这个例子
应该是有毛刺
用示波器测试一下是否有毛刺现象
出现这种情况可能是因为你的外部中断没有被正确配置。在配置外部中断时,需要确保中断触发条件和中断使能位都正确设置。
或者尝试在主程序中手动清除中断标志位,或者检查PD寄存器是否被正确清除
检查一下配置参数是否正常
检查一下电源是否正常
在STM32中,外部中断触发模式可以配置为上升沿触发、下降沿触发或边沿触发。根据你的描述,你将外部中断配置为上升沿触发,但在下降沿时也能进入中断,这可能是由于以下几个原因造成的:
外部信号干扰:可能存在外部信号干扰或电气噪声导致IO口引脚状态发生变化,进而引发中断。这种情况下,你可以通过增加抗干扰电路,使用滤波器或者增加硬件稳定性来解决。
中断引脚设置错误:请确保你正确配置了外部中断引脚相关的寄存器,例如设置了GPIO引脚为输入模式、下拉等等,并且选择了正确的中断线和优先级。
中断处理函数问题:检查一下你的中断处理函数是否正确编写。确认在进入中断时是否有执行错误的代码导致程序异常。
编译优化问题:如果你的代码中存在编译器优化选项,可能会对中断处理造成影响。你可以尝试关闭优化选项,或者使用volatile修饰相关变量来避免编译器优化。
如果你已经排除了以上问题,请提供更多的代码细节,特别是初始化和配置相关的代码,以便更准确地找出问题所在并提供解决方法。
引用GPT回答:
首先,对于外部中断的触发,通常有两种方式:边沿触发和电平触发。边沿触发分为上升沿触发和下降沿触发,在你的情况下,应该是选择了上升沿触发。
在对IO口进行上升沿触发的时候,你使用了DC直流源来提供3.3V的信号。但是在你关掉DC源(即下降沿的情况下),仍然能够触发中断,可能有以下几个原因:
电压下降不是很快:关闭DC源后,信号的下降时间较长,导致IO口电平在下降时仍然处于临界区,被误认为是上升沿触发。可以尝试在关闭DC源时,确保IO口电平迅速地下降到低电平。
噪声干扰:关闭DC源后,在IO口电平下降的过程中,可能受到噪声或其他干扰信号的影响,导致IO口电平在下降时波动,被误认为是上升沿触发。可以考虑添加适当的滤波电路或者增加信号的稳定性来减少噪声干扰。
硬件问题:检查一下硬件连接是否正确,确保IO口与DC直流源之间连接良好,没有松动或接触不良的情况。
另外,关于PD寄存器的清除问题,需要看具体的MCU芯片和引脚配置。有些芯片的外部中断触发后,需要手动清除相应的中断标志位或寄存器以允许下一次中断触发。请确认一下对于你使用的具体芯片,是否有相关的中断标志位或寄存器需要手动清除。
结合gpt:
我的分析如下:
通常由GPIO端口的引脚触发,可以设置为上升沿、下降沿或双边沿触发(这个是肯定可以的,我用过)。
可能原因如下:
1.外部中断触发条件设置错误:如果您设置了双边沿触发,那么无论是上升沿还是下降沿都会进入中断。您需要检查您的外部中断触发条件是否正确,如果只想响应上升沿,那么就只设置上升沿触发。
2.外部中断清除标志位未执行:如果您在进入外部中断后没有清除对应的挂起位,那么就会导致下次进入中断时无法识别真正的触发源。您需要在外部中断服务函数中执行清除挂起位的操作,通常是在挂起寄存器(EXTI_PR)的对应位写1。
3.外部中断存在干扰或抖动:如果您的DC直流源或GPIO引脚存在干扰或抖动,那么就可能导致误触发外部中断。您需要检查您的电路是否稳定,是否有接地、去抖等措施。(你最好用示波器打一下这个下电过程,不要轻易怀疑stm32芯片问题)
基于bing、GPT部分内容和本人思考总结:
根据你的描述,你使用了一个DC直流源给一个IO口提供上升沿信号,并通过外部中断来触发另一个IO口的翻转。然而,你意外地发现在关闭DC直流源(即下降沿)时也会触发外部中断。
这可能是因为晶片内部电路设计或其他因素导致的。尽管你关闭了DC直流源,但由于电路中储存了能量,IO口仍然保持了一段时间的高电平状态,从而触发了外部中断。
此外,检查PD寄存器可能不会显示清除的原因是,该寄存器可能只负责控制内部上拉/下拉电阻的使能,而不涉及IO口的实际电平状态。
如果你希望在关闭DC直流源时确保没有进入中断,可以考虑添加适当的电平转换电路或使用其他手段来确保IO口在下降沿时稳定地转为低电平状态。
请注意,具体的解决方案和操作可能会依赖于你使用的硬件平台和开发环境。建议参考相关文档、datasheet或咨询硬件制造商以获取更准确的帮助和指导。