来自远方的感谢--Debug纪实1000pF电容惹的祸

大清早,天微微亮(稍微夸张一点,房间比较暗)。一阵急促的手机铃声将我从睡梦中拉扯出来。机械般的滑动手机界面,喂,您好。喂,你好,我遇到个问题,请帮忙。这个场景,不知道已经重复了多少回了。言归正传,这次的问题,很奇怪。

问题描述:

客户反映,GPIO口中断无法正常的从EM2下唤醒MCU(GG380)。具体描述如下:

1. IAR连机调试的情况下,所有功能测试正常。包括GPIO口唤醒以及LED灯都正常。

2.如果只进EM1低功耗状态的话,即使是脱机运行,也是正常的。

3.如果进EM2,并且脱机运行的话,只要主频高于7MHz,功能就不正常,现象是偶尔能够唤醒MCU,看到的现象就是LED偶尔能够点亮。

奇了怪了,目前为止,还没有发现GPIO口有Bug啊。连机调试的情况下,MCU最多只进EM1,即使是调用了EM2也是不成立的。还有就是为什么还和主频有关系呢??算了,还是从硬件查起吧。

硬件电路:

其实是矩阵式按键扫描的一部分电路,几个GPIO口连接着行信号,几个GPIO口连接着列信号。简化之后,举个例子来说就是列信号的IO口设置为输出0,相对应的行IO口设置为上拉输入。一旦按键按下,则在行IO口上会有一个下降沿跳变。使用示波器测量按键按下时的跳变信号,电压幅值OK,边沿也是十分的锋利。无论是按键引脚,还是直接测量到MCU的IO口上,信号都OK。

软件:

在按键中断里,等待按键是否释放,在等待按键释放的过程中,点亮LED灯。在GG STK上验证过。

void main(void)
{
    CHIP_Init();
   
    CMU_HFRCOBandSet(cmuHFRCOBand_28MHz);
    CMU_ClockEnable(cmuClock_GPIO,true);
   
    GPIO_PinModeSet(gpioPortC, 0, gpioModePushPull, 0);
    GPIO_PinModeSet(gpioPortD, 4, gpioModeInputPullFilter, 1);
   
    GPIO_PinModeSet(gpioPortA, 9, gpioModePushPull, 1);

    NVIC_EnableIRQ(GPIO_EVEN_IRQn);
    GPIO_IntConfig(gpioPortD, 4, false, true, true);
   
    while(1)
    {
        EMU_EnterEM2(false);
    }
}

void GPIO_EVEN_IRQHandler(void)
{
  if(GPIO_IntGet()&(1<<4))
  {
      GPIO_PinOutClear(SYSState_LED_PORT, SYSState_LED_BIT);
      while(!GPIO_PinInGet(gpioPortD, 4));
      GPIO_PinOutSet(SYSState_LED_PORT, SYSState_LED_BIT);
      GPIO_IntClear(1<<4);
  }
 
}

 

确认完硬件电路以及软件之后,在客户的板子上仍然工作不正常,那个LED灯就是不点亮,或则偶尔闪一下。偶尔闪一下,为什么是偶尔闪一下呢,明明是等待按键松开才灭掉的啊。而且按键的电平都是对的啊。。对的啊。。对了,测测LED灯的波形吧。于是用示波器的探针搭在LED引脚上,不停的按按键。嗨,毛刺,按一次,来一次毛刺,而且是低电平的毛刺。为什么会有毛刺呢。难道中断每次都来了,只是马上又退出了?屏蔽在中断中的点亮LED的语句,测量,还是有一样的毛刺。电源不稳? 于是测量3.3V供电,很稳定,不在这里。测量一下Decouple引脚的输出,按一次,再按一次,好像有低电平的脉冲。难道是电容的容值有问题。马上查原理图设计和BOM表。

原来是Decouple引脚上的电容上错了,只上了1000pF,而不是1uF。换上之后,功能终于正常了,脱机EM2下面也能唤醒了。

问题到这里就解决了,回过头来想想,为什么连着IAR或则只进EM1,功能正常,可能是因为连着IAR也相当于只进EM1,而从EM0到EM1,或则从EM1跳回到EM0的时候,电流跳变可能都还处在可以承受的范围,即内部的LDO在1000pF电容退藕的情况下,也还能承受的住。但是从EM2跳回到EM0的时候,电流跳变就比较大了,内部LDO供电不稳,造成MCU内核工作不稳定。这也正好解释了,原先为什么MCU主频在1MHz的时候,功能是正常的,7MHz以上就变得不稳定了,28MHz是几乎不能工作的现象。

看来,下次调试的时候,确实应该先确认MCU最小系统的原理图是否正常开始入手啊。然后确认硬件,再确认软件。而确认软件的时候,刚开始最好是以最小功能模块的形式进行验证。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值