如何设计一个在线烧录方案?
[导读]在线烧录,芯片先贴在PCB板上后,再对其进行烧录。由于在线烧写的灵活性(产品先生产出来后,可根据用户订单,临时烧录不同的固件)、易返工性(直接在板重新烧录),越来越多的工厂选择了在线烧录的方案。由于每款目标板
在线烧录,芯片先贴在PCB板上后,再对其进行烧录。由于在线烧写的灵活性(产品先生产出来后,可根据用户订单,临时烧录不同的固件)、易返工性(直接在板重新烧录),越来越多的工厂选择了在线烧录的方案。
由于每款目标板存在各种差异性,烧录环境参数不统一,导致烧录出现异常以及达不到需求效果。那么,如何设计一个更合理的在线烧录放案?以下罗列了几个注意事项。
1、选择合适的烧录通讯协议
一款芯片,可能同时支持几种烧录通信协议,基于每种协议的特点,根据需求,在目标板预留一个或多个烧录通讯协议接口。以LPC1517为例,可以支持SWD、UART烧录通讯协议。其中,SWD通信速率能达到6M以上,而UART模式只能支持115200 的波特率(相比之下,SWD速率大约是UART的52倍)。更快的通讯速度,将减少烧录时间,提高烧录生产效率,如果追求烧录速度,首选SWD。但当芯片加密后,芯片杜绝编程器通过SWD访问芯片,这时只能通过UART模式擦除解密。一般产品出产后,芯片都配置成加密模式,后续产品升级、维修需要重新烧录固件时,由于芯片已处于加密模式,故不能再用SWD模式烧录,只能采用UART模式。因此,应根据具体情况,预留对应的SWD或UART烧录接口。或者两种都预留,SWD模式接口用于量产烧录,UART用于维修、升级时单次烧录。
2、预留禁能看门狗的接口
为了避免芯片程序跑飞或进入死循环状态,目标板一般都会放置外部看门狗,有效保证整个系统稳定运行。但是,如果芯片正处于烧录状态,由于没有喂狗,看门狗将计数溢出并复位目标芯片,意外中断了当前的烧录工作。为了避免以上异常情况,目标板应预留禁能看门狗的接口。当芯片烧录的时候,通过一个跳线,禁能看门狗,杜绝烧录时芯片被看门狗复位。如图1所示,目标板预留了禁能看门狗接口。
图1 禁能看门狗接口
3、烧录接口是焊盘测试点还是接线座
图2为焊盘测试点和普通烧录接线座的对比。如果生产烧录量很大,为了提高烧录效率,可以配合夹具和自动机,进行自动化的烧录。夹具一般都是配合顶针一起使用的,故需要在目标板预留焊盘测试点,以便烧录信号线的顶针与目标板接触;而如果生产烧录量偏小,则可以人工手动拔插烧录接口。
图2 焊盘测试点和普通烧录接线座的对比
4、引出芯片复位管脚
有时候,出于节省PCB空间考虑,设计烧录接口时会省掉复位管脚,但这有可能导致烧录不稳定。烧录前,先复位芯片,可以给芯片烧录提供一个纯净的初始化环境,避免芯片已跑有代码时,影响后续的烧录。此外,烧录前先复位芯片,还可以避免上电瞬间烧录信号线电平的抖动,使得芯片误采集到握手信号,导致烧录通信握手失败。因此,为了保证烧录的稳定性,烧录接口需引出复位管脚。烧录器烧录芯片前,利用复位管脚先复位芯片,使芯片处于一个纯净的初始化状态,有效保证芯片烧录的稳定性和有效性。
图3 引出复位管脚
以上只是罗列了常见的几种情况,但由于在线烧写目标板的差异性,设计PCB板时应该根据具体的芯片,配合你选择的烧录器特性,设计一个合理的方案。
/**********************wdt fuction**********************************************************************/
#define WDT_OPEN 1
#define IS_DEBUG (0)//NOTE:1)在线debug程序,须先禁掉看门狗,否则超时复位重启;2)keil在线烧录,烧录期间未能及时喂狗则会复位重启,导致烧录失败
void wdt_init(void)
{
uint8_t u8Lock;
/************在线debug,禁掉看门狗***************/
#if(IS_DEBUG)
u8Lock = SYS_Unlock();
WDT_Close();
CLK_DisableModuleClock(WDT_MODULE);
SYS_Lock(u8Lock);
#endif
#if(1 != IS_DEBUG) //test wdt timeout reset function
u8Lock = SYS_Unlock();
CLK_EnableXtalRC(CLK_PWRCTL_LXTEN_Msk);//使能无源晶振(无源晶振记得要使能啊,有源晶振则上电自动起振)
CLK_EnableModuleClock(WDT_MODULE);
//CLK->CLKSEL1 = (CLK->CLKSEL1 & ~(3<<0)) | (1<<0);//clk source 32k ==
CLK_SetModuleClock(WDT_MODULE, CLK_CLKSEL1_WDTSEL_LXT, MODULE_NoMsk);//32k CLK_CLKSEL1_WDTSEL_HCLK_DIV2048
SYS_Lock(u8Lock);
WDT_RESET_COUNTER();
WDT_CLEAR_RESET_FLAG();
u8Lock = SYS_Unlock();
/*
WDT->CTL = (WDT->CTL & ~(7 << 8)) | (7 << 8);//8224 ms
WDT->CTL |= 1 << 1;//enable rst
WDT->CTL |= 1 << 7;//enable wdt
*/
WDT_Open(WDT_TIMEOUT_2POW18,TRUE);//8224 ms
SYS_Lock(u8Lock);
#endif
}
void wdt_clear(void)
{
WDT_RESET_COUNTER();
WDT_CLEAR_RESET_FLAG();
}
餐考:http://www.21ic.com/app/analog/201605/676150.htm?_t_t_t=0.20653475700134421