打印
[其他ST产品]

IO操作不好使,帮看看哪里毛病

[复制链接]
2986|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pp99sky|  楼主 | 2007-1-11 13:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IO, gp, pi, GPIO, TI
图片是710的P2.12,P2.13,P2.14,P2.15接245的图,配置输出GPIO_Config(GPIO2, 0xF000, GPIO_OUT_PP);
我采用定时中断程序,使它们同时交替输出高低电平,程序如下:
void T1TIMI_IRQHandler(void)
{    static vu8 i;
    if ( TIM_FlagStatus(TIM1, TIM_OCFA) )
    {
        TIM_FlagClear(TIM1, TIM_OCFA); 
        TIM_AddOCMPCounterValue(TIM1, 9375);
        i++;
        if(i==30)
        {

        //GPIO_BitWrite(GPIO2,14,1);
        GPIO_BitWrite(GPIO2,15,1);
        //IO_BitWrite(GPIO2,12,1);
        GPIO_BitWrite(GPIO2,13,1);
        }
        
        if(i==60)
        {
        i=0;
        //GPIO_BitWrite(GPIO2,14,0);
        GPIO_BitWrite(GPIO2,15,0);
        //IO_BitWrite(GPIO2,12,0);
        GPIO_BitWrite(GPIO2,13,0);
        }
       }
}

情况是这样,单独操作这几个IO中的任何一个,都工作正常,同时操作两个及以上,如程序所示,都不好使。
图上245的6,7,8,9脚输出,当操作两个以上脚同时输出时,只有一个脚正常工作,其余的脚保持高电平或低电平不变。我这个上面我测的规律是,当同时操作两个以上时,数字最大的那个脚正常输出,我这几个脚都输出时,6,7,8脚保持以前的电平不变,也就是这么操作没有动作,9脚正常。
如果把那些位操作函数改成字节操作的也是正常输出,就是这个位操作函数用起来不行,是哪里用的不对?
请指点一二,谢谢!
沙发
starm| | 2007-1-11 14:36 | 只看该作者

不用库函数直接为port赋值测试一下

同时设置4个位:

u16 wNewValue;

u16 wTemp = GPIO2->PD;

dwTemp &= 0x0FFF;
dwTemp |= (wNewValue << 12);
GPIO2->PD = dwTemp ;

使用特权

评论回复
板凳
pp99sky|  楼主 | 2007-1-11 14:59 | 只看该作者

字节操作是可以的啊,只是用那几个位函数操作起来不行

使用特权

评论回复
地板
John_light| | 2007-1-11 16:20 | 只看该作者

试着不在ISR中操作

在主程序中试一试,加延时。

使用特权

评论回复
5
pp99sky|  楼主 | 2007-1-11 16:50 | 只看该作者

现在找到以下原因,但还有点疑问

GPIO_Config(GPIO2, 0xF000, GPIO_OUT_PP);
这个我没打开,但是这个配置没打开怎么会出现上面的操作呢?我又反复操作了几次,是那里问题。

唉,搞了半天,没搞明白哪里问题,结果还是自己脑子不怎么好使;前几天也是,有个问题搞了好几天没搞定,后来有天晚上刚躺到床上想到了。身边也无人可问,也只有上网讨教讨教了,希望能得到点灵感。其实刚刚就是看到楼上的一句话,我才看到我那个没打开的。

使用特权

评论回复
6
ST_ARM| | 2007-1-12 10:19 | 只看该作者

to pp99sky

你打开GPIO_Config(GPIO2, 0xF000, GPIO_OUT_PP);操作是否正常?
如果你没有打开上面的设置,GPIO2是上电默认状态:input pull up/pull down,此时GPIO2的输出呈现weak Push-Pull,GPIO2的输出是pull up还是pull down是根据GPIO2的PD口决定的,例如
GPIO_BitWrite(GPIO2,14,1);你设定14脚呈现pull up,此时14脚是高电平,15脚是低电平。
当你运行GPIO_BitWrite(GPIO2,15,1);时,软件代码是先读取PD口的值,然后与0x8000或一下,再写入PD口。

!!!问题的关键是第一次读取PD的数据是来自Input口,读取的数据不是Output口的数据。所以出现你所看到的现象。

使用特权

评论回复
7
pp99sky|  楼主 | 2007-1-12 12:31 | 只看该作者

好的,谢谢了,打开后正常操作了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

43

帖子

0

粉丝