编写ST单片机程序得注意I/O赋值问题



最近把ATMEL的单片机换成了ST的,一切看起来还比较顺利。

不过前几天写的一个程序出现了问题,程序时不时的会自动复位。

这个问题我查了三天都没有查出什么问题,不过到昨天,问题点被我找出来了!!

问题的原因及解决方法如下:

这个程序我需要在定时器中改变I/O口的输入输出方向,就是同一Pin上的脚一会设置为输入,一会要设置为输出口,当设置为输出时,我把CR2对应的输出速率设置为10Mhz。

从上面讲的看起来似乎没什么问题,但程序运行一会后复位(这个复位是看门狗超时引起)。光从程序复位来看,一定会以为程序哪个地方写得不对,程序跳转不对,进入了死循环。一开始我也这么认识,把程序从头看到尾都没找到这个地方,实在是想不明白哪会有问题。

实在没办法后,借来仿真器,一步步执行看程序,最后定位在定时器中断里改变DDR值后,还没来得及更改CR2寄存器,程序就进入了引脚的外部中断去了,而我又没用到外部中断,没有处理程序,因此程序就反复进入这中断直到看门狗复位程序。


问题解决办法:

1.把没用到的中断优先及降到最低,使它没机会执行。这个是最好的我觉得。

2.如果中断优先寄存器你不想去改变,保持默认值,那你把CR2的摆率不要设10M,用2M就可以了。

3.如果你CR2要用到10M的摆率,那你在改变DDR前,先把CR2对应的值设为0

通过上面三个中的一个,你就可以解决问题


不管你用C还是汇编,如果你需要经常切换I/O口的方向,那么你就得注意这个问题。

写程序,建议把没用到的寄存器稍微处理下,保持默认值在某些情况下可能会出现问题,还是小心为好啊!











上一篇: 二进制乘法原理
下一篇: 这是最新的一篇日志
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 编程
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭