编写ST单片机程序得注意I/O赋值问题
作者:相逢萍水 日期:2011-12-09
最近把ATMEL的单片机换成了ST的,一切看起来还比较顺利。
不过前几天写的一个程序出现了问题,程序时不时的会自动复位。
这个问题我查了三天都没有查出什么问题,不过到昨天,问题点被我找出来了!!
问题的原因及解决方法如下:
这个程序我需要在定时器中改变I/O口的输入输出方向,就是同一Pin上的脚一会设置为输入,一会要设置为输出口,当设置为输出时,我把CR2对应的输出速率设置为10Mhz。
从上面讲的看起来似乎没什么问题,但程序运行一会后复位(这个复位是看门狗超时引起)。光从程序复位来看,一定会以为程序哪个地方写得不对,程序跳转不对,进入了死循环。一开始我也这么认识,把程序从头看到尾都没找到这个地方,实在是想不明白哪会有问题。
实在没办法后,借来仿真器,一步步执行看程序,最后定位在定时器中断里改变DDR值后,还没来得及更改CR2寄存器,程序就进入了引脚的外部中断去了,而我又没用到外部中断,没有处理程序,因此程序就反复进入这中断直到看门狗复位程序。
问题解决办法:
1.把没用到的中断优先及降到最低,使它没机会执行。这个是最好的我觉得。
2.如果中断优先寄存器你不想去改变,保持默认值,那你把CR2的摆率不要设10M,用2M就可以了。
3.如果你CR2要用到10M的摆率,那你在改变DDR前,先把CR2对应的值设为0
通过上面三个中的一个,你就可以解决问题
不管你用C还是汇编,如果你需要经常切换I/O口的方向,那么你就得注意这个问题。
写程序,建议把没用到的寄存器稍微处理下,保持默认值在某些情况下可能会出现问题,还是小心为好啊!
评论: 0 | 引用: 0 | 查看次数: -
发表评论


上一篇:
下一篇: 这是最新的一篇日志
文章来自:
Tags:
相关日志: