我们提供安全,免费的手游软件下载!
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是 i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题探析 。
前段时间有一个 RT1052 客户反馈了一个有趣的问题。他们设计了一个带 LCD 屏交互的应用,应用以官方 SDK 里的 lvgl_demo_widgets_bm 例程为基础。当客户在这个例程基础上增加了 GPIO 输入边沿中断检测,并且硬件上给 GPIO 增加了 RC 延时电路后,发现边沿中断触发得不太准确。这是怎么回事?今天痞子衡带大家还原现场:
客户做得硬件改动很简单,在 GPIO_AD_B1_04 引脚和 GPIO_AD_B1_10 引脚之间加了如下的 RC 延时电路。GPIO_AD_B1_04 上产生得是 500Hz 的方波,这个方波经过 RC 电路之后输出给 GPIO_AD_B1_10。代码改动也足够简单,只需要在 \SDK_2_15_000_EVKB-IMXRT1050\boards\evkbimxrt1050\lvgl_examples\lvgl_demo_widgets_bm 工程里添加 test_gpio_irq() 函数调用即可。
如果 GPIO_AD_B1_10 边沿中断检测无误,那么输出的 GPIO_AD_B1_11 信号应该是和原始输入 GPIO_AD_B1_04 完全同频的方波。然而,客户用示波器抓到的 GPIO_AD_B1_11 信号偶尔会出现边沿中断误触发的情况,而更有趣的是,这样的测试仅在 lvgl_demo_widgets_bm 工程里能复现,而在普通 input_interrupt 工程下没有任何问题。
- Note1:在 lvgl_demo_widgets_bm 工程下出现的 GPIO 边沿中断误触发问题仅在增加 RC 电路时存在。
- Note2:在普通 input_interrupt 工程下即使增加 RC 电路,GPIO 边沿中断误触发问题也不存在。
为了从软件角度抓到这个中断误触发现象,痞子衡稍微改了一下代码,将 GPIO_AD_B1_04 上信号改为软件输出,并且用了两个计数器来分别记录 GPIO_AD_B1_04、GPIO_AD_B1_10 边沿次数。如果边沿中断触发无误的话,这两个计数器的值应该是永远相等的,但是实际跑了一段时间后发现两个计数器的差距会越来越大,这说明边沿中断误触发现象是一直存在的。
罪魁祸首是 RC 延时电路,它将标准的方波上升、下降过程变得平缓,导致信号电压处于临界区的时间变长,这可能会影响 GPIO 电平跳变判定。我们根据 RC 延时电路标准时间常数公式 t = RC * ln ((V1-V0)/(V1-Vt)) 来推算。如果 NVCC 为 3.3V,那么上升沿时从 0V 充电到 2.31V 的时间是 12us,对于 500Hz 的方波来说,这个 12us 充电时间不足以影响其跳变判定。为了抓住异常边沿中断发生时,GPIO_AD_B1_10 信号当时的波形状态,我们可以再修改一下边沿中断处理函数代码。
如果用示波器以 GPIO_AD_B1_11 跳变为触发信号(ch2),即能看到案发现场 GPIO_AD_B1_10 状态(ch1),确实我们看到充放电时间内出现了短时脉冲波干扰(glitch),这个脉冲导致了电平变化不是单调的,因而产生了 GPIO 中断误触发。下一篇我们会具体分析这个 glitch 是如何产生的。
文章会同时发布到我的博客园主页、CSDN主页、知乎主页、微信公众号平台上。
微信搜索" 痞子衡嵌入式 "或者扫描下面二维码,就可以在手机上第一时间看了哦。
热门资讯