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后,立即见效!!!
哈哈,程序开始稳定地运行了...
看来违法乱纪的事情还是少做为妙...
正文
ARM中的IOPIN控制IO输出用IOPIN的惨痛教训2008-10-21 10:26:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/niao0311/38996.html
阅读(3439) | 评论(1)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论