This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于输入输出引脚检测的一个奇怪的问题

Other Parts Discussed in Thread: TMS470MF06607, HALCOGEN

HI RENTON:

          最近在用TMS470MF06607板子的时候遇到一个奇怪的问题,比如这样一段代码if(gioGetBit(gioPortA,5) == 1){.....}对一个IO口进行检测,此段代码在DEBUG下运行完全没有问题,但是在非DEBUG状态下,就是给板子重新上电之后,得到的检测结果为0,就不是1了,非常奇怪。请老师赐教。谢谢。

  • Hi Wei,

       不用这么客气,咱们共同讨论学习嘛。

       但从现象来看的话,比较难确定原因。

       比如,比较的是全局变量,而全局变量又是在定义时给定的初值。

       这种情况下,如果没有上电初始化全局变量初值,那么这个值是不确定的,很有可能是0(上电后有RAM清除操作。)

       如果是这种情况,建议不在全局变量定义时赋值,而是在进入函数后进行变量赋值操作。

     

        也有可能是按键抖动问题,可以尝试加入延时判断或者滤波。

     

        PS: if(gioGetBit(gioPortA,5) == 1){.....} 的写法不建议使用哦,最好是用"左边比较"(left-hand comparison), 即if(1 == gioGetBit(gioPortA,5)){.....} 

  •   谢谢,经过检查发现是IO口上拉配置的问题,但是还是奇怪为什么在DEBUG的时候就行,在重新上电的情况下就不行呢。

  • IO口上是浮动电平吗?

  • 是一个霍尔传感器用的那个脚。

  • 那霍尔传感器的输出是否是开漏的?

  • 你好,我在测试GIO的时候,也遇到了这样的问题。程序实现的是在GIOB[1]  或GIOB[0]检测到高电平(3.3v)输入的时候,执行闪灯。

    在DEBUG下正常,能够闪灯,但是在实际中 却没有闪灯。

  • Hi ml0943,

        你的意思是:

        这段代码在调试时全速运行,可以闪灯,但是拔掉调试器,重新上电运行,板子不会闪灯。

        是这个意思吗?

        如果是的话,可以尝试做以下实验:

        1. 在main函数的while(1)中做一个无条件的闪灯操作,然后下载到芯片中,非调试环境,看一下是否闪灯,

            如果正常,那么说明main函数运行正常,问题应该出在你的判断条件上。

            如果不正常,说明main函数没有正常运行,可能的问题是HALCoGen配置时,打开了安全相关功能,导致一些异常。(HALCoGen代码中默认的异常处理是死循环,也就是说main根本进不来...)

            这样的话,请使用我另一个帖子中提供的sys_startup.c来代替工程原有的sys_startup.c。

            http://www.deyisupport.com/question_answer/microcontrollers/hercules/f/70/p/21465/72655.aspx#72655

        2. hetPORT1->DSET |= (1<<PIN_HET_28);的写法不推荐。

            主要是因为这个"|="操作,这个操作被认为是有风险的操作(Read--> Modify--> Write)。

            对于DSET寄存器和DCLR寄存器,只需要写hetPORT1->DSET = (1<<PIN_HET_28);即可。

            详情请参考技术手册上的关于这个寄存器的说明。

  • 你好,在while(1)中执行闪灯程序,在非调试模式下,闪灯正常。那就是判断条件的问题?

    还有一个奇怪的现象是:单步调试中,GIOA[6]接收到高电平,开始闪灯。观察寄存器GIODINA的GIODIN6=1;但是在给GIOA[6]输入低电平后,在单步调试中按F10观察,程序一直在while(1)循环中,但是此时的寄存器GIODINA的GIODIN6=1,这就不明白是怎么回事了?

    while(1)

    {

    uint32_t i=0;
    for(i=0;i<10;i++)
    {
    LED8_ON();
    wait(200000);
    LED8_OFF();
    }

    uint32_t j=0;
    for(j=0;j<20;j++)
    {
    LED28_ON();
    wait(200000);
    LED28_OFF();
    }
    }

  • Hi ml0943,

         确认引脚输入电平为低了吗?

        另,我看你用的是uVision吧,你是如何观察的寄存器值呢?这个环境是否可以自动刷新寄存器显示状态?

        

  • 我用的是IAR,在view --->register里 观察的

  • 那么是如何对引脚电平进行操作的呢?

  • 是通过N2HET的引脚的输出,经过一个锁存器,输入到GIO引脚

  • 那要先确认一下HET的输出是否正确了~

    请使用示波器观察一下引脚状态。