之前曾经在一个项目中使用STM8S103F3P6单片机,由于管脚较少,所以把一体式红外接收头放在了该单片机的PD1管脚上。我们知道,PD1不仅是一个普通的IO,它还是单片机的SWIM管脚!
当使用PD1管脚进行下降沿红外解码时,发现解码异常。相同的代码,移植到其它管脚之后,工作正常。进一步通过串口打印信息,分析发现定时器时间异常。
定时器中断异常,这种现象其实是很怪的。网上有人说,PD1是SWIM管脚,要做为GPIO使用的话,需要关闭SWIM模式。
但其实这种说法是错误的!
因为本人曾经使用IAR+寄存器方式,使用PD1做红外解码。完全没有任何问题!而这次出现问题,真正的原因是因为:IAR+库函数的方式导致的!
IAR对STM8S的库函数支持有问题,导致的这个现象。解决方法有两个:1、换回寄存器方式开发;2、使用库函数+寄存器方式混编。
我使用的是第二种方式,修改之后,PD1脚工作正常!