正文

ARM中的IOPIN控制IO输出用IOPIN的惨痛教训2008-10-21 10:26:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/niao0311/38996.html

分享到:

PHILIPS不建议采用IOPIN控制IO,主张用IOSET或IOCLR.
感觉确实不方便,特别是在IO翻转时,肯定用Px->IOPIN ^= (1 << IOx)比
if (Px->IOSET & (1 << IOx)) Px->IOCLR = (1 << IOx);
else Px->IOSET = (1 << IOx);方便和快捷.

一般不会出现问题情况...(软件仿真都不会出现问题!!!)

但通过这2天的产品开发,发现用其IO翻转时,会清除其他IO...

例:(前天出现没在意,认为不可能连续2行这样的语句)
Px->IOPIN ^= (1 << IOx1);
Px->IOPIN ^= (1 << IOx2);
发现IOx1得不到翻转.

Px->IOPIN ^= (1 << IOx2);
Px->IOPIN ^= (1 << IOx1);
发现IOx2得不到翻转.

注意: 2个IO一高一低翻转无事!!!

改为:
if (Px->IOSET & (1 << IOx1)) Px->IOCLR = (1 << IOx1);
else Px->IOSET = (1 << IOx1);
_delay_loop_(1);//1uS
if (Px->IOSET & (1 << IOx2)) Px->IOCLR = (1 << IOx2);
else Px->IOSET = (1 << IOx2);
IOx1,IOx2都可翻转.

今天又出现了:
//    WDPORT->IOPIN ^= (1 << WDI);//不敢用!!!应该换成下列2行
    if (WDPORT->IOSET & (1 << WDI)) WDPORT->IOCLR = (1 << WDI);
     else WDPORT->IOSET = (1 << WDI);

发现用IOPIN翻转P0.31被莫名其妙地清零!!!

想自己还是菜鸟,还是请教老鸟,但老鸟加了上拉电阻...
当时虽知道P0.31可作为只出的IO使用,通过现象怀疑是开漏输出(晕菜)...
加上拉及小电容都未果!!!
检查了所有操作P0.31的地方,只有初始化一处!!!

后来就想可能与前天IOPIN翻转IO有关,改成IOSET或IOCLR后,立即见效!!!

哈哈,程序开始稳定地运行了...

看来违法乱纪的事情还是少做为妙...

阅读(3319) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册