ST芯片烧录失败的原因分析及对策

 

1.SWIM管脚被占用所致的烧录失败:

对于没有RST管脚的芯片,如stm8s001j3m3,一旦在应用中使用了SWIM管脚作为输出或者有中断服务,如果不在写程序时注意在上电时留出SWIM通讯建立时间,或者基于引脚电平检测中断进入SWIM通讯流程,可能在单次烧录之后再也无法下载程序,变成OTP。原因为SWIM协议需要进行通讯握手,然后才能传输数据到芯片内,这在J3M3的数据手册DS12129 Rev 3,14页Recommendation for the device's programming章节内有说明。

 

硬锁定:硬件钳位所致无法烧录:一旦芯片管脚被外围电路限制,无法进入高电平或低电平状态,或者上下方波边缘因电容畸变,则无法进行通讯握手,因此无法进入烧录状态,芯片在安装到板子上以后,无法进行烧录。

 

软锁定:软件设置所致无法烧录:当SWIM脚被设置为输出或者程序内存在中断服务程序时,SWIM通讯无法建立或被中断打断,难以进入烧录状态。表现为芯片烧录一次程序后,再也无法烧录成功,芯片表现为OTP症状。

 

硬锁定解决办法:

 

对于SWIM脚,尽量避免用于其它非烧录功能,如迫不得已,应通过跳线器或零欧姆电阻连接管脚与外周电路,在烧程序时断开管脚与外围电路的连接,烧录完成之后再接通。

 

软锁定解决办法:

  1. 在程序最开始进入等待模式5秒,不进行任何关于管脚输入输出方向的寄存器设置操作。留给烧录动作通讯完成时间。在烧录过程中,必须注意,上电5秒内就得启动软件进行烧录,否则错过之后就得重新上电进行烧录。

 

2.开机过程在程序中对特定管脚进行电平检测,当检测到特征电平时,进入烧录模式。等待SWIM通讯过程完成。如果检测管脚不满足条件,则进入正常运行模式。

 

void Delay(uint32_t nCount)
 {
   while(nCount !=0)
   {
     nCount--;
   }
 }  
/*文件main.c实现示意*/
 
Main()
{
Delay(0x4E200);  //延时5秒,允许烧录窗口,过时必须重新上电趁机烧录。
 
chip_config();  /*寄存器初始化,包括时钟频率设置,看门狗中断,管脚属性等等*/
app_Init();  /*应用初始化*/
While(1)
{
app_cycle();  /*应用实现*/
}
 
}
  1. 烧录时,必须使用3.3V电压供电,如果使用5V作为烧写接口的VDD,可能会出现烧录失败现象。

 

  1. 烧录失败的原因之一,为不合格的杜邦线,线芯过少过细造成线阻压降过大,导致烧录失败。

 

  • 烧录失败的另一种可能,为电脑USB口供电能力不足,此时需要更换具有较大电流驱动能力的USB口作为接入口,建议使用机箱后部主板直接引出的USB口。如果仍然电流不足,可以并联另一路USB口的VDD与GND,联合给芯片供电。

 

7.有时提示没有发现连接的设备,此时需要从USB口拔出STLINK,然后重新插入进行连接,再烧录或可成功。

本文得到了赛耐比光电(www.snappy.cn)蔡工(cailijunzj)的指导。

BTW. 欢迎加入嵌入式系统信息交流群,每日分享技术与文化杂文5~50篇不等口味轻重不一,